2015-10-27 6 views
1

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

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

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

Уведомление инициируется мной, меняя текстовый объект, который хранится в моей Firebase db. Это изменение вызывает функцию 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"); 
} 
+0

Вы могли решить эту проблему? – rahul

+0

Я сделал! Просто ответил на мой вопрос ниже. –

ответ

0

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

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

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

Смежные вопросы