【问题标题】:My android app can't receive fcm message from python我的 android 应用程序无法从 python 接收 fcm 消息
【发布时间】:2019-04-03 12:02:45
【问题描述】:

我正在构建带有 firebase 云消息传递的 android 应用程序。 我的应用程序可以从 FCM 控制台接收消息。 但是,它无法从 python 接收,尽管响应很好。 你能给我一些建议吗?

class fbMessaging():
    def __init__(self):
        cred = credentials.Certificate('./env/firebase.json')
        firebase_admin.initialize_app(cred)

    def send_to_device(self, text, token):
        message = messaging.Message(
            data = {
                'title': 'test',
                'body': text,
            },
            token = token,
        )
        response = messaging.send(message)
        return response

def main():
    fm = fbMessaging()
    res = fm.send_to_device('test', 'MY CORRECT TOKEN')
    print(res)

onMessageRecieved 在这里

    override fun onMessageReceived(message: RemoteMessage?) {
        val from = message!!.from
        val data = message.data

        Log.d(TAG, "from:" + from!!)
        Log.d(TAG, "data:$data")

    }

打印的响应如下。

projects/match-XXXXX/messages/0:1554291593xxxxxx%43f99108f9xxxxxx

【问题讨论】:

  • 您的onMessageReceived 方法是什么样的?您是否正在从您发送的有效负载构建通知?
  • 感谢您的回复!我添加了 onMessageReceived 方法。
  • 只有日志语句。您在哪里构建通知?
  • 我不知道 Notification.. 它是用于 android 还是 python?教程中提到了吗?
  • 您正在做的是从 Firebase 控制台发送 Notification Payload 并从 Python 代码发送 Data payload 并期待系统中的通知 UI托盘。

标签: android python-3.x firebase firebase-cloud-messaging


【解决方案1】:

使用Firebase Cloud Messaging,您可以发送通知负载数据负载或两者。

通知负载包含 标题 - 通知标题 body - 通知正文

键名是固定的,不能更改。

另一方面,

数据负载只是一个键值对,您可以发送任何带有字符串类型的键名作为其值。

FCM 行为:

根据应用程序是在前台还是后台,以及是否存在Notification payload或Data payload或两者,应用程序中的不同组件接收到FCM消息。

根据文档处理 FCM 通知,

  • 当您的应用在后台时发送通知消息。在这种情况下,通知将发送到设备的系统托盘。默认情况下,用户点击通知会打开应用启动器。

  • 在后台接收到的同时包含通知和数据负载的消息。 在这种情况下,通知会被传送到设备的系统托盘,而数据负载会在 Intent 的附加部分中传送您的启动器活动。

Receive Messages Section 中已明确解释了此行为。

如您所见,如果仅在独立发送通知负载的情况下,您不必构建通知 UI。否则,当onMessageReceived 被调用时,你有create the Notification UI

使用 Python:

通知负载示例:

message = messaging.Message(
    notification=messaging.Notification(
        title='This is a Notification Title',
        body='This is a Notification Body',
    ),
    token=registration_token,
)

数据负载示例:

message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    token=registration_token,

两者:

message = messaging.Message(
    notification=messaging.Notification(
        title='This is a Notification Title',
        body='This is a Notification Body',
    ),
    data={
        'score': '850',
        'time': '2:45',
    },
    token=registration_token,

【讨论】:

  • 您的意思是当我从 FCM 控制台发送消息时调用 Notification Payload,而从 python 调用 Data Payload 而没有系统托盘通知?
  • 不,移动设备接收到数据负载,因为您将 data 参数传递给 Message init 类。
  • 使用通知解决了这个问题(你的两个例子),我知道如何在不显示通知的情况下传递数据,非常感谢。
  • 我遇到了完全相同的问题,这个答案解决了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多