当前位置: 首页 > 知识库问答 >
问题:

IOS 10上的Firebase FCM澄清

宗安宁
2023-03-14

是否有人可以使用IOS目标为的Swift 4.2澄清FCM所需的方法

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

我们可以得到一个简单的矩阵,比如:AppState | closed | background | foreground|

userAction:none(简单消息到达IOS)取消通知点击通知选择通知操作直接打开应用程序-不参与通知

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

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

此外,FCM文件明确指出,用户可见(即警报/通知样式)有效载荷通过APNS/Apple交付。

因此,我认为我可以假设FCM消息在苹果给我发送APNS令牌之前不会到达。

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

这段代码总是返回一个空字符串apns,所以我不能告诉我的应用程序是否处于可靠的状态:

@Objc func消息传递(_消息传递:消息传递,didReceiveAuthstrationToken fcmToken: String){print("Firebase注册令牌:(fcmToken)")let apnsTokenData=messaging.apns令牌let apnsToken=apnsTokenData?。减少("", {$0字符串(格式:"X",1美元)})??"打印("apnsToken:(apnsToken)")

谢谢你的澄清!

共有1个答案

秦才
2023-03-14

以下是使用firebase对APN进行改进的功能

  • 注册推送通知的步骤
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.

}

  • 当接收应用程序处于前台状态时:如果您的应用程序在前台状态时接收到通知,单击该通知将把该通知的内容传递给底层函数
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {

}

问:我将启用Swizzling,即使一些教程(没有解释原因)告诉我关闭它: A. Swizzling方法需要将fcm令牌映射到apns令牌。如果您关闭了方法swizzling,您需要显式地将fcm令牌映射到apns令牌,如下所示

  Messaging.messaging().apnsToken = deviceToken

我们可以得到一个简单的矩阵,如:AppState | closed | background | foreground |:对于任何应用程序状态,回调函数都已经存在于Appdelegate中。

 类似资料:
  • 我们有申报单 其中backlog被标识为传入连接的最大队列长度。如果连接指示在队列已满时到达,则会拒绝连接。 假设积压设置为10。 这是否意味着服务器套接字将接受不超过10个客户端? 然后: 只有当时,积压数才会下降。这是正确的吗? 有没有办法知道一个套接字当前正在处理多少个打开的连接(换句话说,它离放弃并开始拒绝新连接有多近)

  • 问题内容: 因此,显然已在iOS 10中弃用了。有人能解释为什么或可以解释下一步做什么吗?我已经查看了Apple网站,发现了一些与OpenURL有关的东西,这就是他们所说的现在使用的东西: 有没有人有证据表明这是在Swift 3.0中使用OpenURL的新方法?另外,分别在和参数中使用什么值? 问题答案: 迅捷3+ : 用法: 资源

  • 问题内容: 我有一张桌子Table1 当我使用以下查询查询该表时 我得到的输出为 但是以同样的方式,当我使用以下查询时,我没有任何输出。 有人请给我指导,为什么它会那样工作,以及如何使用rownum。 问题答案: 汤姆回答了许多与Oracle有关的问题 简而言之,在应用where子句之后和应用order by子句之前,rownum可用。 在RowNum = 2的情况下,where子句中的谓词将永远

  • 我希望下面的代码中有,但它运行良好。 根据JavaDoc for: 这个类的所有“Collection view Methods”返回的迭代器都是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改了映射,则迭代器将抛出一个ConcurrentModificationException。 因此,由于我在获得之后修改了,所以我应该得到。为什么不扔?

  • 所以这段时间我一直认为递归的问题是理解案例。事实证明,我的问题是理解递归案例的值。例如,向后打印数组的一部分。 原始尝试 一次有效的尝试 然而,这是一种高效的递归吗?还是有更好的办法?这是我从写出来的时候看出来的唯一方法。

  • 类初始化规则规定:如果由于访问静态字段而触发类初始化,则只初始化声明了静态字段的类,即使静态字段被子类、子接口的类型或接口的实现类引用,也不会触发超类或子类的初始化。然后在下面的代码中,只应打印“初始化超类”。 } 当我运行这个时,输出: