为什么cloudkit通知在从testflight安装应用程序时没有到达,而从xcode编译时它是有效的?

时间:2017-12-02 19:37:16

标签: ios cloudkit sharing

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 }
}

2 个答案:

答案 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,则可能是这个问题。