iOS APP之间数据共享与UUID

最近的一个项目,遇到了应用之间数据共享和设备唯一标识的问题。经过多方面的搜索、验证,得到了一些结论。现在总结如下:

一、应用之间共享数据

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,手机型号等、并与本地比较。因为一般用户更换设备后,设备型号都会有所更新,你不要告诉我你升级设备后,用的还是同一型号同一款!

貌似解决了?!!


就上面这些了,我只提供一些思路。目前在我的项目中,也是这样使用的,目前还好,没啥大问题。

欢迎大家提出一些问题,共同探讨、进步!

你可能感兴趣的:(iOS APP之间数据共享与UUID)