最近的一个项目,遇到了应用之间数据共享和设备唯一标识的问题。经过多方面的搜索、验证,得到了一些结论。现在总结如下:
一、应用之间共享数据
1、URL Scheme
在Info.plist中配置URL Types,通过自定义的协议,来传递数据。特性是APP之间通过协议传递数据,会有一个跳转过程。示例支付宝、微信支付等。
2、UIActivityViewController
iOS 6.0以后,苹果推出的分享视图控制器。特性是弹出系统分享控制器,一般用于分享。
3、Shared Keychain
使用Keychain共享数据,需要开启Keychain Sharing服务,并限于同一供应商(即同一个苹果证书)下的应用之间共享数据。
4、App Groups
iOS 8.0以后,苹果推出了App Groups,使用NSUserDefaults、NSFileManager、NSFileCoordination共享数据,限于同一Group下的应用。
5、UIPasteboard
剪贴板,是应用之间共享文本的一种方式。示例在一个APP中,复制一段文本,在另一个APP中粘贴使用。能跨应用分享数据了,但是限于数据类型、数据量大小,升级系统数据丢失。
二、设备唯一标识
1、UDID
唉,这个iOS 5.0以后被苹果禁用了。
2、UUID
UDID被禁用以后,苹果推出的替代品。但是这个值,同一应用、不同时间调用时,生成的值不一样;不同应用,生成的值也不一样。唯一的优点,每次生成的都是唯一值。
3、MAC
唉,这个iOS 7.0以后也被封杀了。
4、IDFA
全名advertisingIdentifier。适用于iOS 6.0以后,在同一台设备上,所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪 里重置此id的值,或限制此id的使用,故此id有可能会取不到值,而且提交苹果审核时,必须明确指出使用了该值。
5、IDFV
全名identifierForVendor。使用于iOS 6.0以后,在同一设备上,同一供应商的APP取到相同的值,如果该供应商下的所有APP都被删除,该值会被重置。
6、OPEN
网上有很多OPENUDID、OPENIDFA。实现方式为获取手机的型号、系统创建时间、系统磁盘大小等一些系统属性组合在一起,使用MD5模拟生成的类似UDID和IDFA的一串字符串。哟,这个貌似不错,可以不同的应用直接能获得同一值。但是,如果同一型号、同一批次出产的手机,那这个值不就一个样了!!
好了,上面介绍了iOS 应用共享、设备唯一符。现在有一需求:实现不同应用之间(跨供应商,即不同开发者账号)共享登录账号密码,并能对用户是否更换设备进行跟踪。这个该怎么实现?。。?!
辗转反侧,夜夜不能寐。想到以下条件:
1、使用UUID生成设备唯一标识(这个应该不会被苹果禁用);
2、使用NSUserDefaults存储UUID(我们不能每次都去获取UUID啊,不然那还有啥意思);
3、使用UIPasteboard实现跨应用共享文本数据(这个也应该不会被苹果禁用);
4、使用OPEN中提到的手机的型号、系统创建时间、系统磁盘大小等(这个也应该不会被苹果禁用);
上面是条件,下面是方法
1、第一次使用,先从UIPasteboard读取,有值,则读??;没值,则从NSUserDefault中读取。NSUserDefault中有值则读取,并保存到UIPasteboard中;没值,则使用UUID生成唯一值。
2、使用UUID生成唯一值后,保存到NSUserDefault中,保存到UIPasteboard中。
3、第二次使用,如果是跨应用读取,也就是说,第一次我是在A应用中生成的,现在我在B应用中读取。这种情况,如果读取有值,那么要把读取的值,保存到B应用的NSUserDefault中。
上面3步貌似能解决大部分情况的问题了??墒腔褂懈鑫侍?,比如我恢复出厂设置咋办?。。?!
我唯一能给出的答案,用我们强大的网络!
把保存的UUID值,条件中的第4步中的手机型号、系统创建时间、系统磁盘大小等,都在网络上保存一份。每次获取时,从网络获取UUID,手机型号等、并与本地比较。因为一般用户更换设备后,设备型号都会有所更新,你不要告诉我你升级设备后,用的还是同一型号同一款!
貌似解决了??。?/p>
就上面这些了,我只提供一些思路。目前在我的项目中,也是这样使用的,目前还好,没啥大问题。
欢迎大家提出一些问题,共同探讨、进步!