CloudKit通知不会在生产中到达(AppStore,TestFlight),但在开发模式下工作(从Xcode安装)。
为什么?
这是我注册远程通知的方式:
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.alert, .badge, .sound]) { authorised, error in
DispatchQueue.main.sync {
application.registerForRemoteNotifications()
}
}
这就是我保存订阅的方式:
func subscribeForChanges() {
let options: CKQuerySubscriptionOptions = [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion]
let serviceSubscription = CKQuerySubscription(recordType: "Service", predicate: NSPredicate(value: true), options: options)
let goalSubscription = CKQuerySubscription(recordType: "Goal", predicate: NSPredicate(value: true), options: options)
let territorySubscription = CKQuerySubscription(recordType: "Territory", predicate: NSPredicate(value: true), options: options)
let addressSubscription = CKQuerySubscription(recordType: "Address", predicate: NSPredicate(value: true), options: options)
let noteSubscription = CKQuerySubscription(recordType: "Note", predicate: NSPredicate(value: true), options: options)
let daySubscription = CKQuerySubscription(recordType: "Day", predicate: NSPredicate(value: true), options: options)
let shareSubscription = CKQuerySubscription(recordType: "cloudkit.share", predicate: NSPredicate(value: true), options: options)
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldBadge = false
notificationInfo.shouldSendContentAvailable = true
serviceSubscription.notificationInfo = notificationInfo
goalSubscription.notificationInfo = notificationInfo
territorySubscription.notificationInfo = notificationInfo
addressSubscription.notificationInfo = notificationInfo
noteSubscription.notificationInfo = notificationInfo
daySubscription.notificationInfo = notificationInfo
shareSubscription.notificationInfo = notificationInfo
let privateSubscriptionsOperation = CKModifySubscriptionsOperation(subscriptionsToSave: [serviceSubscription, goalSubscription, territorySubscription, addressSubscription, noteSubscription, daySubscription, shareSubscription], subscriptionIDsToDelete: nil)
privateSubscriptionsOperation.database = CloudAssistant.shared.privateDatabase
let notificationInfoDatabaseSubscription = CKNotificationInfo()
notificationInfoDatabaseSubscription.shouldSendContentAvailable = true
let subscription = CKDatabaseSubscription(subscriptionID: "pl.blue-world.fieldservice.sharedDatabase")
subscription.notificationInfo = notificationInfoDatabaseSubscription
let sharedSubscriptionsOperation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: nil)
sharedSubscriptionsOperation.database = CloudAssistant.shared.sharedDatabase
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.addOperation(privateSubscriptionsOperation)
queue.addOperation(sharedSubscriptionsOperation)
privateDatabase.save(CKRecordZone(zoneName: "fieldservice")) { _, _ in }
}
答案 0 :(得分:1)
当我遇到类似的事情时,它是由dev和prod环境之间的服务器更改令牌混淆引起的。在我的情况下,开发更改令牌,比如aaabbb,而prod更改令牌更早,比如aaaaab。由于我无意中使用了开发更改令牌,因此它在“生产”方面处于领先地位。
我看到你已经编辑了你的问题,但是我从之前的版本回忆起来,我相信你已经配置了xcode构建来使用prod env。但是,如果这个理论与你的问题有关,那么有一个简单的测试来证明或反驳。在你没有收到通知的环境中申请后,请致电
CKFetchNotificationChangesOperation
使用Nil作为服务器更改令牌。从那个用户的一开始就应该返回每个notif。如果结果包含缺失的通知,则问题可能在于您处理更改令牌的方式。
否则,我会使用
转储该用户的所有潜艇CKFetchSubscriptionOperation
在xcode构建和testflight构建上,并比较两组,密切关注谓词。我希望这些列表是相同的,因为你已经使用了prod env,但我会在寻找更复杂的原因之前将这个简单的测试排除在外。
答案 1 :(得分:0)
无声推送通知在iOS 11.0.X中存在问题在iOS 11.1中有一个修复。
在开发模式下,您可能会收到通知,因为通常设备通过电源线连接到您的计算机。连接电源时会处理静音通知!
如果您的开发设备是iOS 11.0.X,则可能是这个问题。