iOS openURL卡死问题分析

2023-02-22  本文已影响0人  星星杨

前提:
测试最近测出了一个比较奇怪的问题,反复点击蓝牙跟定位打开设置页面,操作频繁了之后,整个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

上一篇下一篇

猜你喜欢

热点阅读