2016-09-30 16 views
0

iOS 8以降をサポートするアプリがあります。私はCKDiscoverAllContactsOperationを使って共有目的でユーザーの一覧を取得しています。このコードは、iOS 8とiOS 9ではうまく動作します。しかし、iOS 10では、補完ブロックはエラーを返しませんが、いくつかの場合でも結果を返しません。CKDiscoverAllContactsOperationがiOS 10で動作しなくなった

私はまた、コンソールに次のメッセージを指摘しました:

<エラー>:なしレコードIDを持つユーザーの発見進捗コールバックを手に入れた:{}

これは時間の間に表示されます操作が開始され、完了ブロックが呼び出されます。私はCKDiscoverAllContactsOperationはiOSの10で廃止され、CKDiscoverAllUserIdentitiesOperationに置き換えられていることを知っている

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]; 

:ここ

は、関連するコードです。しかし、私のアプリが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

Appleはこのバグを修正上の任意の進歩を示している場合疑問に思います。ありがとうございました。 –

+1

@AnthonyC聞いたことはありません。合理的な回避策があるので、私はそれについて心配していません。 – rmaddy

関連する問題