CloudKit CKS подписка без уведомлений?

Я пишу приложение Swift с CloudKit. Когда запись изменяется в CloudKit устройством, я хочу, чтобы соответствующие записи обновлялись в локальном хранилище других устройств без отображения push-уведомления.

Нужно ли мне звонить registerUserNotificationSettings в didFinishLaunchingWithOptions (это означает, что пользователь должен принимать уведомления для моего приложения), даже если я не планирую показывать какое-либо push-уведомление?

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))

Ответ 1

Да, вам нужно позвонить registerUserNotificationSettings, даже все, что вам нужно, - это фоновое удаленное уведомление. Поэтому пользователь будет запрашивать разрешение на уведомления. Это не имеет никакого смысла, поскольку пользователи не будут видеть уведомления, но это как.

Я использую это для его настройки:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let settings = UIUserNotificationSettings(forTypes: .None , categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() }

Убедитесь, что при вызове CloudKit saveSubscription вы предоставляете shouldSendContentAvailable = true. Следующий код предназначен для подписки на пользовательскую зону:

let subscription = CKSubscription(zoneID:zoneID, options: CKSubscriptionOptions(rawValue: 0))

let notificationInfo = CKNotificationInfo()
notificationInfo.shouldSendContentAvailable = true

subscription.notificationInfo = notificationInfo

CKContainer.defaultContainer().privateCloudDatabase.saveSubscription(subscription) { subscription, error in
}

Вам также необходимо включить функцию "Фоновые режимы" в Xcode для вашего проекта и отметить галочкой "Удаленные уведомления".

Пользователь может перейти в приложение "Настройки", чтобы отключить уведомления для вашего приложения. Но вы можете получать триггер удаленного уведомления сервером CloudKit.

Внедрите в AppDelegate следующие функции для получения удаленных уведомлений:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {}

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {}

Ответ 2

В этом случае вам не нужно вызывать registerUserNotificationSettings.

Вам нужно добавить параметр Info.plist "Требуемый фоновый режим" (UIBackgroundModes), "Приложение загружает контент в ответ на push-уведомления" (remote-notification). А также позвоните registerForRemoteNotifications. Наконец, установите notificationInfo.shouldSendContentAvailable = YES; в своей подписке.

Теперь, когда ваше приложение запускается, чтобы отвечать на все уведомления, вам нужно быть осторожным, чтобы обрабатывать случай, когда уведомление пропущено, вы можете использовать режим самолета, чтобы проверить, что доставлено только последнее.

Обратите внимание, что после того, как вы создали свою подписку с любого устройства, application:didReceiveRemoteNotification:fetchCompletionHandler: будет вызываться на всех устройствах, использующих одну учетную запись iCloud, и установить приложение.