web-dev-qa-db-ja.com

CloudKitで現在のユーザーIDを取得するにはどうすればよいですか?

パブリックデータベースのテーブルにユーザーごとに最大で1つのレコード(つまり、評価)を保存したいと思います。このため、現在のユーザーIDまたはデバイスIDを保存する必要があります。しかし、どうすれば入手できますか?

18
Jan F.

あなたは電話したくなるでしょう -[CKContainer fetchUserRecordIDWithCompletionHandler:] 現在のユーザーレコードIDを取得するには:

23
farktronix

Swift 2でiCloud ID/CloudKitレコードIDを取得

これは、iOSアプリのiPhoneユーザーのiCloud ID(AppleではCloudKitレコードIDと呼んでいます)を取得するために常に使用しているスニペットです。

Xcodeで行う必要があるのは、プロジェクトのiCloud機能の[CloudKit]チェックボックスをアクティブにすることだけです。 CloudKitを積極的に使用する必要はまったくありません。これはiOS8以降のすべてのiCloudアクティビティの中核にすぎません。

Appleが実際のiCloudIDを直接公開することはなく、常にiCloud IDとアプリIDの保護されたハッシュを返すだけであることを知っておくことが重要です。ただし、その文字列は- アプリのユーザーごとに一意です彼のすべてのデバイスでログインの代替として使用できます

私の関数は非同期で、オプションのCKRecordIDオブジェクトを返します。そのCKRecordIDオブジェクトの最も興味深いプロパティはrecordNameです。

CKRecordID.recordNameは33文字の文字列で、最初の文字は常にアンダースコアで、その後に32個の一意の文字が続きます(==アプリ用にエンコードされたユーザーiCloud ID)。次のようになります。"_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")
    }
}
30
Sebastian

これは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")
    }
}
8
Yi-Hsiu Lee