美文网首页
关于iOS开发中使用WKWebView拨打电话的问题

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

作者: Aexsi | 来源:发表于2020-06-24 10:54 被阅读0次
    今天遇到一个显示电话号码的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以下还是得用那个已经弃用的方法,这里可以看出苹果的开发在向下兼容方面也有所欠缺啊- -

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/egalfktx.html