CloudKit CKS подписка без уведомлений?
Я пишу приложение Swift с CloudKit. Когда запись изменяется в CloudKit устройством, я хочу, чтобы соответствующие записи обновлялись в локальном хранилище других устройств без отображения push-уведомления.
Мне нужно позвонить registerUserNotificationSettings
в didFinishLaunchingWithOptions
(имеется в виду, что пользователь должен принимать уведомления для моего приложения), даже если я не планирую показывать какие-либо push-уведомления?
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))
2 ответа
Да, вам нужно позвонить 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]) {}
В этом случае вам не нужно звонить registerUserNotificationSettings
,
Вам необходимо добавить параметр Info.plist "Требуемый фоновый режим" (UIBackgroundModes
), "Приложение загружает контент в ответ на push-уведомления" (remote-notification
). А также позвонить registerForRemoteNotifications
, Наконец, установите notificationInfo.shouldSendContentAvailable = YES;
в вашей подписке.
Теперь, когда ваше приложение запускается для ответа на все уведомления, вам нужно быть осторожным, чтобы обработать случай, когда уведомление пропущено, вы можете использовать режим полета, чтобы проверить это, только последнее доставлено.
Обратите внимание, как только вы создали свою подписку с любого устройства, application:didReceiveRemoteNotification:fetchCompletionHandler:
будет вызываться на всех устройствах, использующих одну и ту же учетную запись iCloud и на которых установлено приложение.