UNUserNotificationCenter didReceive / willPresent не активирован ios 11 - PullRequest
1 голос
/ 09 июля 2019

У меня есть работающее приложение с уведомлениями, которые хорошо отображаются.Теперь я хотел бы обработать какое-либо событие в уведомлении, например, когда пользователь нажимает на баннер.

Моя цель развертывания iOS - 11,0 и то же самое для моей цели развертывания.

Я реализовал все в своемФайл AppDelegate.swift:

    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, RCTBridgeDelegate {
var window: UIWindow?
  var didFinishLaunching: Bool = false

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

    let bridge = RCTBridge(delegate: self, launchOptions: launchOptions)
    let rootView = RCTRootView(bridge: bridge, moduleName: "root", initialProperties: nil)
    rootView?.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1)

    self.window = UIWindow(frame: UIScreen.main.bounds)

    let rootViewController = UIViewController()
    rootViewController.view = rootView
    self.window?.rootViewController = rootViewController
    self.window?.makeKeyAndVisible()

    didFinishLaunching = true

    Fabric.with([Crashlytics.self])

    FirebaseApp.configure()


    // This block is necessary to ask user authorization to receive notification
    if #available(iOS 10.0, *) {
      let center = UNUserNotificationCenter.current()
      center.delegate = self
      center.requestAuthorization(options: [.badge, .sound, .alert], completionHandler: {(grant, error)  in
        if error == nil {
          if grant {
            print("### permission granted")
            application.registerForRemoteNotifications()
          } else {
            //User didn't grant permission
          }
        } else {
          print("error: ",error)
        }
      })
    } else {
      // Fallback on earlier versions
      let notificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
      application.registerUserNotificationSettings(notificationSettings)
    }

    self.firstLaunchAction()
    self.initTracker()

    RNSplashScreen.showSplash("LaunchScreen", inRootView: rootViewController.view)

    return true
  }



  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenParts = deviceToken.map { data -> String in
      return String(format: "%02.2hhx", data)
    }
    let token = tokenParts.joined()
    print("### Device Token: \(token)")
  }

  func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("### Failed to register for remote notifications with error: \(error)")
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
            if response.actionIdentifier == "like" {
                  print("### Handle like action identifier")
              } else if response.actionIdentifier == "save" {
                  print("### Handle save action identifier")
              } else {
                  print("### No custom action identifiers chosen")
              }
            // Make sure completionHandler method is at the bottom of this func
            completionHandler()
        }

Как вы можете видеть, я использую Firebase для отправки удаленных уведомлений, поэтому у меня есть полезная нагрузка в json, например:

return {
        notification: {
            title,
            body
        },
        data: {
            title,
            body,
            ...data
        },
        android: {
            ttl: 3600 * 1000,
            notification: {
                icon: 'stock_ticker_update',
                color: '#002559'
            }
        },
        apns: {
            payload: {
                aps: {
                    alert: {
                        title: 'NITL ACUMEN BI RFS CODA Dev Offshore',
                        body: 'Send a Message - PN testing group'
                    },
                    sound: 'default'
                }
            }
        },
        condition
    };

Большая часть моего кодаскопировано с сайта.Но на самом деле мое поведение таково, что когда я нажимаю на баннер уведомления, ничего не происходит ...

Я вижу баннер уведомления, поэтому я думаю, что с моей регистрацией APN проблем нет.Я не знаю, почему didReceive не срабатывает при событии щелчка.

Я что-то пропустил в своей реализации?Полезная нагрузка для моего уведомления неверна?

Может ли кто-нибудь помочь мне выяснить, где моя ошибка?Я прочитал бесконечное количество уроков без результатов.Некоторая помощь будет очень признательна, спасибо :)

1 Ответ

0 голосов
/ 09 июля 2019

Для поддержки уведомления об обновлении в фоновом режиме убедитесь, что словарь aps полезных данных содержит ключ content-available со значением 1.

{
   "aps" : {
       "content-available" : 1,
       "sound" : “default"
       ....
   },
   ....
}

Когда уведомление пользователя об обновлении в фоновом режиме доставляется на устройство пользователя, iOS запускает приложение в фоновом режиме и дает ему 30 секунд для запуска. В iOS система доставляет уведомления об обновлениях в фоновом режиме, вызывая метод application: didReceiveRemoteNotification: fetchCompletionHandler: делегата приложения.

Ссылка: Создание полезной нагрузки удаленного уведомления

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