如何获取CloudKit中的当前用户ID?
How to get the current user ID in CloudKit?
我想在 public 数据库的 table 中为每个用户最多保存一条记录(即评分)。为此,我需要保存当前的用户 ID 或设备 ID。但是怎么才能得到呢?
您需要调用 -[CKContainer fetchUserRecordIDWithCompletionHandler:]
来获取当前用户记录 ID:
获取 iCloud ID / CloudKit 记录 ID 为 Swift 2
这是一个片段,我经常使用它来为 iOS 应用程序获取 iPhone 用户的 iCloud ID(Apple 称之为 CloudKit 记录 ID)。
您在 Xcode 中唯一需要做的就是激活项目的 iCloud 功能中的 "CloudKit" 复选框。您根本不需要主动使用 CloudKit - 它只是自 iOS 8.
以来所有 iCloud 活动的核心
重要的是要知道 Apple 从不直接公开真实的 iCloud ID,而总是 returns iCloud ID 和您的应用程序 ID 的安全哈希。但这不应该让您担心,因为该字符串 对于您的应用程序的每个用户 在他的所有设备上仍然是唯一的,并且 可以用作登录替换 。
我的函数是异步的,returns 是一个可选的 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")
}
}
这是 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")
}
}
一个更紧凑的Swift 5代码解决方案:
CKContainer.default().fetchUserRecordID(completionHandler: { (recordId, error) in
if let name = recordId?.recordName {
print("iCloud ID: " + name)
}
else if let error = error {
print(error.localizedDescription)
}
})
对于特定的 CloudKit 容器,使用此代码:
CKContainer(identifier: "<Your CloudKit container identifier>").fetchUserRecordID(completionHandler: { (recordId, error) in
if let name = recordId?.recordName {
print("iCloud ID: " + name)
}
else if let error = error {
print(error.localizedDescription)
}
})
我想在 public 数据库的 table 中为每个用户最多保存一条记录(即评分)。为此,我需要保存当前的用户 ID 或设备 ID。但是怎么才能得到呢?
您需要调用 -[CKContainer fetchUserRecordIDWithCompletionHandler:]
来获取当前用户记录 ID:
获取 iCloud ID / CloudKit 记录 ID 为 Swift 2
这是一个片段,我经常使用它来为 iOS 应用程序获取 iPhone 用户的 iCloud ID(Apple 称之为 CloudKit 记录 ID)。
您在 Xcode 中唯一需要做的就是激活项目的 iCloud 功能中的 "CloudKit" 复选框。您根本不需要主动使用 CloudKit - 它只是自 iOS 8.
以来所有 iCloud 活动的核心重要的是要知道 Apple 从不直接公开真实的 iCloud ID,而总是 returns iCloud ID 和您的应用程序 ID 的安全哈希。但这不应该让您担心,因为该字符串 对于您的应用程序的每个用户 在他的所有设备上仍然是唯一的,并且 可以用作登录替换 。
我的函数是异步的,returns 是一个可选的 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")
}
}
这是 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")
}
}
一个更紧凑的Swift 5代码解决方案:
CKContainer.default().fetchUserRecordID(completionHandler: { (recordId, error) in
if let name = recordId?.recordName {
print("iCloud ID: " + name)
}
else if let error = error {
print(error.localizedDescription)
}
})
对于特定的 CloudKit 容器,使用此代码:
CKContainer(identifier: "<Your CloudKit container identifier>").fetchUserRecordID(completionHandler: { (recordId, error) in
if let name = recordId?.recordName {
print("iCloud ID: " + name)
}
else if let error = error {
print(error.localizedDescription)
}
})