-1

重要提示:问题不是关于模拟通知,而是关于从 CloudKit 服务器接收真实通知并获得工作同步。

模拟器上的通知永远不会触发,即使应用程序启动,我也无法很好地测试我的应用程序。具体来说,我已经订阅了 CKDatabaseSubscription。任何人都知道如何允许模拟器上的通知获得工作同步?

我只在真实设备上接收通知并且有工作同步,它在那里完美运行。

func subscriptionToNotifications(for container: CKContainer) {
    if subscriptionIsLocallyCached { return }
    
    let application = UIApplication.shared
    let sharedDatabase = container.sharedCloudDatabase
    
    let subscription = CKDatabaseSubscription(subscriptionID: "shared-changes")
    subscription.recordType = "CD_List"
    
    let notificationInfo = CKSubscription.NotificationInfo()
    notificationInfo.shouldSendContentAvailable = true
    notificationInfo.shouldBadge = true
    notificationInfo.alertBody = "Task list was changed"
    notificationInfo.soundName = "default"
    
    subscription.notificationInfo = notificationInfo;
    
    /// Saving subscription to Shared Database
    container.sharedCloudDatabase.save(subscription) { (subscription, error) in
        if let error = error {
            print("Error saving subscription:\n", error.localizedDescription)
        } else if let subscription = subscription {
            print("Successfully saved Subscription:\n", subscription.debugDescription)
        }
    }
    
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
        if let error = error {
            print("Error registering notifications authorization")
        } else if granted {
            print("Successfully authorized Notifications!")
        }
    }
    
    application.registerForRemoteNotifications()
    
    /// Creating operation which will notify when subscription will be saved
    let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: [])
    
    operation.modifySubscriptionsCompletionBlock = { [unowned self] subscriptions, subscriptionIDs, error in
        if let error = error {
            print("Error registering notifications authorization")
        } else {
            self.subscriptionIsLocallyCached = true
            print("Successfully modified subscriptions")
        }
    }
    
    operation.qualityOfService = .utility
    
    sharedDatabase.add(operation)
}
4

1 回答 1

2

CloudKit 通知在模拟器上大部分时间都不起作用,您应该在真实设备上进行测试。

于 2020-07-26T19:08:16.507 回答