launchOptions всегда равен нулю при запуске из уведомления pu sh - PullRequest
1 голос
/ 31 января 2020

Я отправляю уведомления pu sh из приложения Django (используя django -pu sh -notifications ) в приложение iOS. Приложение предназначено для iOS 13, и я запускаю его на iPhone 7 под управлением iOS 13.3.1. Я отлаживаю в Xcode 11.3.1

Я пытаюсь двумя разными способами отправить уведомление со стороны Django:

Метод 1:

devices.send_message(message={"title" : title, "body" : message}, thread_id="events", extra={"foo": "bar"})

Метод 2:

devices.send_message("[will be overwritten]", extra={
    "aps": {
        "alert": {
            "title": "Bold text in the notification",
            "body": "Second line in the notification"
        },
        "sound": "default",
    },
    "foo": "bar"
})

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

Я отлаживаю, выполняя следующее:

  1. Установить "ожидание запуска исполняемого файла" в схеме моего устройства
  2. Сборка и запуск в Xcode
  3. Убедитесь, что приложение было убито в переключателе задач
  4. Запуск отправки удаленного уведомления
  5. Нажмите на полученное уведомление для запуска приложения

Независимо от того, что я делаю, launchOptions всегда равен нулю. Я попытался установить точку останова для проверки переменных. Я попытался использовать os_log для входа в консоль, если launchOptions не равен nil, и я попытался вызвать предупреждение (следуя совету из этот вопрос ), чтобы исключить вмешательство отладчика Xcode. Это всегда ноль.

Мой AppDelegate в настоящее время выглядит следующим образом:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let notificationOption = launchOptions?[.remoteNotification]

    let alert = UIAlertController(title: "Your title", message: notificationOption.debugDescription, preferredStyle: .alert)
    let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
    })
    alert.addAction(cancel)
    DispatchQueue.main.async(execute: {
        application.windows.first!.rootViewController?.present(alert, animated: true, completion: nil)

    })
    return true
}

Предупреждение срабатывает, но содержимое предупреждения просто читает "ноль".

Я не могу выяснить, чего не хватает. Вполне возможно, что мои полезные данные уведомлений не совсем такие, как я думаю (на странице Github я запросил уведомления django -pu sh, чтобы подтвердить наличие проблем с этой целью). Также возможно, что я пропустил шаг в настройке удаленных уведомлений, но я действительно получаю уведомления, и они отображаются так, как я ожидаю, поэтому они, кажется, работают.

Любой совет, который высоко ценится!

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Кажется, что после изменений в iOS 13 нам не нужно обрабатывать уведомления в didFinishLaunchingWithOptions функции.

Мы можем просто использовать:

extension AppDelegate: UNUserNotificationCenterDelegate{
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        let userInfo = response.notification.request.content.userInfo

        if let aps = userInfo["aps"] as? [String: AnyObject] {
            // Do what you want with the notification
        }

      completionHandler()
    }
}

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

1 голос
/ 04 февраля 2020

Я не нашел решения этой проблемы, но я нашел обходной путь. Я до сих пор не знаю, почему launchOptions всегда был равен нулю, но я смог получить доступ к полезной нагрузке, выполнив следующие действия:

В AppDelegate.swift:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        UNUserNotificationCenter.current().delegate = self
        return true
    }

...

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let actionIdentifier = response.actionIdentifier

        switch actionIdentifier {
        case UNNotificationDismissActionIdentifier: // Notification was dismissed by user
            // Do something
            completionHandler()
        case UNNotificationDefaultActionIdentifier: // App was opened from notification
            // Do something
            completionHandler()
        default:
            completionHandler()
        }
    }

Если затем установить точку останова в userNotificationCenter, я смогу извлечь полезную нагрузку уведомления: Debugger screen shot (breakpoint)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...