CKDiscoverAllContactsOperation停止在iOS 10下工作

问题描述:

我有一个支持iOS 8和更高版本的应用程序。我一直在使用CKDiscoverAllContactsOperation来获取共享用户列表。这个代码在iOS 8和iOS 9下工作得很好。但是在iOS 10下,完成块返回没有错误,但它也不返回任何结果,即使有一些。CKDiscoverAllContactsOperation停止在iOS 10下工作

我也注意到在控制台以下消息:

<错误>:得到没有记录ID的用户发现进度回调:{}

这似乎时间之间该操作开始并且完成块被调用。

下面是相关代码:

CKDiscoverAllContactsOperation *op = [[CKDiscoverAllContactsOperation alloc] init]; 
op.discoverAllContactsCompletionBlock = ^(NSArray <CKDiscoveredUserInfo *> *userInfos, NSError *error) { 
    if (error) { 
     NSLog(@"Unable to get all app users: %@", error); 
    } else { 
     // process the found users 
    } 
}; 
[container addOperation:op]; 

我知道CKDiscoverAllContactsOperation被弃用iOS的10和CKDiscoverAllUserIdentitiesOperation已被替换。但是因为我的应用程序支持回到iOS 8,所以即使在iOS 10下我也不能使用相同的代码。事实上,我仍然使用其他几个已弃用的(从iOS 10开始的)CloudKit类和此是唯一给我一个问题的人。

经过一番研究,似乎CKDiscoverAllContactsOperation根本无法像iOS 10那样工作。这可能是iOS 10中的一个错误,并且会向Apple提交错误。但我现在有用户抱怨,现在需要解决方法。

最简单的解决方案是在可用时使用新操作,如果不可用则使用旧操作。

这导致以下基本代码:

if ([CKDiscoverAllUserIdentitiesOperation class]) { 
    // Use the newer operation 
    CKDiscoverAllUserIdentitiesOperation *op = [[CKDiscoverAllUserIdentitiesOperation alloc] init]; 
    NSMutableArray *users = [NSMutableArray array]; 
    op.userIdentityDiscoveredBlock = ^(CKUserIdentity *identity) { 
     if (identity.hasiCloudAccount) { 
      DatabaseShareUser *user = [[DatabaseShareUser alloc] init]; 
      user.recordId = identity.userRecordID; 
      user.username = [NSPersonNameComponentsFormatter localizedStringFromPersonNameComponents:identity.nameComponents style:NSPersonNameComponentsFormatterStyleDefault options:0]; 
      [users addObject:user]; 
     } 
    }; 
    op.discoverAllUserIdentitiesCompletionBlock = ^(NSError *error) { 
     if (error) { 
      NSLog(@"Unable to get app users: %@", error); 

      completion(nil); 
     } else { 
      completion([users copy]); 
     } 
    }; 

    [container addOperation:op]; 
} else { 
    // Use the old operation 
    CKDiscoverAllContactsOperation *op = [[CKDiscoverAllContactsOperation alloc] init]; 
    op.discoverAllContactsCompletionBlock = ^(NSArray <CKDiscoveredUserInfo *> *userInfos, NSError *error) { 
     if (error) { 
      NSLog(@"Unable to get app users: %@", error); 

      completion(nil); 
     } else { 
      NSMutableArray *res = [NSMutableArray array]; 
      for (CKDiscoveredUserInfo *userInfo in userInfos) { 
       DatabaseShareUser *user = [[DatabaseShareUser alloc] init]; 
       user.recordId = userInfo.userRecordID; 
       user.username = userInfo.displayName; 
       [res addObject:user]; 
      } 

      completion([res copy]); 
     } 
    }; 
    [container addOperation:op]; 
} 

DatabaseShareUser是一个简单的应用程序类,其存储每个用户的CKRecordID和显示名称。

completion是由该代码是英寸

+0

想知道如果苹果已表示在定影此错误的任何进展的方法中使用的完成块。谢谢。 –

+1

@AnonyC不是我听说过的。由于有一个合理的解决方法,我并不担心它。 – rmaddy