2016-09-30 81 views
0

我有一個支持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類和此是唯一給我一個問題的人。

回答

1

經過一番研究,似乎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