我们的App中很多都有用户登录模块,我们的服务端大多数情况下,可能需要统计注册的用户数,那么我们能保证用户的唯一性(同一台手机算一个用户)呢?在iOS6的时候我们可以直接获取设备的MAC地址,然后将这个地址上报给服务器,因为MAC地址不会发生改变,所以是唯一的,在iOS7以后,万恶的Apple公司禁止获取这个地址来做设备唯一标示,你敢用,它就敢跟你翻片。
1、那么问题来了... iOS7以后怎么获取设备的唯一标示?
通过UIDevice类中的方法获取:
[UIDevice currentDevice].identifierForVendor.UUIDString;
但是这个UUIDString并不具有唯一性,应用重新安装,刷机等操作会让它改变,所以不能通过判断设备的唯一标示来确认用户的唯一性。
2、Apple提供了一个开发者账号下的多个App之间相互访问功能,即KeychainAccessGroups,添加KeychainAccessGroups需要做两件事情:
1、在工程目录下创建一个名为“KeychainAccessGroups.plist”的文件。这个plist文件的最顶层的节点必须是一个名为“keychain-access-groups”的Array。每个item对于String的格式也有相应要求,格式为:"AppIdentifier.com.***",其中APPIdentifier就是你的开发者帐号对应的ID, Prefix就是我们想要的。如图:
2、在APP target的bulibSetting里面设置Code Signing Entitlements,添加KeychainAccessGroups.plist文件,将其全路径在Code Signing Entitlements后面,如图:
补充,KeychainAccessGroups.plist文件设置如下:
写在最后,Keychain保存UUID,将第一次安装应用时所生成的UUID保存起来,等到下次用户卸了此应用,再重新安装时会先从keychain中读取这个UUID的串,如果UUID为nil再重现获取,上报服务器,这样就可以保证统计出一个应用真正用户数。如果应该重新安装,也可以将这个重新生成的正确的UUID上报服务器,让服务端重新替换数据库中的UUID。
所使用的Keychain库,可以自己写一个,或者使用第三方的。