今天遇到一个显示电话号码的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是默认支持的。
知道了原因,解决起来就简单了,通过查阅资料,找到了一种实现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的openURL方法:
NSString *callStr = [NSString stringWithFormat:@"tel://%@",phone];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
//设备系统为IOS 10.0或者以上的
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callStr] options:@{} completionHandler:nil];
}else{
//设备系统为IOS 10.0以下的
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callStr]];
ps:上面的代码是有警告的:'openURL:' is deprecated: first deprecated in iOS 10.0
意思是UIApplication的openURL方法在iOS10以上的系统已经弃用了,但是新的openURL:options:completionHandler
方法在iOS10以下的系统会有闪退的问题,所以在iOS10以下还是得用那个已经弃用的方法,这里可以看出苹果的开发在向下兼容方面也有所欠缺啊- -