У меня есть два контроллера вида: 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()
единственным вызовом перед ним.