【问题标题】:Firebase FCM on IOS 10 clarificationFirebase FCM 关于 IOS 10 的说明
【发布时间】:2019-10-08 04:00:57
【问题描述】:

有没有人可以阐明使用 Swift 4.2 的 FCM 所需的方法,IOS 目标 >= 10 简化: 1)没有直接的“数据”消息……。仅通过 APNS 通知/提醒消息 2) 即使某些教程(没有解释原因)告诉我将其关闭,我仍将启用 Swizzling

我发现 IOS 弃用问题和 FCM 方面的一些文档遗漏使这种方式比它需要的更加混乱。

我们能否得到一个简单的矩阵,例如: 应用状态 |关闭|背景 |前景 |

用户操作: 无(简单消息到达 IOS) 解雇通知 点击通知 选择通知操作 直接打开应用——不参与通知

在上述场景中调用的方法是: 等等……

此外,无论 APNS 是否已发送令牌,FCM 似乎都会创建自己的令牌;所以我需要不同的逻辑来检测用户是否已授予权限,然后我的服务器才能假定 FCM 令牌完全可以工作……我想我只是在确定我有一个 APNS 令牌之前不会将 FCM 令牌发送到服务器…… ???

此外,FCM 文档清楚地表明用户可见(即警报/通知样式)有效负载是通过 APNS/Apple 交付的。

因此,我认为我可以假设在 Apple 向我发送 APNS 令牌之后,FCM 消息才会到达。

但我似乎无法从 FCM 委托方法读取或检索 Apple 令牌。

此代码始终为 apns 返回一个空字符串,因此我无法判断我的应用是否处于可靠状态:

@objc func 消息(_ 消息:消息,didReceiveRegistrationToken fcmToken:字符串){ print("Firebase 注册令牌:(fcmToken)") 让 apnsTokenData = 消息传递.apnsToken 让 apnsToken = apnsTokenData?.reduce("", {$0 + String(format: "%02X", $1)}) ?? “” print("apnsToken:(apnsToken)")

感谢您的澄清!

【问题讨论】:

    标签: ios swift firebase firebase-cloud-messaging


    【解决方案1】:

    以下是 APNS with firebase 必须实现的功能

    • 注册推送通知
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
     UNUserNotificationCenter.current().requestAuthorization(
       options: authOptions,
       completionHandler: {_, _ in })
    application.registerForRemoteNotifications()
    
    • 接收 FCM 令牌
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    }
    
    • 在后台接收通知时: 如果您的应用在后台状态下收到通知,则单击该通知会将通知的内容传递给底层函数。
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
      // 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.
    
    }
    
    
    • 当接收应用处于前台状态时: 如果您的应用在 Foreground 状态下收到通知,则单击该通知会将通知的内容传递给底层函数。
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center
           willPresentNotification:(UNNotification *)notification
             withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    
    }
    
    

    问。即使某些教程(未解释原因)告诉我将其关闭,我仍将启用 Swizzling: A. 方法 Swizzling 用于将 fcm 令牌映射到 apns 令牌。如果你关闭了method swizzling,你需要将fcm token显式映射到apns token,如下代码

      Messaging.messaging().apnsToken = deviceToken
    
    

    问。我们能否得到一个简单的矩阵,例如: AppState |关闭|背景 |前景 |: 对于任何应用程序状态,回调函数已经存在于 Appdelegate 中。

    【讨论】:

    • 这很有帮助...谢谢!两点:您说:“对于任何应用程序状态,回调函数已经存在于 Appdelegate 中”这意味着它是应用程序委托而不是 FCM 或通知中心委托接收通知消息......这对 IOS >=10 来说是令人困惑的另外,我在上面的问题中添加了关于阅读 APNS 令牌以及是否有必要的问题,感谢您的帮助!!
    • 我注意到您在调用之前不会等待“requestAuthorization”返回:application.registerForRemoteNotifications() 这意味着即使没有 IOS 权限,苹果也会向您发送 APNS 令牌让你看到结果通知?真的吗??所以我猜这些只是应用程序在前台时到达的通知
    • 关于我的第一点,您似乎将新旧模式混合在一起: willPresentNotification 是新的, didReceiveRemoteNotification() 是旧的 我认为交互式回调应该使用: didReceive response like ... userNotificationCenter( _ center : UNUserNotificationCenter , didReceive 响应: UNNotificationResponse , withCompletionHandler completionHandler: @escaping () -> Void)
    • 是否有任何通知通过 launchOptions 到达??
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2019-08-29
    相关资源
    最近更新 更多