关于iOS开发中使用WKWebView拨打电话的问题

在iOS开发中遇到WKWebView点击电话号码无反应的问题,原因是WKWebView默认禁止拨打电话。通过遵循WKNavigationDelegate,使用decidePolicyForNavigationAction方法解决,但发现可以更直接使用UIApplication的openURL方法。然而,openURL已废弃,使用新方法openURL:options:completionHandler在iOS10以下版本可能导致闪退,需要处理版本兼容问题。
今天做公司的项目,发现一个显示电话号码的cell点击后没反应,按照逻辑应该是点击之后弹出拨号界面的,遂前往相关的类里面查看代码,发现上一个人在cell的点击事件里是这样写的:
NSString *phoneStr = [NSString stringWithFormat:@"tel:%@",phone]; 
WKWebView * callWebview = [[WKWebView alloc] init];
[callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:phoneStr]]];
[self.view addSubview:callWebview];

初一看,没啥问题啊,以前加载URL都是这样写的,为什么点击之后没反应呢?

正当我百思不得其解之时,猛然想到一个问题,以前加载URL都是用UIWebView写的,难道是iOS8.0带来的新控件——WKWebView的原因?

于是本着实验的心态,把WKWebView改成UIWebView试了试,居然能弹出拨号的对话框了,看来就是WKWebView的问题了,于是上网查了下WKWebView的特性,果然,是因为WKWebView默认禁止了跳转到appStore, 拨打电话, 唤起邮箱等一系列操作,而这些操作UIWebView是默认支持的。(不知道为什么这么做,难道是为了更安全?)

估计是上一个开发人员响应苹果的号召,积极把UIWebView改成WKWebView,却没想到苹果在WKWebView上放了一个大坑…更坑的是,这个坑还要留给我来解决…

知道了原因,解决起来就简单了,通过查阅资料,找到了一种实现WKWebView拨打电话的方法:

首先遵循WKNavigationDelegate代理:

@interface ViewController ()<WKNavigationDelegate>
callWebview.navigationDelegate = self;

然后调用WKNavigationDelegate的decidePolicyForNavigationAction方法:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    NSURL *URL = navigationAction.request.URL;
    NSString *scheme = [URL scheme];
    UIApplication *app = [UIApplication sharedApplication];
    // 打电话
    if ([scheme isEqualToString:@"tel"]) {
        if ([app canOpenURL:URL]) {
            [app openURL:URL];
            // 一定要加上这句,否则会打开新页面
            decisionHandler(WKNavigationActionPolicyCancel);
            return;
        } 
    }
   }
decisionHandler(WKNavigationActionPolicyAllow);
}

代码运行,电话倒是能正常拨打了,但是我的内心十分复杂…
这…都用到UIApplication了,还用啥WKWebView啊?我直接调用UIApplication的openURL方法不就行了吗?

于是把cell的点击事件里原来的代码全删了,改成:

NSString *phoneStr = [NSString stringWithFormat:@"tel://%@",phone];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
    //设备系统为IOS 10.0或者以上的
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneStr] options:@{} completionHandler:nil];
}else{
     //设备系统为IOS 10.0以下的
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneStr]];

顺利运行,问题解决,收工!

(顺便吐槽一下苹果,上面的代码是有警告的:‘openURL:’ is deprecated: first deprecated in iOS 10.0,意思是UIApplication的openURL方法在iOS10以上的系统已经弃用了,但是我们还是要写上去,为什么呢?因为我在查询资料的过程中发现有人反映推荐使用的openURL:options:completionHandler方法在iOS10以下的系统会闪退,这就有点坑爹了。你苹果不推荐我们使用这个已弃用的方法,但是你新的方法居然不向下兼容?你这是不把iOS10以下的用户当人看啊。行,你不把他们当人看,我们还是要把他们当人的。但是你让我们开发者手动判断版本就算了,你tm还弹警告,我…
…算了算了,我忍了…)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值