Токен FCM не получен, если произошел переход - PullRequest
0 голосов
/ 15 июня 2019

У меня есть два контроллера вида: A и B.

В контроллере представления B viewDidLoad первое, что я делаю, - создаю экземпляр пользовательского класса NotificationsHandler, конструктор которого регистрируется в iOS и FCM для уведомлений. Это работает нормально только , если я запускаю приложение непосредственно на контроллере представления B. Под отлично работает, я имею в виду, что didReceiveRegistrationToken вызывается с моим токеном FCM, и я могу затем отправлять уведомления своему экземпляру приложения, используя этот токен. Все работает.

Однако контроллер представления A содержит кнопку, действие которой только вызывает переход для просмотра контроллера B. Когда приложение запускается на vc A и переход к vc B запускается с помощью этой кнопки, конструктор класса NotificationsHandler работает как обычно, но метод FCM didReceiveRegistrationToken никогда не вызывается.

Между этими двумя контроллерами представления не передаются значения, а конструктор NotificationsHandler не принимает аргументов. Разрешения на уведомления предоставляются. Кажется, что это единственное, что определяет, будет ли didReceiveRegistrationToken вызван. Это похоже на красную сельдь, но это единственное, что меняется, о чем я могу думать.

Вот конструктор для класса NotificationsHandler. Этот класс реализует MessagingDelegate (из библиотеки FireBase) и UNUserNotificationCenterDelegat e.

private override init(){

        super.init()

        UNUserNotificationCenter.current().delegate = self

        Messaging.messaging().delegate = self

        DispatchQueue.main.async {

            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            appDelegate.application!.registerForRemoteNotifications()
            print("registered")

        }

    }

Обратите внимание, что «зарегистрированный» печатается каждый раз, но FCM didReceiveRegistrationToken вызывается сразу после этого, только если мы не перешли непосредственно перед вызовом этого конструктора.

Этот экземпляр NotificationsHandler является статическим экземпляром, созданным путем вызова NotificationsHandler.shared.enabled = true во второй строке vc B viewDidLoad, с super.viewDidLoad() единственным вызовом перед ним.

...