Как получить текущий идентификатор пользователя в CloudKit?

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

Ответ 2

Получить идентификатор iCloud ID/CloudKit с идентификатором Swift 2

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

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

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

Моя функция, асинхронна и возвращает дополнительный объект 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")
    }
}

Ответ 3

Вот фрагмент кода для 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")
    }
}