iOS openURL卡死问题分析

前提:
测试最近测出了一个比较奇怪的问题,反复点击蓝牙跟定位打开设置页面,操作频繁了之后,整个APP就会卡死;

分析:
APP卡死第一反应就是主线程被阻塞,打开xcode调试,果不其然,在openURL的时候,有加信号量锁,而且openURL还是在主线程执行的,所以当open的过程还没有执行完成的时候,再去执行open,当前线程势必会进入无限等待的过程;

image

因为这是之前同事写的模块,通过仔细观察这个东西,再对比我现在使用的方法;

发现调用的API有点不同,果然苹果在很早之前就发现了这个问题,所以在iOS10以后就把这个API给弃用了,新的API采用了异步回调返回执行结果,不用同步等待执行结果完成,这样一来也就避免了主线程卡死的问题;

image
image

以前的做法是开启个异步队列处理也可以解决这一问题:

dispatch_async(dispatch_get_main_queue(), ^{
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
});

总结:被弃用的东西肯定有被弃用的原因,我们也有理由去同步研究新的东西及其修改,与时俱进,方能不被淘汰;

参考:

调用openURL后,iOS 9.3冻结 |

iOS 9.3 freeze after calling openURL

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容