【问题标题】:setBackgroundMessageHandler: How to invoke when app is in quit state on iOSsetBackgroundMessageHandler:当应用程序在 iOS 上处于退出状态时如何调用
【发布时间】:2021-08-27 19:32:08
【问题描述】:

我正在使用react-native-firebase 库。

在 iOS 上,我可以在前台、后台以及应用程序处于退出状态时接收通知。处理程序也适用于所有场景,除了一个。

我唯一的问题是:当应用程序处于退出状态时,setBackgroundMessageHandler 没有被调用,即使我收到了通知。我也尝试发送纯数据消息,但结果是一样的。

我什至可以在消息的 apns 部分中使用 content-available: 1 在无头状态下调用应用程序。

但是setBackgroundMessageHandler 仍然没有被调用。这是我的index.js 页面:

messaging().setBackgroundMessageHandler(async remoteMessage => {
  console.log('HEADLESS BACKGROUND: ' + ' | ' + JSON.stringify(remoteMessage));
});

function HeadlessCheck({ isHeadless }) {
  if (isHeadless) {
    console.log("Headless");
    // App has been launched in the background by iOS, ignore
    return null;
  }

  return <App />;
}

AppRegistry.registerComponent(appName, () => HeadlessCheck);

【问题讨论】:

    标签: firebase react-native firebase-cloud-messaging react-native-ios react-native-firebase


    【解决方案1】:

    不要在无头调用的情况下返回null,而是返回一个不包含任何内容且不呈现任何内容的简单组件。

    Index.js

    messaging().setBackgroundMessageHandler(async (remoteMessage) => {
      console.log('HEADLESS BACKGROUND: ' + JSON.stringify(remoteMessage));
    });
    
    function HeadlessCheck({ isHeadless }) {
      if (isHeadless) {
        console.log('Headless');
        return <AppFake />;
        /* Notice this component, it is not the App Component but a different one*/
      }
    
      return <App />;
    }
    
    AppRegistry.registerComponent(appName, () => HeadlessCheck);
    

    AppFake 组件只包含以下内容:

    import { useEffect } from 'react';
    import SplashScreen from 'react-native-splash-screen';
    
    const AppFake = () => {
      useEffect(() => {
        SplashScreen.hide();
      }, []);
    
      return null;
    };
    
    export default AppFake;
    

    我不得不隐藏SplashScreen。这对我来说至关重要。

    这是我从服务器发送的有效负载:

    var admin = require('firebase-admin');
    
    const message = {
      notification: {
        title: title,
        body: body,
      },
      data: { campaignId: campaignId, title: title, body: body },
      token: registrationId,
      android: {
        priority: 'high',
        notification: {
          title: title,
          body: body,
          sound: 'default',
        },
      },
      apns: {
        payload: {
          aps: {
            sound: 'default',
            'content-available': 1,
          },
        },
        headers: {
          'apns-priority': '5',
        },
      },
    };
    
    let response = admin
      .messaging()
      .send(message)
      .then((res) => {
        console.log(res);
      })
      .catch((err) => {
        console.log(err);
      });
    

    现在setBackgroundMessageHandler 将在每条新消息上被调用,即使应用程序在 iOS 上处于退出状态。

    【讨论】:

    • 嗨@kartikey 我试图为我的iOS 反应本机应用程序实现上述内容。我能够收到推送通知,但无法触发 backgroundhandler 回调。我是否需要从 AppDelegate 中的 ios 本机代码中添加任何内容以进行无头调用。我正在崩溃,因为在 index.js 文件中找不到变量 React。我正在使用上面的确切解决方案。请帮助。谢谢
    • imports 是否正确?看,当你收到这个错误说Can't find variable React.. 这基本上是因为你没有在顶部导入它。只需添加import React from "react"。同样,这只是我对错误的假设。是的,请按照react-native-firebase 的安装说明进行操作。如果问题仍然存在,请联系我。
    • 糟糕的是,我还没有从“react”导入 React。感谢您指出@Kartikey。我有一个关于 setBackgroundMessageHandler 方法的问题。当我们杀死应用程序并收到通知时,如何知道这个方法正在被调用。当我杀死 Javascript lib 的应用程序时,调试日志将不起作用,那么如何确保调用此方法。?我需要在 Release Build 中检查这个场景吗?
    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2021-09-06
    • 2016-07-27
    • 2016-10-04
    • 2022-09-23
    相关资源
    最近更新 更多