iOS[swift]关于ios10(10.2及其以后版本)调用系统打电话的坑

最近梳理项目发现一个问题,在iOS10.2及其以后系统的手机上调用系统打电话这个方法有点不正常, 我们代码如下:

/**
 呼叫客服
 */
func customerService() {
    let alertView = UIAlertController(title: nil, message: CUSTOMER_SERVICE_TEL, preferredStyle: UIAlertControllerStyle.alert)
    alertView.addAction(UIAlertAction(title: "取消", style: UIAlertActionStyle.cancel, handler: nil))
    alertView.addAction(UIAlertAction(title: "呼叫", style: UIAlertActionStyle.default, handler: { (alertAction) -> Void in
        let url1 = URL(string: "tel://\(CUSTOMER_SERVICE_TEL)")
        UIApplication.shared.openURL(url1!)
    }))
    self.presentVC(alertView)
}

这样的代码在iOS10.2以下设备上运行是正常的,但是在iOS10.2及其以上就会弹出两次弹框,查过之后才发现iOS10.2及其以上系统会自动弹出这个弹框不必自己再写弹框,所以原则上只需要判断一下当前手机操作系统版本如果为10.2及其以上直接调用系统方法打电话即可,代码如下:

    if #available(iOS 10.2, *) {
        if let telUrl = URL(string: "tel://\(CUSTOMER_SERVICE_TEL)") {
            UIApplication.shared.openURL(telUrl)
        }
    } else {
        let alertView = UIAlertController(title: nil, message: CUSTOMER_SERVICE_TEL, preferredStyle: UIAlertControllerStyle.alert)
        alertView.addAction(UIAlertAction(title: "取消", style: UIAlertActionStyle.cancel, handler: nil))
        alertView.addAction(UIAlertAction(title: "呼叫", style: UIAlertActionStyle.default, handler: { (alertAction) -> Void in
        let url1 = URL(string: "tel://\(CUSTOMER_SERVICE_TEL)")
        UIApplication.shared.openURL(url1!)
    }))
        self.presentVC(alertView)
    }

但是这样改过之后发现效果并不是自己想的那么美好,恶心的现象发生了: 由于系统自己弹出的弹框出现会有一段等待时间,不像我们自己写的Alert框那样立刻弹出,而是会隔一会才弹出响应,查阅了一下资料貌似是ios10.2以后,这东西会阻塞主线程,所以这样改就完美了:

    if #available(iOS 10.2, *) {
        if let telUrl = URL(string: "tel://\(CUSTOMER_SERVICE_TEL)") {
              DispatchQueue.global().async {
                UIApplication.shared.openURL(telUrl)
            }
        }
        }
    } else {
        let alertView = UIAlertController(title: nil, message: CUSTOMER_SERVICE_TEL, preferredStyle: UIAlertControllerStyle.alert)
        alertView.addAction(UIAlertAction(title: "取消", style: UIAlertActionStyle.cancel, handler: nil))
        alertView.addAction(UIAlertAction(title: "呼叫", style: UIAlertActionStyle.default, handler: { (alertAction) -> Void in
        let url1 = URL(string: "tel://\(CUSTOMER_SERVICE_TEL)")
        UIApplication.shared.openURL(url1!)
    }))
        self.presentVC(alertView)
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,925评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,267评论 4 61
  • 家里新买43寸的液晶电视后,发现其中的电视剧视频有《贫嘴张大民的幸福生活》,所以每天晚饭后的观影成了这一个月里最幸...
    岑飞君阅读 4,833评论 34 135
  • 亦舒曾说过,爱得不够,才借口多多。简直真理,套用过来,你不想做一件事,才会给自己找这样那样的理由。
    木你黑1980阅读 128评论 0 0
  • 你好似在我附近 我感觉到你的存在 可我不敢去找寻你 想接近但又怕打扰 一直躲避假装不在乎 多少次压抑着情感 多少次...
    林子霖子阅读 160评论 0 7