我想让数据不被 CloudKit
在多个设备中同步。使用下面的代码,我可以成功地添加、加载和获得通知,当记录被修改时,在 CloudKit
我的问题是,这只有在我使用模拟器修改数据和物理设备看到通知时才有效。
下面是我如何使用它。
我安装的应用程序在模拟器和iPhone。
从模拟器中,我去输入一个新的noterecord,我在iPhone中得到通知,这是我想要的。我也可以直接从 CloudKit dashboard
我也得到了在iPhone的通知。
第三步,不行的是...... 我到我妻子的iPhone,安装了Xcode的应用程序,并登录到了 iTunes & App Store
与我在模拟器和数据更新的第一个设备中使用的相同的帐户,然后我去输入数据在模拟器和第一个iPhone,但我没有得到任何通知,在我妻子的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 & App Store账户。
如果你想让你妻子的iPhone看到同样的CloudKit数据,你必须先退出,然后在iCloud设置中用你的Apple ID重新登录。