OpenUDID冲突的问题

来源:互联网 发布:桂正和m知乎 编辑:程序博客网 时间:2024/06/06 03:47

苹果在iOS6中禁用了[UIDevice uniqueIdentifier],在iOS7中又把mac地址的获取给堵上了,所以大家想到了使用OpenUDID这个解决方案,毕竟开源,使用方便。


我们的一个SDK中使用了OpenUDID标识设备,使用起来好像一切都很正常,但某一天,产品突然抱怨说,我们的SDK出现crash了:


   这是主线程的崩溃堆栈,从上面的信息来看,是在粘贴版操作出现错误。所以我们首先查找我们的代码,没发现异常,因为这是使用的OpenUDID的源代码;然后又去OpenUDID的官网查看,是否有用户上报这类bug或者解决方案,没有有用的信息;继续去各大论坛搜索,也是一无所获。最后再去把Apple的文档看一遍,查看[UIPasteboard pasteboardWithName]的用法,即使参数传递为nil,也不会出现crash的情况。


从它的说明上看,在使用的时候也没有什么需要注意的地方。后来实在没有找到crash产生的原因,突然想到以前做C/C++开发时,经常遇到的多线程同步的问题,这个crash是不是也是这个原因呢?因为从产品的反馈来看,出现crash的概率很低,几百万出现一两个。所以让产品把其他线程的堆栈也发给我们,如下:


果然,功夫不负有心人,真的发现还有一个线程也在使用OpenUDID的功能,现在基本断定就是这个问题了,我的猜测是,既然[UIPasteboard pasteboardWithName]的参数传递不会出现问题,那么问题就出现里面的实现代码,可能的原因是它的实现是线程不安全的,这只是猜测,无从考证,如果真是这样的话,Apple的文档上应该做一些多线程同步的提示。


所以,果断放弃OpenUDID的使用,直接使用Keychain方式,安全还持久。

0 0