AppDelegate никогда не получает свой didReceiveRemoteNotification, вызванный для CKQuerySubscription - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь позволить приложению iOS прослушать CKQuerySubscription изменения. Данные передаются удаленным приложением iOS. У меня уже есть приложение macOS, которое получает данные, отправленные удаленным приложением iOS. У приложения iOS, с которым у меня проблемы, уже есть подписка. Тем не менее, его AppDelegate никогда не получает вызов в методе didReceiveRemoteNotification.

import UIKit
import UserNotifications
import CloudKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        /* notifications */
        let center  = UNUserNotificationCenter.current()
        center.delegate = self
        UNUserNotificationCenter.current().getNotificationSettings { (settings) in
            switch settings.authorizationStatus {
            case .authorized:
                print("You already have permission")
                DispatchQueue.main.async() {
                    application.registerForRemoteNotifications()
                }
            case .denied:
                print("setting has been disabled")
            case .notDetermined:
                print("Let me ask")
                UNUserNotificationCenter.current().requestAuthorization(options: []) { (granted, error) in
                    if error == nil {
                        if granted {
                            print("you are granted permission")
                            DispatchQueue.main.async() {
                                application.registerForRemoteNotifications()
                            }
                        }
                    }
                }
            }
        }
        return true
    }
}

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Failed to register notifications_ error:", error)
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("Receiving data...") // never called...
    }
}

У меня есть некоторые возможности, как показано ниже. Я не знаю, нужно ли приложению push notifications. Пока он включен.

Так почему же мое приложение для iOS не получает удаленный вызов уведомлений? Я использую приложение с реальным устройством, а не симулятор. Благодаря.

enter image description here

РЕДАКТИРОВАТЬ : создание подписки на изменение записи

class HomeViewController: UIViewController {
    override func viewDidLoad() {
        registerSubscription()
    }

    func registerSubscription() {
        let cloudContainer = CKContainer(identifier: "iCloud.com.xxx.XXXXX")
        let privateDB = cloudContainer.privateCloudDatabase
        let predicate = NSPredicate(format: "TRUEPREDICATE")
        let subscription = CKQuerySubscription(recordType: "PrivateRecords", predicate: predicate, options: .firesOnRecordCreation)
        let notification = CKNotificationInfo()
        subscription.notificationInfo = notification
        privateDB.save(subscription, completionHandler: ({returnRecord, error in
            if let err = error {
                print("Subscription has failed: \(err.localizedDescription)")
            } else {
                print("Subscription set up successfully")
                print("Subscription ID: \(subscription.subscriptionID)")
            }
        }))
    }
}

1 Ответ

0 голосов
/ 06 сентября 2018

Есть еще несколько вещей, которые вы можете проверить.

Сначала убедитесь, что вы внедрили didReceiveRemoteNotification в своем делегате приложения:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {  
  let dict = userInfo as! [String: NSObject]
  let notification = CKNotification(fromRemoteNotificationDictionary: dict)

  if let sub = notification.subscriptionID{
    print("iOS Notification Received: \(sub)")
  }
}

Есть также несколько других вещей, которые вы можете проверить:

  1. Попробуйте удалить CKQuerySubscription на панели инструментов CloudKit, а затем снова запустите код iOS, который его регистрирует. Отображается ли подписка на панели инструментов?
  2. Показывает ли журнал CloudKit, что уведомление отправлено? В нем перечислены все уведомления, которые были отправлены на устройство.
  3. Если вы используете автоматические push-уведомления, попробуйте включить Фоновую выборку в режиме фоновых режимов (прямо над Удаленные уведомления ).

Если вы сделаете все это, и это все еще не работает, вы можете поделиться своим CKQuerySubscription кодом?

- Обновление -

Попробуйте установить некоторые дополнительные атрибуты для вашего CKNotificationInfo объекта. Есть некоторые неясные ошибки с уведомлениями, которые обычно можно обойти, установив пару свойств, таких как:

notification.shouldSendContentAvailable = true
notification.alertBody = "" //(Yes, a blank value. It affects the priority of the notification delivery)

Вы также можете попробовать установить предикат: NSPredicate(value: true)

Кроме того, что возвращает ваш privateDB.save метод? Это говорит о том, что это удается или не удается?

...