今天做公司的项目,发现一个显示电话号码的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还弹警告,我…
…算了算了,我忍了…)
在iOS开发中遇到WKWebView点击电话号码无反应的问题,原因是WKWebView默认禁止拨打电话。通过遵循WKNavigationDelegate,使用decidePolicyForNavigationAction方法解决,但发现可以更直接使用UIApplication的openURL方法。然而,openURL已废弃,使用新方法openURL:options:completionHandler在iOS10以下版本可能导致闪退,需要处理版本兼容问题。
3998

被折叠的 条评论
为什么被折叠?



