具有FCM令牌的设备的Firebase通知已发送但未收到

我试图使用FCM令牌从firebase通知控制台向特定设备发送简单的推送通知。 firebase通知控制台将通知显示为已发送但设备未收到通知。 我已尝试发送通知,然后等待查看控制台是否从didReceiveRemoteNotification记录,但通知需要花费太长时间(小时)才能显示为在firebase控制台中发送(即使我将优先级设置为high )。

App代表

 import UIKit import Firebase import FirebaseStorage import FirebaseDatabase import FirebaseMessaging import CoreData import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // Use Firebase library to configure APIs FirebaseApp.configure() ///// // For Firebase Cloud Messaging (FCM) if #available(iOS 10.0, *) { // For iOS 10 display notification (sent via APNS) UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: {_, _ in }) } else { let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(settings) } application.registerForRemoteNotifications() // End of [for Firebase Cloud Messaging (FCM)] ///// return true } /////////////////////// // FCM Setup // Monitor token generation for FCM: Be notified whenever the FCM token is updated func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { print("Firebase registration token: \(fcmToken)") } // Monitor token generation for FCM: func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken } // Handle messages received through the FCM APNs interface func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { print("didReceiveRemoteNotification") // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // With swizzling disabled you must let Messaging know about the message, for Analytics // Messaging.messaging().appDidReceiveMessage(userInfo) // Print message ID. // gcm_message_id if let messageID = userInfo["gcmMessageIDKey"] { print("Message ID: \(messageID)") } 

^我的猜测是问题可能与“gcm_message_id”/“gcmMessageId”/“gcm.message_id”有关,因为我在下面尝试的三种方法中的每种方法都不同

  // Print full message. print(userInfo) } // Handle messages received through the FCM APNs interface func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { print("didReceiveRemoteNotification (withCompletionHandeler)") // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // With swizzling disabled you must let Messaging know about the message, for Analytics // Messaging.messaging().appDidReceiveMessage(userInfo) // Print message ID. if let messageID = userInfo["gcmMessageIDKey"] { print("Message ID: \(messageID)") } 

^我的猜测是问题可能与“gcm_message_id”/“gcmMessageId”/“gcm.message_id”有关,因为我在下面尝试的三种方法中的每种方法都不同

  // Print full message. print(userInfo) completionHandler(UIBackgroundFetchResult.newData) } // End of [FCM Setup] /////////////////////// } 

查看控制器

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Retrieve the current registration token for Firebase Cloud Messaging (FCM) let token = Messaging.messaging().fcmToken print("FCM token: \(token ?? "")") } } 

权利和启用推送通知

我添加了推送权利 看这里 并启用了推送通知的后台模式 看这里 并将GoogleService-Info.plist添加到我的项目中。

发送通知的方法

我正在从Firebase Notifications控制台创建通知(如下所示),因此通知本身的结构应该没有问题。 在此处输入图像描述

我尝试了以下方法来解决问题,但所有方法都产生了相同的结果:

  • Google Firebase文档
  • 远程通知w / firebase教程
  • Google Firebase快速入门

有谁知道为什么通知被标记为在firebase通知控制台中发送但未显示在设备上?

我在处理推送通知时使用的几个故障排除步骤如下:

  1. 首先独立于firebase服务进行推送工作。 我用这个工具。
  2. 确保您没有任何捆绑标识符命名空间冲突。 因此,例如,在设备上具有appstore构建,testflight构建和/或开发app的任何组合。 删除除应用程序的所有实例外的所有实例 捆绑包标识符是您的设备如何知道将推送通知路由到哪个应用的方式。
  3. 当所有其他方法都失败时 – 我尝试通过构建一个新的示例项目来隔离问题并将其连接到一个新的firebase项目,看看我是否可以将我的注意力集中到能够在没有任何其他业务逻辑的情况下进行推送工作应用程序。 这有助于我向自己certificate我没有疯狂,并向我certificate这不是导致我的困境的一些神秘的网络状况。

我希望这可以帮助你,因为你工作得到了所有想通。

尝试将以下代码添加到didRegisterForRemoteNotificationsWithDeviceToken func:

 Messaging.messaging().apnsToken = deviceToken 

所以它看起来像这样:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken } 

这对我有用。

有谁知道为什么通知被标记为在firebase通知控制台中发送但未显示在设备上?

因为“发送”并不意味着“收到”。

无法保证在设备上接收通知。 使用基本的APNS基础设施,如果在设备上收到或处理了通知,您甚至无法获取信息。

如果您未在设备上收到成功发送的消息,则可能有很多原因。 此外,即使您收到Firebase令牌,也不意味着您的设备在任何情况下都可以收到通知。

为了隔离问题,我建议建立最小化设置并使用没有Firebase的APNS。 您可以使用终端或NWPusher( https://github.com/noodlewerk/NWPusher )从本地macOS系统发送通知,并使用iOS本机远程推送通知框架接收通知。

请注意将APNS设备令牌转换为提交通知所需的正确格式:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.hexEncodedString() print("Token: \(token)") } 

数据扩展:

 extension Data { func hexEncodedString() -> String { return map { String(format: "%02hhx", $0) }.joined() } } 

我看到你已经完成了项目Capabilities

一些要点:

  • 使您的类符合messaging delegate如下所示:

     Messaging.messaging().delegate = self 
  • 确保您已正确设置证书并将所有内容上传到Firebase推送通知配置(非确切术语)。

  • 我已经完成了几个使用Firebase推送通知服务的应用程序,从头开始制作示例应用程序可能会帮助您弄清楚您做错了什么。

而且……这是一个更好的代码块,用于注册推送通知的应用程序。

  // Setup Push Notifications if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in if error == nil{ DispatchQueue.main.async(execute: { application.registerForRemoteNotifications() }) } } } else { let notificationTypes: UIUserNotificationType = [.sound, .alert, .badge] let notificationSettings = UIUserNotificationSettings(types: notificationTypes, categories: nil) application.registerForRemoteNotifications() application.registerUserNotificationSettings(notificationSettings) } 

我有这个确切的问题,设备行为有点奇怪。 收到了一些通知,有些则没有。

最后我发现了什么是错的。 我的设备的Sync设置已关闭。 请先检查一下,不要浪费你的时间。 在此处输入图像描述