Проблемы с подпиской на CloudKit

Я борюсь со следующей подпиской:

let predicate = NSPredicate(format: "gc_alias != %@ AND distanceToLocation:fromLocation:(%K,%@) < %f",
                                self.localPlayer!.alias!,
                                "location",
                                self.currentLocation!,
                                10)


    let subscription = CKSubscription(recordType: "Player", predicate: predicate, options: .FiresOnRecordCreation)
    subscription.zoneID = nil

    let notification = CKNotificationInfo()
    notification.alertBody = "Nearby Player within Range!"
    notification.soundName = UILocalNotificationDefaultSoundName

    subscription.notificationInfo = notification

    let container = CKContainer.defaultContainer()
    let publicDb = container.publicCloudDatabase

    publicDb.saveSubscription(subscription) { (result, error) -> Void in
        if error != nil {
            print(error!.localizedDescription)
        } else {
            print("SUBSCRIBED SUCCESS")
            print(result)
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "subscribed")
        }
    }

По сути, когда создается или обновляется новая запись игрока, я регистрирую местоположение пользователя.

Я хочу, чтобы пользователь A был уведомлен через Push, когда пользователь B создает или обновляет свою запись игрока и находится в пределах 10 км.

Я полагаю, что в моем приложении правильно настроены разрешения на отправку (например, пользователю предлагается подтвердить это перед созданием его подпрограммы).

Никаких толчков не приходит. Любые идеи? Я страдаю от какого-то фундаментального заблуждения о CK?


person Genericrich    schedule 12.06.2016    source источник
comment
Не могли бы вы добавить код, где вы создаете запись CK и где вы регистрируетесь для уведомлений?   -  person diegog    schedule 18.06.2016
comment
DistanceToLocation:fromLocation:() возвращает метры, а не километры. Вам нужно пройти 10000 вместо 10.   -  person diegog    schedule 18.06.2016
comment
Диегог FTW! Метры, казалось, решили это! Удивительно, но в сети есть дезинформация по этому поводу. :|   -  person Genericrich    schedule 18.06.2016


Ответы (1)


Похоже, вы не подписываетесь на push-уведомления:

Библиотека разработчика iOS: подписка на запись изменений

Сохранение подписок в базе данных не настраивает ваше приложение автоматически на получение уведомлений при срабатывании подписки. CloudKit использует службу Apple Push Notification (APN) для отправки уведомлений о подписке в ваше приложение, поэтому ваше приложение должно зарегистрироваться для получения push-уведомлений.

Согласно Взлом с помощью Swift: доставка уведомлений с помощью Push-сообщения CloudKit: CKSubscription и saveSubscription вам следует:

Перейдите в AppDelegate.swift и поместите этот код в метод didFinishLaunchingWithOptions:

let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)
UIApplication.sharedApplication().registerForRemoteNotifications()

И

Для завершения вы можете дополнительно перехватить сообщение didReceiveRemoteNotification, отправленное вашему делегату приложения, которое вызывается, если во время работы приложения приходит push-сообщение. Что-то вроде этого должно помочь:

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    if let pushInfo = userInfo as? [String: NSObject] {
        let notification = CKNotification(fromRemoteNotificationDictionary: pushInfo)

        let ac = UIAlertController(title: "What's that Whistle?", message: notification.alertBody, preferredStyle: .Alert)
        ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))

        if let nc = window?.rootViewController as? UINavigationController {
            if let vc = nc.visibleViewController {
                vc.presentViewController(ac, animated: true, completion: nil)
            }
        }
    }
}
person diegog    schedule 17.06.2016
comment
Я регистрируюсь для уведомлений в другом месте. Я хочу знать, будет ли этот тип подписки работать для уведомления игрока A о том, что игрок B обновил свой объект Player в CK, указав местоположение, которое находится в пределах 10 км от их текущего местоположения. В моей панели инструментов с двумя учетными записями на двух тестовых устройствах я по-прежнему вижу только один тип подписки. - person Genericrich; 18.06.2016
comment
Награждение дидгога за его наблюдение выше о метрах против километров. - person Genericrich; 18.06.2016