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

今天遇到一个显示电话号码的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 ()
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以下还是得用那个已经弃用的方法,这里可以看出苹果的开发在向下兼容方面也有所欠缺啊- -

你可能感兴趣的:(关于iOS开发中使用WKWebView拨打电话的问题)