Firebase iOS 推送通知在首次安装时不起作用
Firebase iOS Push Notifications not working on first install
当我第一次安装并打开应用程序并接受来自 Apple 的通知权限警告时,我从 Firebase 得到了这个日志:
5.16.0 - [Firebase/InstanceID][I-IID023004] Could not update attributes of the key pair to be accessible after first unlock. update
status: -25300
之后,如果我关闭应用程序或将应用程序发送到后台,我将不会收到任何通知。如果我再次打开该应用程序,通知将开始正常工作。
这是我当前的设置:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
setupPushNotificationsHandling(application)
return true
}
private func setupPushNotificationsHandling(_ application: UIApplication) {
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, _) in
guard granted else { return }
DispatchQueue.main.async {
application.registerForRemoteNotifications()
FirebaseApp.configure()
InstanceID.instanceID().instanceID { (result, _) in
// Receive notifications from the "all" topic
Messaging.messaging().subscribe(toTopic: "all")
}
}
}
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("response \(response)")
completionHandler()
}
我就是这样解决的。
- 在尝试订阅通知主题之前,我等到委托方法
application:didRegisterForRemoteNotificationsWithDeviceToken:
被调用。
- 我重试,直到调用
InstanceID.instanceID().instanceID
returns 一个有效的设备令牌。
完成设置:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
setupPushNotificationsHandling(application)
return true
}
private func setupPushNotificationsHandling(_ application: UIApplication) {
FirebaseApp.configure()
application.registerForRemoteNotifications()
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (_, _) in }
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Receive notifications from the "all" topic
subscribeToNotificationsTopic(topic: "all")
}
func subscribeToNotificationsTopic(topic: String) {
// Retry until the notifications subscription is successful
DispatchQueue.global().async {
var subscribed = false
while !subscribed {
let semaphore = DispatchSemaphore(value: 0)
InstanceID.instanceID().instanceID { (result, error) in
if let result = result {
// Device token can be used to send notifications exclusively to this device
print("Device token \(result.token)")
// Subscribe
Messaging.messaging().subscribe(toTopic: topic)
// Notify semaphore
subscribed = true
semaphore.signal()
}
}
// Set a 3 seconds timeout
let dispatchTime = DispatchTime.now() + DispatchTimeInterval.seconds(3)
_ = semaphore.wait(timeout: dispatchTime)
}
}
}
我遇到了同样的问题并使用@AlejandroCotilla 的回答解决了。请注意,在 Firebase 8.10.0 版本中,“InstanceID.instanceID().instanceID ..”已重命名为“Installations.installations().installationID ..”.
当我第一次安装并打开应用程序并接受来自 Apple 的通知权限警告时,我从 Firebase 得到了这个日志:
5.16.0 - [Firebase/InstanceID][I-IID023004] Could not update attributes of the key pair to be accessible after first unlock. update status: -25300
之后,如果我关闭应用程序或将应用程序发送到后台,我将不会收到任何通知。如果我再次打开该应用程序,通知将开始正常工作。
这是我当前的设置:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
setupPushNotificationsHandling(application)
return true
}
private func setupPushNotificationsHandling(_ application: UIApplication) {
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, _) in
guard granted else { return }
DispatchQueue.main.async {
application.registerForRemoteNotifications()
FirebaseApp.configure()
InstanceID.instanceID().instanceID { (result, _) in
// Receive notifications from the "all" topic
Messaging.messaging().subscribe(toTopic: "all")
}
}
}
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("response \(response)")
completionHandler()
}
我就是这样解决的。
- 在尝试订阅通知主题之前,我等到委托方法
application:didRegisterForRemoteNotificationsWithDeviceToken:
被调用。 - 我重试,直到调用
InstanceID.instanceID().instanceID
returns 一个有效的设备令牌。
完成设置:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
setupPushNotificationsHandling(application)
return true
}
private func setupPushNotificationsHandling(_ application: UIApplication) {
FirebaseApp.configure()
application.registerForRemoteNotifications()
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (_, _) in }
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Receive notifications from the "all" topic
subscribeToNotificationsTopic(topic: "all")
}
func subscribeToNotificationsTopic(topic: String) {
// Retry until the notifications subscription is successful
DispatchQueue.global().async {
var subscribed = false
while !subscribed {
let semaphore = DispatchSemaphore(value: 0)
InstanceID.instanceID().instanceID { (result, error) in
if let result = result {
// Device token can be used to send notifications exclusively to this device
print("Device token \(result.token)")
// Subscribe
Messaging.messaging().subscribe(toTopic: topic)
// Notify semaphore
subscribed = true
semaphore.signal()
}
}
// Set a 3 seconds timeout
let dispatchTime = DispatchTime.now() + DispatchTimeInterval.seconds(3)
_ = semaphore.wait(timeout: dispatchTime)
}
}
}
我遇到了同样的问题并使用@AlejandroCotilla 的回答解决了。请注意,在 Firebase 8.10.0 版本中,“InstanceID.instanceID().instanceID ..”已重命名为“Installations.installations().installationID ..”.