我正在尝试为我的应用添加iCloud支持,并有两个用于测试的设备,一个iPhone和一个iPad。两者都运行iOS 8.1并连接到相同的Apple帐户。当我检查iCloud的设置时,我可以看到其他应用程序在两台设备上成功使用iCloud。然而,虽然在iPhone上一切正常(即我在启动应用程序后不久就收到“使用本地存储:0”消息),在iPad上它崩溃了:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
结果[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier : nil]
返回nil
。考虑到我在两个设备上运行完全相同的构建,可能是这种行为的原因,因此在任何配置,权利等方面都没有差异。
修改
实际上,似乎iCloud在iPad上通常不可用。 [NSFileManager defaultManager].ubiquityIdentityToken
也返回nil
,这应该是一种相当可靠的方法来确定是否可以使用iCloud。 :(
答案 0 :(得分:3)
iCloud同步守护进程在iOS 8.1上仍然显得有点不稳定。在有问题的设备上使用设置应用退出该iCloud帐户,然后重新登录。重新启动设备以获得良好的衡量标准,然后重试。必要时重复。
这通常可以清除任何iCloud对我的怪异......
除此之外,您的iCloud权利配置是否正确?检查Xcode功能和证书&开发人员中心网站上的标识符,看到两者都认为这些都没问题。如果受影响设备上的其他应用程序能够同步文档(通过Documents& Data或iCloud Drive),那么它可能是您的配置。
此外,不要依赖设置告诉您其他应用程序能够同步文档 - 这些应用程序是否实际同步文档(因此在应用程序中创建文档并查看它们是否实际同步)...什么设置说并不总是反映底层守护程序进程实际在做什么。
答案 1 :(得分:0)
检查iCloud可用性的正确方法是检查(如您所述):
id icToken = [[NSFileManager defaultManager] ubiquityIdentityToken];
文档陈述如下:
当iCloud当前可用时,此属性包含一个表示当前用户身份的不透明对象。如果iCloud因任何原因不可用或没有登录用户,则此属性的值为nil。访问此属性的值相对较快,因此您可以在应用程序的主线程中检查启动时的值。
然而,显然在iOS 8.1上这已经破了,当你在主线程上这样做时,iOS会终止你......并且崩溃! Little Birdies表示iOS更新将很快解决这个问题。
请参阅以下错误报告:18848310,18940230