[Tool] python项目中集成使用Firebase推送功能

 背景介绍

  • 目前,App推送功能已经非常普遍,几乎所有App都有推送功能。
  • 推送功能可以自己实现,也可以使用第三方提供的推送服务(免费的收费的都有)。
  • 本文主要介绍使用Firebase提供的推送服务Firebase Cloud Messaging(简称FCM)。
  • 本文主要介绍FCM工作原理、后端集成流程,但不包括客户端集成方面的内容。

FCM使用

  • 官网:firebase.google.com/docs/cloud-…

  • 简介:Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地传递消息,且无需任何费用。使用 FCM,您可以通知客户端App有新的电子邮件或其他数据等待同步。您可以发送通知消息与用户互动并留住他们。

  • 主要功能:发送通知消息或数据消息

  • 工作原理:

    • FCM 实现包括用于发送和接收的两个主要组件:

    • 一个受信任的环境,例如 Cloud Functions for Firebase 或用于构建、定位和发送消息的应用服务器。

    • 一个通过针对具体平台的相应传输服务接收消息的 Apple、Android 或 Web (JavaScript) 客户端应用。

    • 您可以通过 Firebase Admin SDK 或 FCM 服务器协议发送消息。

  • 工作原理图解说明

    • 首先,可以通过后端api或者Console GUI创建发推送消息的请求,该请求会交给FCM backend
    • 然后,由FCM backend帮我们把消息推送到用户手机上,并且支持跨平台推送
    • 用户手机上能收到消息的前提:安装了集成FCM SDK的App
    • 注意1:后端通过api创建推送请求使用的是FCM Admin SDK,客户端开发使用的是FCM SDK
    • 注意2:后端通过api创建推送请求可以直接使用FCM Admin SDK, 或者按照FCM 服务器协议自己实现
  • 发送消息的方式:

    • 发送消息的方式有两种:按设备注册token、按主题

    • 每个安装了集成FCM SDK的客户端,都可以生成唯一的register_token,这个register_token会由App客户端给到App服务端。服务端拿到这个register_token,就可以只给这个设备推送消息。

    • 每个设备也可以订阅主题,订阅主题后,可以直接给这个主题推送消息。这样所有订阅过该主题的设备都可以收到推送消息。

FCM集成到服务器(Python)

  • 目前,FCM Admin SDK支持五种服务端编程语言:Node.js、Java、Python、Go、C#

  • 前提条件:

    • 确保您拥有服务器应用。
    • 确保您的服务器运行 Admin Python SDK — Python 3.6+
  • 设置Firebase项目和服务账号

    • 如需使用 Firebase Admin SDK,您需要具备以下项:
    • Firebase 项目
    • 用于与 Firebase 通信的服务帐号
    • 包含服务帐号凭据的配置文件
  • 创建Firebase项目

# Firebase控制台:https://console.firebase.google.com

# 创建流程
1. 在 Firebase 控制台中,点击添加项目
2. 如果出现 Firebase 条款提示,请查看并接受。
3. 点击继续。
4. 为您的项目设置 Google Analytics(可选)
5. 点击创建项目(如果使用现有的 Google Cloud 项目,则点击添加 Firebase)
  • 创建包含服务帐号凭据的配置文件
1. 在 Firebase 控制台中,打开设置 > 服务帐号。
2. 点击生成新的私钥,然后点击生成密钥进行确认。
3. 妥善存储包含密钥的 JSON 文件.
  • 添加SDK

Firebase Admin Python SDK 可通过 pip 获得。

pip3 install firebase-admin
  • 初始化SDK

通过服务帐号进行授权时,有两种方式可为您的应用提供凭据。

方式1(推荐)

(1)将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为包含服务帐号密钥的 JSON 文件的文件路径

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

(2)完成上述步骤后,应用默认凭据 (ADC) 能够隐式确定您的凭据

import firebase_admin


default_app = firebase_admin.initialize_app()

方式2:直接在代码中写死JSON文件路径


import firebase_admin
from firebase_admin import credentials


cred = credentials.Certificate("path/to/service_account.json")
default_app = firebase_admin.initialize_app(credential=cred)
  • 向指定设备发送消息
from firebase_admin import messaging

# This registration token comes from the client FCM SDKs.
registration_token = 'YOUR_REGISTRATION_TOKEN'

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='your_titme',
        body='your_body',
        image='your_img',
    ),
    token=registration_token,
)

# Send a message to the device corresponding to the provided registration token.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
  • 向主题发送消息

创建主题后,使用服务器 API向主题发送消息,则订阅过该主题的设备都会受到消息。

from firebase_admin import messaging

# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='your_titme',
        body='your_body',
        image='your_img',
    ),
    topic=topic,
)

# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

  • 批量发送消息
# Create a list containing up to 500 messages.
messages = [
    messaging.Message(
        notification=messaging.Notification('Price drop', '5% off all electronics'),
        token=registration_token,
    ),
    # ...
    messaging.Message(
        notification=messaging.Notification('Price drop', '2% off all books'),
        topic='readers-club',
    ),
]

response = messaging.send_all(messages)
# See the BatchResponse reference documentation
# for the contents of response.
print('{0} messages were sent successfully'.format(response.success_count))

  • 服务端订阅主题

客户端SDK可以帮用户订阅主题,服务端可以通过接口帮用户订阅主题。

您可以为客户端应用实例订阅任何现有主题,也可创建新主题。当您使用 API 为客户端应用订阅新主题(您的 Firebase 项目中尚不存在的主题)时,系统会在 FCM 中创建一个使用该名称的新主题,随后任何客户端都可订阅该主题。

# 您可以将注册令牌列表传递给 Firebase Admin SDK 订阅方法,以便为相应的设备订阅主题

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_n',
]

# Subscribe the devices corresponding to the registration tokens to the
# topic.
response = messaging.subscribe_to_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were subscribed successfully')

注意:在单次请求中,您最多可以为 1000 台设备订阅或退订主题。

  • 服务端推订主题

利用 Admin FCM API,您还可以将注册令牌传递给相应的方法,来为设备退订主题

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_n',
]

# Unubscribe the devices corresponding to the registration tokens from the
# topic.
response = messaging.unsubscribe_from_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were unsubscribed successfully')

总结

  • 使用Firebase可以快速实现消息推送,支持跨平台,并且免费使用。
  • 可以通过借助 Firebase Admin SDK实现消息推动和主题管理,也可以按照FCM 服务器协议自己实现接口。
  • Firebase Admin SDK优点:使用方便,啥都有。
  • Firebase Admin SDK缺点:包太大不轻便(推送功能仅使用FCM),不支持asyncio异步操作。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/337508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab appdesigner系列-常用13-标签

标签,用来显示各类文本 此示例,就是在标签之外的画布上单击鼠标左键,显示王勃的《滕王阁诗》 操作如下: 1)将2个标签拖拽到画布上,并修改相应文字。将第二个标签的右侧文本信息中的Wordwrap打开&#xf…

[自动化分布式] Zabbix自动发现与自动注册

abbix 自动发现(对于 agent2 是被动模式) zabbix server 主动的去发现所有的客户端,然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多,zabbix server 登记耗时较久,且压力会较大 部署 添加zabb…

六、标准对话框、多应用窗体

一、标准对话框 Qt提供了一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息提示和确认选择对话框、标准输入对话框等。1、预定义标准对话框 (1)QFileDialog 文件对话框 QString getOpenFileName() 打开一个文件QstringList ge…

uniapp组件库Popup 弹出层 的使用方法

目录 #平台差异说明 #基本使用 #设置弹出层的方向 #设置弹出层的圆角 #控制弹窗的宽度 | 高度 #内容局部滚动 #API #Props #Event 弹出层容器,用于展示弹窗、信息提示等内容,支持上、下、左、右和中部弹出。组件只提供容器,内部内容…

树的一些经典 Oj题 讲解

关于树的遍历 先序遍历 我们知道 树的遍历有 前序遍历 中序遍历 后序遍历 然后我们如果用递归的方式去解决,对我们来说应该是轻而易举的吧!那我们今天要讲用迭代(非递归)实现 树的相关遍历 首先呢 我们得知道 迭代解法 本质上也…

【征服Redis12】redis的主从复制问题

从现在开始,我们来讨论redis集群的问题,在前面我们介绍了RDB和AOF两种同步机制,那你是否考虑过这两个机制有什么用呢?其中的一个重要作用就是为了集群同步设计的。 Redis是一个高性能的键值存储系统,广泛应用于Web应用…

Python实现稳健线性回归模型(rlm算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 稳健回归可以用在任何使用最小二乘回归的情况下。在拟合最小二乘回归时,我们可能会发现一些…

人才测评,招聘工程技术经理胜任素质模型与任职资格

招聘工程技术经理是企业中的重要职位之一,为了确保招聘到胜任的人才,需要制定一个胜任力素质模型和任职资格。 1.专业知识技能:工程技术经理需要拥有深厚的专业技术知识,能够熟练掌握工程设计、生产制造、质量管理、安全管理等方面…

macOS 设置屏幕常亮 不休眠

Apple M1 Pro macOS Sonoma设置“永不”防止进入休眠 macOS Sonoma 设置“永不” 防止进入休眠

开源进程/任务管理服务Meproc使用之HTTP API

本文讲述如何使用开源进程/任务管理服务Meproc的HTTP API管理整个服务。 Meproc所提供的全部 API 的 URL 都是相同的。 http://ip:port/proc例如 http://127.0.0.1:8606/proc在下面的小节中,我们使用curl命令向您展示 API 的方法、参数和请求正文。 启动任务 …

Tensorflow 入门基础——向LLM靠近一小步

进入tensflow的系统学习,向LLM靠拢。 目录 1. tensflow的数据类型1.1 数值类型1.2 字符串类型1.3 布尔类型的数据 2. 数值精度3. 类型转换3.1 待优化的张量 4 创建张量4.1 从数组、列表对象创建4.2 创建全0或者1张量4.3 创建自定义数值张量 5. 创建已知分布的张量&…

Linux重定向:深入理解与实践

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:晴る—ヨルシカ 0:20━━━━━━️💟──────── 4:30 🔄 ◀️ ⏸ ▶️ ☰ &…

深度学习记录--Momentum gradient descent

Momentum gradient descent 正常的梯度下降无法使用更大的学习率,因为学习率过大可能导致偏离函数范围,这种上下波动导致学习率无法得到提高,速度因此减慢(下图蓝色曲线) 为了减小波动,同时加快速率,可以使用momentum…

linux内核原理--分页,页表,内核线性地址空间,伙伴系统,内核不连续页框分配,内核态小块内存分配器

1.分页,页表 linux启动阶段,最初运行于实模式,此阶段利用段寄存器,段内偏移,计算得到物理地址直接访问物理内存。 内核启动后期会切换到保护模式,此阶段会开启分页机制。一旦开启分页机制后,内…

Navicat平替工具,一款免费开源的通用数据库工具

前言 前段时间有小伙伴在群里提问说:因为公司不允许使用破解版的Navicat,有好用的Navicat平替工具推荐吗?今天分享一款免费开源的通用数据库工具:DBeaver。 DBeaver工具介绍 DBeaver是一款免费的跨平台数据库工具,适…

转转交易猫自带客服多模板全开源完整定制版源码

商品发布; 请在后台商品添加成功后, 再点击该商品管理,可重新编辑当前商品的所有信息及配图以及支付等等相关信息 可点击分享或者跳转,将链接地址进行发布分享 请在手机端打开访问 访问商品主要模板文件路径目录 咸鱼&#…

四个简单的bat脚本

Windows11 最大劝退点就是这个右键菜单,复制粘贴都变成一点点的小图标,最气人的是点击底部的显示更多选项才能展示全部功能。让许多本来点一次就能完成的操作变成两次。其实使用一个小命令就能修改回win10版本的菜单。四个简单的bat脚本,能完…

Java大型企业进销存系统

技术框架: SpringBoot Spring Data Jpa SpringMvc Shiro安全认证 完整权限系统 easyui 有需要的可以联系我。 运行环境: jdk8 IntelliJ IDEA maven 系统介绍: 导航菜单:系统菜单、销售管理、库存管理、统计报表、基础…

Ubuntu使用docker-compose安装redis

ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十三)——使用docker-compose安装redis 文章目录 Ubuntu系统环境搭建(十三)——使用docker-compose安装redis1.搭建文件夹2.docker-compose.yaml配置文件3.redis.co…

【JavaWeb】XML Tomcat10 HTTP

文章目录 一、XML1.1常见配置文件类型 二、Tomcat102.1 WEB项目的标准结构2.2 Tomcat目录2.3 WEB项目部署的方式2.4 IDEA中开发并部署运行WEB项目2.5 处理配置文件2.6 处理依赖jar包问题2.7 IDEA部署-运行web项目 三、HTTP3.1 HTTP协议的会话方式3.2 请求和响应报文3.3.1 报文的…