我一直在尝试使用iCloud示例代码和教程,以便在我们的MacOS和iOS产品之间开发同步系统。在iOS方面,我在构建和运行操作iCloud Documents容器中的数据的代码时没有问题,但在MacOS方面,使用Apple MacOS PackagedDocument 示例项目,我无法成功将任何数据放在我的iCloud中。我认为基本问题是我的应用程序的URLForUbiquityContainerIdentifier无法找到,可能是由于iCloud权利规范中的一些错误。但是,在花费大量时间花在开发人员门户网站和 Xcode 6 / PackagedDocument 设置上之后,我一直无法找到问题的根源。
我的iCloud帐户以前是MobileMe帐户,用于在MacOS和iOS设备之间同步Apple应用程序,所以我相信我的iCloud帐户可以正常运行。
这里我将说明我指定调用以获取iCloud Documents容器的不同方法。无论指定方式如何,获取iCloud容器URL的调用都返回nil:
// remember our ubiquity container NSURL for later use
_ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:@"icloud.com.mycompany.PackagedDocument"];
_ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:@"7G3Z4SV5WT.com.mycompany.PackagedDocument"];
_ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
在我的iOS实验中,此 URLForUbiquityContainerIdentifier 调用始终会获得所需的网址。
该应用的CFBundleIdentifier为 com.mycompany.PackagedDocument
iCloud授权密钥指定如下:
com.apple.application-identifier 键值为 $(TeamIdentifierPrefix)com.mycompany.PackagedDocument
com.apple.developer.icloud-services 键值为 CloudDocuments
com.apple.developer.icloud-container-identifiers 键值为 的的iCloud $(CFBundleIdentifier)
和 com.apple.developer.ubiquity-container-identifiers 键值为 的的iCloud $(CFBundleIdentifier)
我也试过这个video tutorial的代码,但在尝试获取普遍容器时得到相同的nil结果:
- (IBAction)saveToIcloud:(id)sender {
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *directory = [[fm URLForUbiquityContainerIdentifier:@"7G3Z4SV5WT.com.mycompany.PackagedDocument"]
URLByAppendingPathComponent:@"Documents"];
directory = [[fm URLForUbiquityContainerIdentifier:@"iCloud.com.mycompany.PackagedDocument"]
URLByAppendingPathComponent:@"Documents"];
directory = [[fm URLForUbiquityContainerIdentifier:nil]
URLByAppendingPathComponent:@"Documents"];
directory = [[fm
if (directory) {
[fm createDirectoryAtURL:directory withIntermediateDirectories:NO attributes:nil error:NULL];
NSURL *filepath = [NSURL URLWithString:@"/Users/leg/Desktop/myjpeg.jpg"];
NSURL *destination = [directory URLByAppendingPathComponent:[filepath lastPathComponent]];
[fm setUbiquitous:YES itemAtURL:filepath destinationURL:destination error:nil];
}
}
总之,我认为问题必须与我的iCloud权利规范和/或访问iCloud Document容器所需的其他规范有关。如果有人对我可能发生的事情有所了解,我非常感谢他们的反馈意见。如果做不到这一点,也许有人可以指出我正在使用非iOS ,macos iCloud Documents示例代码。
其他信息
我在控制台日志PackagedDocument启动时看到以下消息:
9/2/15 5:19:11.966 PM taskgated-helper [14145]:不满意的权利com.apple.developer.ubiquity-container-identifiers
9/2/15 5:19:11.966 PM taskgated-helper [14145]:不满意的权利com.apple.developer.icloud-container-identifiers
9/2/15 5:19:11.966 PM taskgated-helper [14145]:不满意的权利com.apple.developer.ubiquity-container-identifiers
9/2/15 5:19:11.966 PM taskgated-helper [14145]:不满意的权利com.apple.developer.icloud-container-identifiers
9/2/15 5:19:11.966 PM taskgated-helper [14145]:不满意的权利com.apple.developer.ubiquity-container-identifiers
9/2/15 5:19:11.966 PM taskgated-helper [14145]:不满意的权利com.apple.developer.icloud-container-identifiers
9/2/15 5:19:11.967 PM taskgated-helper [14145]:由于配置文件而允许pid = 14144的权利
更多信息
我使用一个有效的iOS iCloud示例项目进行了实验,以验证PackagedDocument iCloud容器:
我将iOS示例的Capabilites / iCloud设置从“使用默认容器”更改为“指定自定义容器”。我检查了示例的默认容器并检查了“iCloud.com.mycompany.PackagedDocument”。
然后我更改了URLForUbiquityContainerIdentifier调用:
from: NSURL *baseURL = [[NSFileManager defaultManager]URLForUbiquityContainerIdentifier:nil];
to: NSURL *baseURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:@"iCloud.com.mycompany.PackagedDocument"];
现在,当我运行这个iOS应用程序时,它会创建PackagedDocument iCloud容器并将其用于其数据 - 正是我一直在尝试使用PackagedDocument MacOS示例。
然后我回到MacOS PackagedDocument项目并运行它以查看 URLForUbiquityContainerIdentifier 调用现在是否会找到容器。它确实不。即使容器现在肯定存在,Nil仍然会返回。
我认为这意味着它仍然是某种权利问题。
更多信息
我进行了另一项实验,我从我的常用开发者系统(Yosemite 10.10.5)的Xcode 6.4 / Preferences / Actions / Export Accounts ...中导出了我的开发者身份,然后在Mavericks 10.9.5下重新启动了我的MacBook Pro并使用Xcode 6.1 / Preferences / Actions / Import Accounts ...导入身份。 (在我将其升级到Yosemite之前,Mavericks系统磁盘实际上是我MacBook Pro系统磁盘的Carbon Copy。)现在,当我在Mavericks中构建并运行 PackagedDocument 时,一切都运行良好
然后我重新启动回Yosemite并删除我的身份并使用Xcode 6.1 / Preferences / Actions / Import Accounts ...导入身份。现在,当我在Yosemite中构建并运行 PackagedDocument 时,它仍然无效 - 找不到iCloud容器。
然后我决定在干净安装的El Capitan(10.11 Beta 5)/ Xcode 6.4中尝试相同的实验。同样,它仍然无效 - 找不到iCloud容器。
最后,我决定再试一次。我决定尝试启用 iCloud Drive 。但是,因为我不想将我工作的iCloud帐户转换为 iCloud Drive ,所以我决定为测试创建一个新的iCloud ID,并打开 iCloud Drive 。现在,当我使用 iCloud Drive 在El Capitan中构建并运行 PackagedDocument 时,一切正常。