当 Firebase 与 Push 框架一起使用时,没有调用 didReceiveRemoteNotification

Posted

技术标签:

【中文标题】当 Firebase 与 Push 框架一起使用时,没有调用 didReceiveRemoteNotification【英文标题】:didReceiveRemoteNotification not called when Firebase is used along with Push framework 【发布时间】:2018-10-29 19:19:46 【问题描述】:

我正在使用 Firebase 进行分析,并使用库进行推送通知。当我使用其中任何一个时,都会调用 didReceiveRemoteNotification。但是当我同时使用它们时,didReceiveRemoteNotification 不会被调用。 代码:

didFinishLaunchingWithOptions

NSString *google_app_id = @"----";
    NSString *gcm_sender_id = @"----";
    FIROptions *o = [[FIROptions alloc] initWithGoogleAppID:google_app_id GCMSenderID:gcm_sender_id];
    o.APIKey = @"----";
    o.bundleID = @"----";
    o.clientID = @"----";
    [FIRApp configureWithOptions:o];  

// Initilization of push framework 

didReceiveRemoteNotification

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
    // This method is not called when Firebase and push framework are enabled at the same time
    // It works fine when only Firebase or only push framework is enabled
    NSLog(@"Push: %@", userInfo);

【问题讨论】:

您如何注册接收推送通知? @dudeman :推送框架就是这样做的。他们有他们的后端。当框架初始化时,推送,应用注册推送通知。 在您注册推送通知后,有回调方法让您知道注册是否成功,并为您提供用于发送通知的推送令牌。您是否尝试过注册是否成功?另外,你用他们给你的令牌做什么? @dudeman : 注册肯定成功。我总是收到推送通知。只是push框架和Firebase都没有调用didReceiveRemoteNotification。 你查看过UNUserNotificationCenter developer.apple.com/documentation/usernotifications/… 【参考方案1】:

这是因为 Firebase 使用 swizzling 来拦截 AppDelegate 的方法。

您应该在应用的 info.plist 中禁用它:

<key>FirebaseAppDelegateProxyEnabled</key>
<false/>

其实GitHub上有很多关于Push Notification in ios with Firebase的信息。您可能会在那里找到更多问题的答案。

【讨论】:

但这也阻止了 Firebase Analytics。有什么方法可以禁用 Firebase 推送通知? 它是禁用整个分析,还是仅禁用某些事件?也许您可以尝试手动调用它们。 我要求所有分析都由 Firebase 处理,而不是手动处理。 @Nitish,先生,您需要我吗? :D 对不起,我想我无能为力。如果我是你,我会联系 Firebase 支持或手动处理这些事件。 我不是这个意思。但我明白你的意思。谢谢。【参考方案2】:

在 Firebase Cloud Messaging 中此方法的文档中说:

如果您在应用运行时收到通知消息 背景,在用户点击之前不会触发此回调 在启动应用程序的通知上。

mb 这个方法只有在你点击启动应用的通知时才会调用?

根据我的经验,我使用以下方法处理推送:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void (^)())completionHandler 

如果应用程序处于活动状态,方法获取有关即将到来的推送通知的信息。 在块中,您必须放置常量以显示您的通知:

completionHandler(UNNotificationPresentationOptionAlert);

还有一个:

(void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler 

此方法适用于点击推送通知。 Mb 在这里你正在处理移动到一些特殊的屏幕。

希望我的经验有所帮助!

【讨论】:

以上是关于当 Firebase 与 Push 框架一起使用时,没有调用 didReceiveRemoteNotification的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试将 Analytics 与通知一起使用时,Firebase 中没有静态方法 zzUr()

将环境变量部署到 Firebase 托管

将 Firebase Analytics 与命名的 FirebaseApp 一起使用

与 Firebase 函数一起使用时,Nodemailer 无法正常工作

当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗

在 Firebase 中使用 push() 时如何提取唯一 ID