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)

CKContainer accountStatusWithCompletionHandler 返回错误值

Webapp2 请求应用程序/八位字节流文件上传

发布更新 CKRecord

如何使用CKNotification?