CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)
Posted
技术标签:
【中文标题】CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)【英文标题】:Service unavailable error (CKError Code 6) in CKContainer requestApplicationPermission 【发布时间】:2017-04-17 10:13:18 【问题描述】:我正在尝试使用 CloudKit 从他们的 iCloud 帐户中读取用户名,如下所示
CKContainer *container = [CKContainer defaultContainer];
[container accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError * _Nullable error)
if (accountStatus == CKAccountStatusAvailable)
[container requestApplicationPermission:CKApplicationPermissionUserDiscoverability completionHandler:^(CKApplicationPermissionStatus applicationPermissionStatus, NSError * _Nullable error)
if (applicationPermissionStatus == CKApplicationPermissionStatusGranted)
[container fetchUserRecordIDWithCompletionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error)
if (!error && recordID)
[container discoverUserIdentityWithUserRecordID:recordID completionHandler:^(CKUserIdentity * _Nullable userInfo, NSError * _Nullable error)
NSLog(@"UserInfo: %@ Error: %@", userInfo, error);
];
];
];
];
但每次requestApplicationPermission
失败并出现服务不可用错误并且状态为CKApplicationPermissionStatusCouldNotComplete
。我不确定我在这里做错了什么。我尝试了多个设备和帐户,但结果仍然相同。我已尝试按照某些地方的建议禁用和启用 CloudKit,但没有运气。是否有任何我需要配置的信息丢失。下面是我的 iCloud 功能的外观
【问题讨论】:
您的设备 iCloud 设置中是否启用了 iCloud Drive?仅供参考fetchUserRecordIDWithCompletionHandler
不会给你一个用户名,只是一个不透明的标识符
@Paulw11:我让用户登录了 iCloud 并启用了 iCloud Drive。已经看到关于 SO 的建议。另外,在从fetchUserRecordIDWithCompletionHandler
获取标识符后,我期待来自discoverUserIdentityWithUserRecordID
的用户名。
【参考方案1】:
原来我需要在调用requestApplicationPermission
之前先调用statusForApplicationPermission:
。真是莫名其妙,因为我没有检查权限状态,权限请求就失败了。 Service UnAvailable
错误也是如此。这是有效的代码(不是很优雅):
CKContainer *container = [CKContainer defaultContainer];
[container accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError * _Nullable error)
if (accountStatus == CKAccountStatusAvailable)
[container statusForApplicationPermission:CKApplicationPermissionUserDiscoverability completionHandler:^(CKApplicationPermissionStatus applicationPermissionStatus, NSError * _Nullable error)
if (applicationPermissionStatus==CKApplicationPermissionStatusInitialState || applicationPermissionStatus==CKApplicationPermissionStatusGranted)
[container requestApplicationPermission:CKApplicationPermissionUserDiscoverability completionHandler:^(CKApplicationPermissionStatus applicationPermissionStatus, NSError * _Nullable error)
if (applicationPermissionStatus == CKApplicationPermissionStatusGranted)
[container fetchUserRecordIDWithCompletionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error)
if (!error && recordID)
[container discoverUserIdentityWithUserRecordID:recordID completionHandler:^(CKUserIdentity * _Nullable userInfo, NSError * _Nullable error)
NSLog(@"UserInfo: %@ Error: %@", userInfo, error);
];
];
];
];
];
【讨论】:
以上是关于CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)的主要内容,如果未能解决你的问题,请参考以下文章
无法从应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit,Swift
CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)