CKQueryNotification не получено при сборке MacCatalyst

#swift #xcode #cloudkit #mac-catalyst

#swift #xcode #cloudkit #mac-catalyst

Вопрос:

Мое приложение получает CKQueryNotification от CKQuerySubscription обычно на iOS или iPadOS, но с MacCatalyst с тем же идентификатором пакета (сгенерированным из Xcode 11.6), оно никогда не получает CKQueryNotification , даже если

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
  

вызывается должным образом при запуске приложения — всякий раз, когда происходит изменение записи в CloudKit, метод

 func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Swift.Void)
  

никогда не запускается при сборке MacCatalyst, в то время как в iOS он запускается немедленно.

Есть идеи, почему? На форуме Apple есть тема, но пока не вижу решения:https://developer.apple.com/forums/thread/125069

Ответ №1:

Для всех, кто также сталкивается с этой проблемой при разработке вашего приложения, я решил опубликовать приложение в любом случае и обнаружил, что в версии App Store на Mac приложение catalyst на самом деле может получать уведомления почти немедленно. Похоже, это ошибка среды отладки для CloudKit.

Ответ №2:

Вы предоставляете недостаточно кода, чтобы мы могли вам помочь, поэтому я попробую предположить. Попробуйте определить ваши значения notificationInfo следующим образом и посмотрите, имеет ли это значение. Внутри didRegisterForRemoteNotifications:

     // This is your subscription object
    let subscription = CKQuerySubscription(recordType: "Subscription", predicate: NSPredicate(format: "TRUEPREDICATE"), options: [.firesOnRecordCreation, .firesOnRecordUpdate])
    
    // Here we customize the notification message
    let info = CKSubscription.NotificationInfo()

    info.shouldSendContentAvailable = true
    info.desiredKeys = ["identifier", "title", "date"]
    info.soundName = ""
    info.alertBody = ""
    info.title = ""
    info.alertActionLocalizationKey = ""

    // Assign the notification info to your subscription
    subscription.notificationInfo = info
  

Комментарии:

1. Извините, я уже делаю это, и db.fetchAllSubscriptions правильно возвращает подписки