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

news2025/1/15 23:25:31

背景介绍

  • 目前,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异步操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序共享云开发环境的代码配置

微信小程序共享云开发环境的代码配置 1. 环境的分享配置2. 使用共享云开发环境的小程序代码编写2.1 初始化2.2 云函数调用 4. 拓展:共享环境的小程序获取openId4.1 小程序密钥的设置4.2 小程序内代码编写 4.3 云函数编写 小程序2022年进行了云开发付费调整&#xff…

【C++】详解二叉树进阶OJ题(更深入理解递归和非递归在二叉树的各种结构的应用)

前言: 我们在此前的初阶数据结构讲解中已经讲解了部分二叉树的OJ题,当时我们只学习了C语言,其实还有很多进阶的OJ题用C来写会比较方便和容易理解,所以本章将在讲解完二叉搜索树后来详解不同类型的二叉树进阶OJ题,校招中…

常用性能测试工具都有哪些特点?

在软件开发过程中,性能测试是不可或缺的一部分。通过性能测试,我们可以评估系统的响应速度、稳定性和容量等方面的表现,帮助我们发现和解决潜在的性能问题。而常用的性能测试工具也在不断发展和升级,成为了帮助我们完成性能测试的…

【ArcGIS Pro二次开发】(25):属性映射

属性映射经常用于属性表或Excel表的赋值,比如按用地用海表对规划用地的用地编码或用地名称赋值,将汇总好的用地指标表赋值给已经制好的Excel模板等。 下面试着在ArcGIS Pro SDK中实现功能上述这两个功能。 一、Excel表格映射到属性表Table 1、要实现的…

VMware虚拟机安装CentOS8详细教程

文章目录 一、下载安装包二、创建虚拟机1.安装 VMware2.创建虚拟机3.编辑虚拟机设置 三、系统安装1.开始安装2.时区设置3.分区设置4.配置网络6.开机密码7.配置安装源8.安装 四、系统配置1.网络检查2.配置静态IP地址 一、下载安装包 CentOS-7-x86_64【Minimal版】 https://mirro…

程序员必知必会!阿里内部热捧“Spring全线笔记”太完整了

前言 对于每一位Java开发人员来说,提起Spring定是不陌生的,实际上自Spring框架诞生以来,就备受开发者的青睐,基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等&#xff0…

OpenGL光照教程之 光照贴图

引言 前面的教程,我们讨论了让不同的物体拥有各自不同的材质并对光照做出不同的反应的方法。在一个光照场景中,让每个物体拥有和其他物体不同的外观很棒,但是这仍然不能对一个物体的图像输出提供足够多的灵活性。  前面的教程中我们将一个物…

关于FPGA基础知识 LCMXO2-7000HC-4TG144C MachXO2系列 FPGA可编程逻辑简介

关于FPGA基础知识 LCMXO2-7000HC-4TG144C lattice莱迪斯深力科 MachXO2系列 FPGA可编程逻辑简介 FPGA基础知识:FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一…

【测评】飞凌i.MX8MM开发板,为你带来卓越的影音体验

来源:飞凌嵌入式官网 OKMX8MM-C是飞凌基于NXP公司i.MX8M Mini 四核64位处理器所设计的一款开发板,主频最高达1.8GHz,可提供多种音频接口,包括I2S、AC97、TDM、PDM和SPDIF。在性能和算力都大幅提高的同时,系统的运行也更…

idea配置Tomcat服务和创建javaweb项目

前言 我的idea版本是Ultimate 2022.3 步骤 1.先创建一个空的java项目 2.点击project structure 然后点击moudle – > dependcies —>点+ 选择JArs or … 找到你安装的tomcat里面的lin依次添加jsp-api.jar、servlet-api.jar 右击项目然后点add Framework s…

SPSS如何进行生存分析之案例实训?

文章目录 0.引言1.寿命表分析2.Kaplan-Meier分析方法3.Cox回归分析 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对生存分析进行阐…

JVM虚拟机中的类加载机制和双亲委派模型

目录 虚拟机的类加载机制 名词解释 类加载的时机 类加载的过程 1.加载(Loading)阶段 非数组类型的加载阶段与数组类型区别 2.验证(Verification)阶段 1)文件格式验证 2)元数据验证 3)…

深入理解Java虚拟机——对象的创建和内存布局

1.对象的创建 首先声明这一篇博客是在HotSpot虚拟机的前提之下记录的。主要参考书籍来源于周志明老师的《深入理解JVM虚拟机》。 在语言层面,创建对象仅仅是使用一个new关键字。但是从虚拟机的角度来看,创建一个对象一共有5个步骤:类加载检查…

排序大师:探秘C语言中神奇的qsort库函数

本篇文章中会详细讲解C语言中的qsort库函数。我准备分2个方面来讲: qsort如何使用。模拟实现qsort的效果。(注意:只是用冒泡排序的思想实现类似的效果,实际qsort的底层采用的是快速排序的思想。) 如何使用 先来看看q…

反调试与反反调试

参考文本 (190条消息) C 反反调试(NtQueryInformationProcess)_(-: LYSM :-)的博客-CSDN博客 Windows 平台反调试相关的技术方法总结—part 2 - 先知社区 C/C MinHook 库的使用技巧 - lyshark - 博客园 (cnblogs.com) (177条消息) C 反反调试&#x…

C结构简单而不失强大的表格

2023年了,想必已经不会有人对嵌入式开发中“数据结构(Data Structure)”的作用产生疑问了吧?无论你是否心存疑惑,本文都将给你一个完全不同的视角。 每每说起数据结构,很多人脑海里复现的一定是以下的内容&…

unity中用异步的whenAny,实现:当点击铲子任一部件,拾取整个铲子

一、铲子的组成 铲子包含很多部件组成,当拾取铲子的时候,只要点击铲子的任意一个部件就可以。 如图,点击【木柄】、【螺母】、【铁铲】都可以拾取该物体。 (1)打开高亮 (2)等待土铲被点击&…

为什么要通过API接口来获取数据

API接口(应用编程接口 application/programming接口),准许应用程序通过定义的接口标准来访问另一个应用程序或服务的编程方式。简单来说,API就是两个软件或系统之间的通信语言或接口。 在当今的互联网时代,数据无处不…

Geospatial和Redis事务操作

一、Geospatial 1.简介 基于位置信息服务 (Location-Based Service,LBS) 的应用。 Redis3.2 版本后增加了对 GEO 类型的支持。主要来维护元素的经纬度。redis 基于这种类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度hash等一些相关操作。 2.GEO底层结构…

DataEase 数据源插件分享 - 时序数据库 InfluxDB

前言 InfluxDB 是一个时序数据库,使用的是非标准的 SQL 语法,我使用 DataEase 的插件扩展机制开发了此数据源插件,在这里共享出来,想用的朋友可以下载安装使用。 插件包下载地址 https://north-dataease-1251506367.cos.ap-bei…