带有 FCM 令牌的 Firebase 通知显示已发送但未收到

2023-11-26

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

应用程序委托

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 ?? "")")
      }
}

权利和启用推送通知

I have added the push entitlements see here and enabled background modes for push notifications see here and added the GoogleService-Info.plist to my project.

发送通知的方法

I am creating notification from the Firebase Notifications console (as shown below) so there should be no issue with the structure of the notification itself. enter image description here

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

  • Google Firebase 文档
  • 带 firebase 的远程通知教程
  • Google Firebase 快速入门

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


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

  1. 首先让推送独立于 Firebase 服务工作。我用这个tool.
  2. 确保您没有任何包标识符命名空间冲突。例如,在设备上应用程序商店构建、testflight 构建和/或开发构建的任意组合。删除应用程序的所有实例(仅保留一个实例)。捆绑包标识符是您的设备如何知道将推送通知路由到哪个应用程序的方式。
  3. 当所有其他方法都失败时 - 我尝试通过构建一个新的示例项目并将其连接到一个新的 firebase 项目来隔离问题,看看我是否可以将焦点缩小到能够在没有任何其他业务逻辑的情况下进行推送工作应用程序。这帮助我向自己证明我没有发疯,并向我证明这不是某种神秘的网络状况导致了我的困境。

我希望这可以帮助您在工作时弄清楚这一切。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 FCM 令牌的 Firebase 通知显示已发送但未收到 的相关文章

  • NSDateFormatter 返回错误的日期 + Swift

    Code let dateString 2016 04 02 var formatter NSDateFormatter NSDateFormatter formatter timeZone NSTimeZone abbreviation
  • UITextFieldDelegate 与 UITextField 控件事件

    如果我想处理 UITextField 的更改 例如用户在其中键入 看起来这可以通过将委托分配给该文本字段 然后让委托实现 shouldChangeCharactersInRange 来完成 或者通过将目标添加到文本字段并处理 UIContr
  • 迭代 NSOrderedSet

    我正在尝试迭代 NSOrderedSet 的实例 像这样的事情 func myFunc var orderedSet NSOrderedSet array 42 43 44 for n in orderedSet NSLog i n 但是
  • 在另一种语言中使用 dateFormatter [重复]

    这个问题在这里已经有答案了 我正在运行一段返回的代码nil在具有不同语言设置的 iPhone 上运行时 代码示例如下所示 let dateFormatter DateFormatter dateFormatter dateFormat MM
  • iOS 8 中的 UISplitViewController 状态恢复

    在 iOS 8 上 UISplitViewController 似乎可以保存和恢复其子视图的状态 例如 主视图是否隐藏 这是不可取的 因为我的应用程序应该始终以横向方式显示主视图 并始终以纵向方式隐藏它 如果用户以横向模式关闭应用程序 保存
  • Firebase 如何帮助在 Google 标签管理中触发标签

    我试图了解 firebase 对 google 标签管理的作用是什么 根据GTM文档记录事件和变量 https developers google com tag manager android v5 log events and vari
  • UICollectionView 未出现

    我正在尝试设置UICollectionView 以编程方式在我的视图控制器中扩展UIViewController 由于某种原因 我的收藏视图根本没有显示 以下是我所拥有的 为什么没有出现 我将它连接到委托和数据源并将其添加为子视图self
  • 如何从代码隐藏中设置 CarouselView 的项目?

    我有一个 CarouselView 它绑定到图像的 ItemsSource 但我想通过更改 CarouselView 的索引来更改当前显示的图像 我尝试使用 CarouselView Position 作为必须选择的元素的索引 但不幸的是这
  • 如何请求用户开启定位服务

    我需要我的应用程序来访问用户的当前位置 它在应用程序开始时检查用户是否已设置 如果没有 我需要应用程序显示提示以使其使用位置服务 就像警报视图一样 点击按钮 它应该会带您进入 iPhone 上的位置服务屏幕 您可以通过以下代码检查 loca
  • Swift 3.0 Pin 颜色注释在 MapView 中没有改变

    我有兴趣根据案例场景更改注释的图钉颜色 在一个函数中 我发送了一个数组 用于确定引脚注释的颜色 到目前为止 我已经设置了一个名为 ColorPointAnnotation 的子类 它将确定 pinColor 然后 在 switch 语句中
  • Swift getnameinfo IPv6 结果不可靠

    我有以下扩展sockaddr extension sockaddr Indicates if this is an IPv4 address var isIPv4 Bool return sa family UInt8 AF INET In
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • 无法使用 Xamarin 和 WCF 访问 Web 服务

    我想使用 Xamarin 和 WCF 来使用公共 Web 服务 对于这个演示 我将使用Xamarin iOS 这是我试图使用的 公共 网络服务 http www webservicex net globalweather asmx WSDL
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • 我可以知道 requireGestureRecognizerToFail 到底会做什么吗?

    谁能告诉我下面的代码行到底会做什么 我已经提到过Apples https developer apple com library ios documentation uikit reference UIGestureRecognizer C
  • 将数字分解为单个数字的数组

    如果我有整数 123 并且我想将数字分解为数组 1 2 3 最好的方法是什么 我已经搞乱了很多 并且我有以下工作 var number 123 var digits Array String number map Int strtoul S
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • Swift 中通过不同类调用委托方法

    我正在获取 JSON 菜单 一旦 JSON 返回 我想运行 menuReady 来更新表的内容在 SomeTableViewController 类中 但下面的代码似乎不起作用 AIM Run 菜单就绪 JSON 返回后更新内容 PROBL
  • FCM onMessageReceived 应用程序运行时返回空白消息和标题

    正如您在标题中所写 当应用程序关闭时 它运行良好 并且onMessageReceived获取消息正文和标题 但如果应用程序处于前台模式 运行模式 则可以发送通知 但没有消息和标题 请问该怎么办 代码 Override public void

随机推荐

  • OSX:PHP 本地主机错误并且无法加载动态库

    我该如何修复这个 php 错误 PHP Warning PHP Startup Unable to load dynamic library usr lib php extensions no debug non zts 20100525
  • 从 Thread.UncaughtExceptionHandler 启动服务?

    我正在尝试设置一个全局异常处理服务 如中提到的这个答案 这种方法听起来很合乎逻辑 因为崩溃后 我的自定义中的代码Thread UncaughtExceptionHandler可能无法成功执行 要么是因为应用程序可能未处于稳定状态 要么是因为
  • Python matplotlib -> 3D 条形图 -> 调整刻度标签位置,透明条

    我正在尝试使用 Matplotlib 中的 bar3d 在 Python 中创建 3D 条形直方图 我已经到了可以在传递一些数据后在屏幕上显示直方图的地步 但我陷入了以下困境 正确显示轴标签 当前错过了最终 或初始 刻度标签 要么使每个轴上
  • Android GridView 多选

    我已经实现了 GridView 并激活了 mGridView setChoiceMode GridView CHOICE MODE MULTIPLE MODAL 模式 现在 当我长按一个项目时 我可以从网格中选择多个项目 我想通过正常的短暂
  • 使用数据存储防止内存泄漏的最佳实践是什么?

    我尝试使用数据存储首选项 alpha07 来存储和获取数据 一切正常 我在数据存储中遇到了一些内存泄漏问题 使用数据存储防止内存泄漏的最佳实践是什么 这是我的示例代码 Preferences DataStore implementation
  • 如何从 Wildfly (Jboss) 访问 ws 端点的 CXF jar

    我尝试在 Wildfly 8 2 中部署我的 war 文件 我的应用程序使用 org apache cxf 进行 Web 服务 但 Wildfly Jboss 默认带有自己的 cxf jar 可以提供完整的 Java EE 支持 我可以消除
  • 使用 Flask-SQLAlchemy 反射表会引发 RuntimeError:应用程序未注册

    我有一个 SQLite 数据库来管理用户登录 还有一个现有的 MySQL 数据库 我将 MySQL 数据库添加到 Flask SQLAlchemySQLALCHEMY BINDS配置 当我尝试反映表格时 出现以下错误 RuntimeErro
  • R 中的多面板标题

    我有一个关于 R 的超简短问题 我的目标是为使用 par 生成的多面板图分配一个通用标题 例如 par mfrow c 1 2 plot rnorm 1000 plot rnorm 1000 因此 类似于绘图函数的 main 但扩展到两个绘
  • 使用多列的 Pandas DataFrame 聚合函数

    有没有办法编写一个聚合函数 如DataFrame agg方法 该方法可以访问正在聚合的多列数据 典型的用例是加权平均值 加权标准差函数 我希望能够写出类似的东西 def wAvg c w return c w sum w sum df Da
  • 如何避免此结构定义中出现 PhantomData?

    我有一个看起来像这样的特征 trait Handler
  • 使用 Google C++ Mocking Framework (Google Mock) (V1.5) 将任意参数传递给调用的方法

    我有一个模拟方法 当它被调用时 我希望它在调用其正常行为之前调用另一个函数 就像是 EXPECT CALL my obj MockedMethod WillOnce DoAll Invoke my obj SomeAdditionalMet
  • 你能在Python中创建多个“if”条件吗? [复制]

    这个问题在这里已经有答案了 在 JavaScript 中 可以这样做 if integer gt 3 integer lt 34 document write Something 这在Python中可能吗 Python确实允许你做这样的事情
  • 如何删除伪元素上的下划线?

    在 Chrome 和 Firefox 上 如果我在标签上应用 text decoration underline 默认情况下下划线不适用于伪元素 但在 IE 上确实如此 而且我无法删除它 我希望链接带有下划线 但不是伪元素 如果我在里面添加
  • 一个类的对象(使用单/多重继承)有多少个vptr?

    对于一个其 clas child 具有单一继承且基类多重继承 base1 和 base2 的对象 通常需要多少个 vptr 如果一个对象具有单继承和多继承 那么识别它有多少 vptr 的策略是什么 虽然标准没有指定有关 vptr 的内容 但
  • 如何使用 kubernetes Ingress 执行自定义身份验证

    我在 kubernetes 中部署了一些服务 并使用 NGINX 入口访问外部 使用 EC2 实例进行所有集群设置 能够通过与入口绑定的主机访问服务 现在 我不再直接访问 svc 而是尝试在访问服务之前添加身份验证 并重定向到登录页面 用户
  • 仅通过 URL 提交网络表单?

    我不太确定这属于这里 所以不要投反对票 只是让我知道是否是这样 我会很快继续前进 无论如何 有一个website有一个搜索页面 当点击搜索按钮时 它不会在 URL 中包含搜索查询 搜索内容后 页面会重定向到ssearch asp 但正如所说
  • 将 3 元素元组列表转换为字典

    如果我有两个元组列表 tuple2list 4 21 5 10 3 8 6 7 tuple3list 4 180 21 5 90 10 3 270 8 6 0 7 我如何将其转换为字典 如下所示 tuple2list2dict 4 21 5
  • 当 Oreo 中的服务被销毁时,防止通知被驳回

    好的 我有一个关于在 Android Oreo 中保留媒体播放器服务的问题 基于这里的讨论 Android Oreo 保持已启动的后台服务处于活动状态而不将其设置为前台 但有通知 在 Android Oreo 中处理媒体播放器服务的正确方法
  • 如何使用 EF 6.1 Fluent API 创建空间索引

    嗯 问题已经很清楚了 是否可以创建空间索引使用实体框架 6 1 流畅的 API 我知道做到这一点的唯一方法是通过 自定义 迁移 在 EF6 中 我添加了一个迁移 在下面的示例中 它被命名为 V1 从而生成一个具有空 Up 和 Down 方法
  • 带有 FCM 令牌的 Firebase 通知显示已发送但未收到

    我正在尝试使用 FCM 令牌从 firebase 通知控制台向特定设备发送简单的推送通知 firebase 通知控制台显示已发送的通知 但设备未收到该通知 我尝试发送通知 然后等待查看控制台是否从didReceiveRemoteNotifi