2017-07-25 6 views
0

クラウドキットを使用してユーザーのファーストネームを取得しようとしていますが、次のコードではfirstNameFromFunction変数を空のままにしています。誰もがiOS 10でこれを達成する方法を知っていますか?CloudKit:ユーザーのファーストネーム/姓を取得

let container = CKContainer.default()   
container.fetchUserRecordID { (recordId, error) in 
      if error != nil { 
       print("Handle error)") 
      }else{ 

       self.container.discoverUserInfo(
        withUserRecordID: recordId!, completionHandler: { (userInfo, error) in 
         if error != nil { 
          print("Handle error") 
         }else{ 
          if let userInfo = userInfo { 
           print("givenName = \(userInfo.displayContact?.givenName)") 
           print("familyName = \(userInfo.displayContact?.familyName)") 
           firstNameFromFunction = userInfo.displayContact?.givenName 
          }else{ 
           print("no user info") 
          } 
         } 
       }) 
      } 
     } 

答えて

0

まず、ユーザーに発見の許可を求める必要があります。

CKContainer.default().requestApplicationPermissionメソッドを使用すると、applicationPermissionパラメータにuserDiscoverabilityが渡されます。

CKContainer.default().discoverUserInfo方法が代わりのようなものですかCKContainer.default().discoverUserIdentity method.

を使用するiOSの10に廃止されました:最初に尋ねたときにアップします

CKContainer.default().requestApplicationPermission(.userDiscoverability) { (status, error) in 
        CKContainer.default().fetchUserRecordID { (record, error) in 
         CKContainer.default().discoverUserIdentity(withUserRecordID: record!, completionHandler: { (userIdentity, error) in 

          print("\(userIdentity?.nameComponents?.givenName)") 
          print("\(userIdentity?.nameComponents?.familyName)") 

         }) 
        } 
       } 
+0

、および変数の最初の名前(私は追加)すでに場合は、まだゼロ – user4174219

+0

に設定されている。ここで

は、私が作成した関数の例でありますiCloudアカウントにログインした物理デバイスを使用してユーザーのアクセス許可を尋ねられたが、それでもユーザー情報を印刷できなかった場合、その情報が何であるかはわかりません。私はiPhoneでXCode 8.1を使ってテストしましたが、うまくいきました。 – Sore

0

許可画面を、IMO、非常に悪い言葉遣いです。彼らはそれを変える必要があります。 「あなたのアプリを使っている人が電子メールであなたを見られるようにする?あなたの電子メールアドレスを知っている人は、あなたがこのアプリを使用していることを知ることができます。これは意味をなさない。これは、ユーザーに自分のiCloud名、姓、電子メールアドレスを要求することとは関係ありません。

電子メールアドレスといえば、これとlookupInfoプロパティの電話番号が欠落しています。つまり、これらの値は正当で正しいものですが、nilに設定されています。今夜バグを報告する。

0

まず、ユーザーの情報にアクセスするためのアクセス許可を要求する必要があります。

次に、CKDiscoverUserIdentitiesOperationを使用できます。これは、他のCKOperationと同様です(レコードの変更操作など)。あなたはuseridentitylookupinfoで新しい操作を作成するだけです。次に、結果を処理するための完了ブロックを作成する必要があります。私はコードの行を実行すると、何も画面に印刷されていない

func getUserName(withRecordID recordID: CKRecordID, 
       completion: @escaping (String) ->()) { 
    if #available(iOS 10.0, *) { 
     let userInfo = CKUserIdentityLookupInfo(userRecordID: recordID) 
     let discoverOperation = CKDiscoverUserIdentitiesOperation(userIdentityLookupInfos: [userInfo]) 
     discoverOperation.userIdentityDiscoveredBlock = { (userIdentity, userIdentityLookupInfo) in 
      let userName = "\((userIdentity.nameComponents?.givenName ?? "")) \((userIdentity.nameComponents?.familyName ?? ""))" 
      completion(userName) 
     } 
     discoverOperation.completionBlock = { 
      completion("") 
     } 
     CKContainer.default().add(discoverOperation) 
    } else { 
     // iOS 10 and below version of the code above, 
     // no longer works. So, we just return an empty string. 
     completion("") 
    } 
} 
関連する問題