2017-07-25 85 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方法已在iOS 10.而是使用CKContainer.default().discoverUserIdentity method.

做這樣的事情:

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

當我執行該代碼行,沒有什麼被印刷在屏幕上,並且可變名字(I加入)仍然設置爲nil – user4174219

+0

如果已經使用登錄到iCloud帳戶的物理設備詢問用戶權限,但仍然無法打印用戶信息,我不知道這可能是什麼。我使用XCode 8.1測試了iPhone,並且它工作正常。 – Sore

0

要求在第一時間時出現的許可屏幕,國際海事組織,很不好措辭。他們需要改變這一點。它說:「允許使用'你的應用程序'的人通過電子郵件查看你的人嗎?知道你的電子郵件地址的人將能夠看到你使用這個應用程序。」這沒有意義。這與要求用戶獲取他們的iCloud名字,姓氏,電子郵件地址無關。

說到電子郵件地址 - 這和來自lookupInfo屬性的電話號碼丟失 - 即設置爲零,即使這些值是合法和正確的。今晚提交一個錯誤。

0

首先,您需要請求訪問用戶信息的權限。

然後,您可以使用CKDiscoverUserIdentitiesOperation。這就像任何其他的CKOperation(例如修改記錄操作)。你只需要用useridentitylookupinfo創建一個新的操作。然後,您還需要創建一個完成塊來處理結果。

下面是一個例子函數I創建:

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("") 
    } 
}