Локальные уведомления, отправленные в фоновый режим, работают в симуляторе, но не на устройстве

В симуляторе я могу получить точный результат, который хочу: когда я запускаю уведомление, а мой телефон-симулятор заблокирован, уведомление отправляется на часы.

Раньше это работало на устройстве (мой iPhone 6 на iOS 9.1 и Watch на watchOS 2.0). По какой-то причине он перестал работать, и я не знаю, как отладить проблему.

Итак, на устройстве я убеждаюсь, что приложение находится в фоновом режиме, перейдя на главный экран, заблокировав телефон и убедившись, что мои часы спят. При срабатывании уведомления ничего не происходит. Когда я открываю приложение, уведомления наконец срабатывают. т.е. если я запускаю 3 уведомления, ни одно из них не регистрируется, пока я не открою приложение обратно на передний план. Это не так, как это работает в симуляторе (симулятор имеет правильное поведение, описанное выше).

Уведомление запускается, когда я изменяю текстовый объект, который хранится в моей базе данных Firebase. Изменение вызывает функцию sendNotification. Опять же, это отлично работает в симуляторе и раньше работало на устройстве, но по какой-то причине больше не работает.

В делегате приложения у меня есть:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))

    // Setting up Local Notification
    let assistAction = UIMutableUserNotificationAction()
    assistAction.activationMode = UIUserNotificationActivationMode.Background
    assistAction.identifier = categoryID
    assistAction.title = "Assist"
    assistAction.authenticationRequired = false
    assistAction.destructive = false

    // Category
    let assistCategory = UIMutableUserNotificationCategory()
    assistCategory.identifier = categoryID
    assistCategory.setActions([assistAction], forContext: UIUserNotificationActionContext.Default)

    // Only way to get this to work with parameter
    let categories = NSSet(object: assistCategory)

    // Settings
    let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: categories as? Set<UIUserNotificationCategory>)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
    //        UIApplication.sharedApplication().registerForRemoteNotifications()


    return true
}

Затем в моем контроллере представления у меня есть:

func sendNotification(customerName: String, helpText: String) {
    // Local Notification
    let notification = UILocalNotification()
    notification.alertBody = "\(customerName) \(helpText)"
    notification.soundName = UILocalNotificationDefaultSoundName
    notification.fireDate = NSDate()
    notification.category = categoryID
    UIApplication.sharedApplication().presentLocalNotificationNow(notification)
    print("Sent notification");
}

person Marco Chiang    schedule 27.10.2015    source источник
comment
вы смогли решить эту проблему?   -  person rahul    schedule 15.12.2015
comment
Я сделал! Только что ответил на свой вопрос ниже.   -  person Marco Chiang    schedule 17.12.2015


Ответы (1)


Симулятор работает иначе, чем устройство. Странно, что локальные уведомления симулятора действовали как удаленные push-уведомления.

В итоге я отказался от попыток отображать локальные уведомления, пока приложение находится в фоновом режиме на устройстве, потому что я узнал, что это не ожидаемое поведение.

Правильное решение — просто настроить удаленное push-уведомление, для чего я использовал Parse. И теперь он работает так, как ожидалось. У меня есть веб-сервер, который использует Parse REST API для отправки запроса POST в Parse, а затем мое приложение iOS настроено на получение удаленных push-уведомлений, которые теперь отображаются на моих часах, когда мой телефон заблокирован.

person Marco Chiang    schedule 17.12.2015