2015-03-28 3 views
12

Я хотел бы сохранить не более одной записи (то есть рейтинг) для пользователя в таблице общей базы данных. Для этого мне нужно сохранить текущий идентификатор пользователя или идентификатор устройства. Но как я могу его получить?Как получить текущий идентификатор пользователя в CloudKit?

ответ

18

Вы хотите назвать -[CKContainer fetchUserRecordIDWithCompletionHandler:] для извлечения текущей записи пользователя ID:

+3

Как получить этому человеку пиво !!! –

+0

Я получаю исключение, когда я делаю CKContainer.defaultContainer() libC++ abi.dylib: завершение с неперехваченным исключением типа CKException –

22

Получить ICloud ID/CloudKit Индентификационный с Swift 2

Вот отрывок, который я всегда использовать для извлечения iPhone iCloud ID пользователя (Apple называет его идентификатором записи CloudKit) для приложения iOS.

Единственное, что вам нужно сделать в Xcode - активировать флажок «CloudKit» в возможностях iCloud вашего проекта. Вам не нужно активно использовать CloudKit вообще - это всего лишь ядро ​​всех действий iCloud с момента выхода iOS 8.

Важно знать, что Apple никогда не предоставляет реальный идентификатор iCloud, но всегда возвращает защищенный хэш iCloud ID и ваш идентификатор приложения. Но это вас не должно волновать, потому что эта строка по-прежнему уникальна для каждого пользователя вашего приложения на всех его устройствах, а может использоваться как замена входа.

Моя функция, асинхронная и возвращает дополнительный объект CKRecordID. Наиболее интересным свойством этого объекта CKRecordID является recordName.

CKRecordID.recordName - это строка из 33 символов, где первый символ всегда является символом подчеркивания, за которым следуют 32 уникальных символа (== ваш идентификатор пользователя iCloud, закодированный для вашего приложения). Он похож на: "_cd2f38d1db30d2fe80df12c89f463a9e"

import CloudKit 

/// async gets iCloud record name of logged-in user 
func iCloudUserIDAsync(complete: (instance: CKRecordID?, error: NSError?) ->()) { 
    let container = CKContainer.defaultContainer() 
    container.fetchUserRecordIDWithCompletionHandler() { 
     recordID, error in 
     if error != nil { 
      print(error!.localizedDescription) 
      complete(instance: nil, error: error) 
     } else { 
      print("fetched ID \(recordID?.recordName)") 
      complete(instance: recordID, error: nil) 
     } 
    } 
} 


// call the function above in the following way: 
// (userID is the string you are intersted in!) 

iCloudUserIDAsync() { 
    recordID, error in 
    if let userID = recordID?.recordName { 
     print("received iCloudID \(userID)") 
    } else { 
     print("Fetched iCloudID was nil") 
    } 
} 
+0

Я получаю исключение, когда я делаю CKContainer.defaultContainer() libC++ abi.dylib: завершение с помощью неперехваченное исключение типа CKException –

+0

@Sebastian Могу ли я использовать этот идентификатор записи, чтобы однозначно идентифицировать пользователя с той же учетной записью icloud на разных устройствах? Я имею в виду, если пользователь устанавливает приложение и записывает некоторые заметки. Затем я сохраняю эти заметки в firebase. И затем этот пользователь устанавливает приложение на другое устройство с той же учетной записью icloud, могу ли я получить заметки, уже написанные на другом устройстве? –

+0

@SalmanAli Да, и это один из самых важных аспектов этого. Я написал сообщение в блоге об этом несколько лет назад: https://medium.com/@skreutzb/ios-onboarding-without-signup-screens-cb7a76d01d6e – Sebastian

4

Вот фрагмент кода для Swift 3

import CloudKit 

/// async gets iCloud record ID object of logged-in iCloud user 
func iCloudUserIDAsync(complete: @escaping (_ instance: CKRecordID?, _ error: NSError?) ->()) { 
    let container = CKContainer.default() 
    container.fetchUserRecordID() { 
     recordID, error in 
     if error != nil { 
      print(error!.localizedDescription) 
      complete(nil, error as NSError?) 
     } else { 
      print("fetched ID \(recordID?.recordName)") 
      complete(recordID, nil) 
     } 
    } 
} 

// call the function above in the following way: 
// (userID is the string you are interested in!) 
iCloudUserIDAsync { (recordID: CKRecordID?, error: NSError?) in 
    if let userID = recordID?.recordName { 
     print("received iCloudID \(userID)") 
    } else { 
     print("Fetched iCloudID was nil") 
    } 
} 
+0

работает ли это в ios 10.3? – RejoylinLokeshwaran

+0

Да, он должен работать на iOS 10.3 –

+0

У меня есть ошибка, например, Завершение приложения из-за неотображенного исключения «CKException», причина: «В приложении отсутствует требуемое право com.apple.developer.icloud-services» – RejoylinLokeshwaran