我正试图想出一种方法来生成一个独特的iCloud ID,它将在各种设备上相同。我的应用程序将数据存储在一个在线数据库中,我希望将其绑定到iCloud ID。这提供了不必处理登录的良好用户体验(因为所有数据都与他们的iCloud帐户绑定),而不会被使用iCloud的糟糕同步。问题是,据我所知,没有API会给我这种ID。
我尝试/想过的事情:
1)NSUbiquitousKeyValueStore
不起作用,因为价值将在“稍后”更新,即 - 只要Apple感觉像这样。
2)iCloud文档存储
与#1相同的问题,在用户可以手动删除的设备中存储随机文件的额外好处
3)使用[[NSFileManager defaultManager] ubiquityIdentityToken]
因为Ubiquity Token的字节对于任何给定的登录会话都是相同的,我想象可能是跨设备的情况。不是这样的
4)使用地址簿联系
似乎不太可靠(如果他们更改了他们的主要电子邮件/电话号码/姓名会发生什么),加上第一次启动时会让用户烦恼/吓坏的副作用(他们怎么知道我不偷东西他们所有的联系人?)
5)将自己的登录系统连接到远程服务器
这似乎是唯一可用的选项,虽然我更喜欢更好的选择。
提前致谢
答案 0 :(得分:9)
也许现在为时已晚,无法使用,但iOS 8在此提供了解决方案。从WWDC 2014“介绍到CloudKit”会议:
因此,我们所做的是逐个容器,我们提出了一个随机ID。这是一个稳定的标识符,因此您的应用程序无论在与该容器通信时运行的客户端将获得相同的标识符,但它不通过任何个人信息识别用户。 ...我们已经给予您足够的支持,如果您愿意,可以使用CloudKit框架通过应用程序中的iCloud流实现登录。
[转录由http://asciiwwdc.com/2014/sessions/208提供]
如果你的应用程序配置了CloudKit存储,那么它的默认容器会附带一个自动生成的用户记录,代表当前登录的iCloud用户(如果有的话)。与此用户记录关联的UUID(实际上称为recordName
)对于您的应用在整个安装和设备之间是一致的。
E.g:
[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
…
myiCloudUserID = recordID.recordName;
}];
答案 1 :(得分:1)
iCloud没有持久的唯一标识符。
选项5是您最好的选择,除非您想对使用文档存储的同步文件进行冲突解决。