CloudKit数据未在第二个设备中更新,仅在模拟器和第一个设备中



我正试图在多个设备中保持CloudKit的数据同步。使用以下代码,当记录在CloudKit中被修改时,我可以成功地添加、加载并获得通知,我的问题是,只有当我使用模拟器修改数据和物理设备查看通知时,这才有效。

以下是我的使用方法。

  1. 我在模拟器和iPhone中安装了该应用程序。

  2. 从模拟器中,我去输入一个新的笔记/记录,然后在iPhone中收到通知,这就是我想要的。我也可以直接从CloudKit dashboard输入记录,我也可以在iPhone中获得通知。

  3. 第三步,不起作用的是……我去了我妻子的iPhone,从Xcode安装了应用程序,并用我在模拟器和第一台数据更新设备中使用的相同帐户登录到iTunes & App Store,然后我去模拟器和第一部iPhone中输入数据,但我在妻子的iPhone中没有收到任何通知。我试着直接在我妻子的iPhone中输入数据,它似乎保持了数据,因为我可以退出应用程序,数据不会丢失。因此,我在两部手机中都得到了完全不同的数据,在我妻子的iPhone中,我只看到直接在那部手机中输入的数据,而在我的第一部手机中,我看到直接在模拟器或CloudKit仪表板中输入的数据。

我可能误解了整个生态系统及其工作方式。我所期望的是,每一部安装了该应用程序并使用相同的iTunes & App Store登录凭据登录的手机都会在所有设备中看到更新。

我误解了什么地方?

这是代码:

主视图控制器

添加记录

public func saveNotestoCloud(){
let privateDatabase = CKContainer.default().database(with: .private)
if let title =  self.textfield.text, let body = textView.text, let record = self.note?.record{
record["title"] = title
record["note"] = body
self.note?.record = record
privateDatabase.save(record) { (record,error) in
if let error = error{
print("Error  (error.localizedDescription)")
return
}
print("Successfully saved record (record?.recordID.recordName ?? "")")
}
}
}

应用程序代理

注册通知

let privateDatabase = CKContainer.default().database(with: .private)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.createSubscriptions()
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]){ (granter, error) in
guard error == nil else{
print(error!)
return
}
}
application.registerForRemoteNotifications()
return true
}
private func createSubscriptions(){
let predicate = NSPredicate(value: true)
let subscription = CKQuerySubscription(recordType: "Notes",
predicate: predicate,
subscriptionID: "SubscriptionID",
options: [CKQuerySubscription.Options.firesOnRecordCreation,  CKQuerySubscription.Options.firesOnRecordDeletion, CKQuerySubscription.Options.firesOnRecordUpdate])
let notificationInfo = CKSubscription.NotificationInfo()
notificationInfo.alertLocalizationKey = "New Note"
notificationInfo.shouldBadge = true
subscription.notificationInfo =  notificationInfo
let privateData = CKContainer.default().database(with: .private)
privateData.save(subscription){ result, error in
if let error = error {
print(error.localizedDescription)
}
}
}

据我所知,CloudKit依赖于在设备设置中iCloud下登录的帐户,而不是iTunes&应用商店帐户。

如果你想让你妻子的iPhone看到相同的CloudKit数据,你必须注销,然后在iCloud设置中使用你的Apple ID重新登录。

相关内容

最新更新