gpt4 book ai didi

ios - 如何使用相同的 CloudKit 数据库构建两个不同的应用程序?

转载 作者:行者123 更新时间:2023-11-28 15:40:07 27 4
gpt4 key购买 nike

我需要做的是构建两个不同的应用程序,都在我的开发者帐户下。把一个给用户看数据库中的数据,留一个方便我更改这个数据库。我正在使用 CloudKit、默认容器和公共(public)数据库。

所以我现在尝试的是我有一个应用程序供用户使用,假设应用程序名称是“showdata”。在该应用程序中,我使用默认容器和公共(public)数据库,如下所示:

let publicDatabase = CKContainer.default().publicCloudDatabase

然后我用它来执行查询:

query = CKQuery(recordType: "updateAndHold", predicate: NSPredicate(format: "TRUEPREDICATE"))
publicDatabase.perform(query!, inZoneWith: nil) { (records, error) in

在第二个应用程序中,我们将其命名为“updatedata”。我应该怎么做才能使用相同的数据库和容器来更新数据。我试过这段代码:

let container = CKContainer.init(identifier: "iCloud.com.WMWIOS.showdata").publicCloudDatabase

但是当我获取任何记录时,它给我错误,没有该名称的权利:

query = CKQuery(recordType: "updateAndHold", predicate: NSPredicate(format: "TRUEPREDICATE"))
container.perform(query!, inZoneWith: nil) { (records, error) in

当我 print(publicDatabase)print(container) 它有不同的 ID 但相同的标识符。

我需要帮助解决这个问题。如果您需要更多信息,请告诉我。

最佳答案

此代码使用命名的 icloud 数据库检查授权并包括广泛的错误检查。

func isAuthorized4Cloud() {
appDelegate = UIApplication.shared.delegate as! AppDelegate
container = CKContainer(identifier: "iCloud.blah.com")
publicDB = container.publicCloudDatabase
privateDB = container.privateCloudDatabase
var userID: CKRecordID!
container.fetchUserRecordID( completionHandler: { recordID, error in
guard error == nil else {
if let ckerror = error as? CKError {
if ckerror.code == CKError.requestRateLimited {
let retryInterval = ckerror.userInfo[CKErrorRetryAfterKey] as? TimeInterval
DispatchQueue.main.async {
Timer.scheduledTimer(timeInterval: retryInterval!, target: self, selector: #selector(self.files_searchSet), userInfo: nil, repeats: false)
}
} else if ckerror.code == CKError.zoneBusy {
let retryInterval = ckerror.userInfo[CKErrorRetryAfterKey] as? TimeInterval
DispatchQueue.main.async {
Timer.scheduledTimer(timeInterval: retryInterval!, target: self, selector: #selector(self.files_searchSet), userInfo: nil, repeats: false)
}
} else if ckerror.code == CKError.limitExceeded {
let retryInterval = ckerror.userInfo[CKErrorRetryAfterKey] as? TimeInterval
DispatchQueue.main.async {
Timer.scheduledTimer(timeInterval: retryInterval!, target: self, selector: #selector(self.files_searchSet), userInfo: nil, repeats: false)
}
} else if ckerror.code == CKError.notAuthenticated {
NotificationCenter.default.post(name: Notification.Name("noCloud"), object: nil, userInfo: nil)
} else if ckerror.code == CKError.networkFailure {
NotificationCenter.default.post(name: Notification.Name("networkFailure"), object: nil, userInfo: nil)
} else if ckerror.code == CKError.networkUnavailable {
NotificationCenter.default.post(name: Notification.Name("noWiFi"), object: nil, userInfo: nil)
} else if ckerror.code == CKError.quotaExceeded {
NotificationCenter.default.post(name: Notification.Name("quotaExceeded"), object: nil, userInfo: nil)
} else if ckerror.code == CKError.partialFailure {
NotificationCenter.default.post(name: Notification.Name("partialFailure"), object: nil, userInfo: nil)
} else if (ckerror.code == CKError.internalError || ckerror.code == CKError.serviceUnavailable) {
NotificationCenter.default.post(name: Notification.Name("serviceUnavailable"), object: nil, userInfo: nil)
}
} // end of guard statement
return
}

if error == nil {
userID = recordID
NotificationCenter.default.post(name: Notification.Name("cloudConnected"), object: nil, userInfo: nil)
}
})
}

您可能还想在 cloudkit 仪表板中查看数据库本身的权限,这将决定应用程序是否可以写入给定的数据库。

enter image description here

关于ios - 如何使用相同的 CloudKit 数据库构建两个不同的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com