Вот еще несколько вещей, которые вы можете проверить:
= 1 =
Убедитесь, что контейнер CloudKit, определенный в вашем коде, является тем же, к которому вы обращаетесь на панели мониторинга CloudKit. Иногда мы пропускаем то, что выбрали в Xcode как контейнер CloudKit, когда создаем и тестируем несколько контейнеров.
= 2 =
Проверьте вкладку Подписки на панели инструментов CloudKit и убедитесь, что ваша подписка Person
создается при запуске приложения. Если вы видите это, попробуйте удалить его в CK Dashboard, а затем снова запустите ваше приложение и убедитесь, что оно снова появляется.
= 3 =
Проверьте журналы в CK Dashboard. Они будут показывать запись в журнале типа push
всякий раз, когда отправляется push-уведомление. Если он регистрирует это при обновлении / добавлении записи в CK Dashboard, то вы знаете, что проблема связана с вашим устройством.
= 4 =
Помните, что push-уведомления не работают в симуляторе iOS. Вам нужно реальное устройство (или Mac, если вы создаете приложение macOS).
= 5 =
Благодаря обширному тестированию, я обнаружил, что уведомления более надежны, если вы всегда устанавливаете alertBody
, даже если оно пустое. Как это:
let info = CKSubscription.NotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = "" //This needs to be set or pushes don't always get sent
subscription.notificationInfo = info
= 6 =
Для приложения iOS мой представитель приложения обрабатывает уведомления, подобные этому:
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//Ask Permission for Notifications
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound], completionHandler: { authorized, error in
DispatchQueue.main.async {
if authorized {
UIApplication.shared.registerForRemoteNotifications()
}
}
})
return true
}
//MARK: Background & Push Notifications
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: \(sub)")
}
}
//After we get permission, register the user push notifications
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
//Add your CloudKit subscriptions here...
}
}
Получение разрешения для уведомлений не требуется, если вы выполняете только фоновые нажатия, но для всего, что пользователь видит в форме всплывающего уведомления, вы должны получить разрешение. Если ваше приложение не запрашивает такое разрешение, попробуйте удалить его с устройства и снова собрать в Xcode.
Удачи! :)