3

我正在尝试找出一种方法来生成一个唯一的 iCloud ID,该 ID 在设备上都是相同的。我的应用程序将数据存储在我想绑定到 iCloud id 的在线数据库中。这提供了无需处理登录的良好用户体验(因为所有数据都与他们的 iCloud 帐户相关联),而不会被 iCloud 糟糕的同步卡住。问题是,据我所知,没有任何 API 可以为我提供这种 ID。

我尝试过/想过的事情:

1) NSUbiquitousKeyValueStore

不起作用,因为该值将在“稍后”更新,即 - 只要 Apple 喜欢它。

2) iCloud 文档存储

与 #1 相同的问题,额外的好处是在设备中存储了一个用户可以手动删除的随机文件

3) 使用 [[NSFileManager defaultManager] ubiquityIdentityToken]

因为对于任何给定的登录会话,Ubiquity 令牌的字节都是相同的,我想可能是跨设备的情况。不是这样

4) 使用通讯录联系人

似乎它是不可靠的(如果他们更改他们的主要电子邮件/电话号码/姓名会发生什么),而且在首次启动时会产生烦人/吓坏用户的副作用(他们怎么知道我没有窃取他们所有的联系人?)

5) 滚动绑定到远程服务器的我自己的登录系统

这似乎是唯一可用的选择,尽管我更喜欢更好的选择。

提前致谢

4

2 回答 2

10

也许这已经太晚了,没有用,但 iOS 8 在这里提供了一个解决方案。来自 WWDC 2014 “Intro to CloudKit”会议:

因此,我们所做的是在一个容器一个容器的基础上,我们提出一个随机 ID。这是一个稳定的标识符,因此无论您的应用程序在与该容器通信时运行的哪个客户端都将获得相同的标识符,但它不会通过任何个人信息来识别用户。… 我们已经为您提供了足够的支持,如果您愿意,您可以使用 CloudKit 框架在您的应用程序中通过 iCloud 流实现登录。

[转录由http://asciiwwdc.com/2014/sessions/208提供]

为了进一步充实这一点,如果您的应用程序是为 CloudKit 存储配置的,那么它的默认容器带有一个自动生成的用户记录,代表当前登录的 iCloud 用户(如果有)。与此用户记录关联的 UUID(实际称为recordName)对于您的应用在安装和设备之间是一致的。

例如:

[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
    …
    myiCloudUserID = recordID.recordName;
}];
于 2014-07-29T17:45:38.923 回答
1

iCloud 没有持久的唯一标识符。

选项 5 是您最好的选择,除非您想对使用文档存储的同步文件进行冲突解决。

于 2013-06-03T09:02:14.330 回答