从 sgcWebSockets 2024.9.0 起,新增客户端组件,支持使用 Google Firebase Cloud Messaging 和最新的 HTTP v1 API 发送通知。
使用已弃用的 FCM 旧版 HTTP 和 XMPP API 的应用应尽早迁移至 HTTP v1 API。这些 API 的消息发送(包括上行消息)功能已于 2023年6月20日弃用,并于 2024年7月22日起停止服务。
除持续支持和新功能外,HTTP v1 API 相比旧版 API 具有以下优势:
- 通过访问令牌提升安全性:HTTP v1 API 依据 OAuth2 安全模型使用短期访问令牌。即使访问令牌泄露,也只能在大约一小时内被恶意使用,然后便会过期。刷新令牌的传输频率远低于旧版 API 中使用的安全密钥,因此被截获的可能性大大降低。
- 跨平台消息定制更高效:对于消息正文,HTTP v1 API 提供发送给所有目标实例的公共键,以及允许您跨平台定制消息的平台专属键。这使您能够创建"覆盖",在单条消息中向不同客户端平台发送略有不同的载荷。
- 对新客户端平台版本具备更强扩展性和前瞻性:HTTP v1 API 完整支持 Apple 平台、Android 和 Web 上可用的消息选项。由于每个平台在 JSON 载荷中都有其自定义块,FCM 可按需将 API 扩展至新版本和新平台。
Google FCM Delphi 客户端
Firebase Cloud Messaging(FCM)是一种跨平台消息解决方案,可让您免费可靠地发送消息。
使用 FCM,您可以通知客户端应用有新邮件或其他数据可供同步,也可以发送通知消息以促进用户重新参与和留存。对于即时通讯等场景,消息最多可向客户端应用传输 4096 字节的载荷。
该组件支持 HTTP v1 API。
授权Google FCM 客户端组件可通过以下方式登录 Google 服务器:
- gcaOAuth2:OAuth2 协议
- gcaJWT:JWT 令牌。
OAuth2
通过 Web 浏览器完成登录,用户以自己的账户登录并授权 FCM 请求。
- GoogleCloudOptions.OAuth2.ClientId:Google 提供的通过 OAuth2 协议进行身份验证的客户端 ID。
- GoogleCloudOptions.OAuth2.ClientSecret:Google 提供的通过 OAuth2 协议进行身份验证的客户端密钥字符串。
- GoogleCloudOptions.OAuth2.Scope:OAuth2 的作用域,通常无需修改默认值,除非需要获取比默认更多的访问权限。
- GoogleCloudOptions.OAuth2.LocalIP:OAuth2 协议需要一个本地服务器监听来自身份验证服务器的响应,此为 IP 或 DNS,默认为 127.0.0.1。
- GoogleCloudOptions.OAuth2.LocalPort:本地服务器监听端口。
- GoogleCloudOptions.OAuth2.RedirectURL:若需设置与 LocalPort + LocalIP 不同的重定向 URL,可在此属性中设置(示例:http://127.0.0.1:8080/oauth2)。
服务账户
使用 Google 提供的私钥对请求进行签名完成登录,此方式推荐用于无需用户交互的自动化服务或应用程序。
- GoogleCloudOptions.JWT.ClientEmail:创建新服务账户时提供的客户端邮箱名称,对应 JSON 配置文件中的"client_email"节点。
- GoogleCloudOptions.JWT.Subject:创建新服务账户时提供的客户端邮箱名称,对应 JSON 配置文件中的"client_email"节点。
- GoogleCloudOptions.JWT.PrivateKeyId:Google 提供的私钥 ID,对应 JSON 配置文件中的"private_key_id"节点。
- GoogleCloudOptions.JWT.PrivateKey:Google 提供的私钥证书,对应 JSON 配置文件中的"private_key"节点。
创建新服务账户后,您可以下载包含所有配置的 JSON 文件。FCM 组件可处理此文件,只需调用方法 LoadSettingsFromFile 并将 JSON 文件名作为参数传入即可。
示例
以下是使用 FCM 和 JWT 身份验证方式发送通知的简单示例。
oFCM := TsgcHTTPGoogleCloud_FCM_Client.Create(nil);
oFCM.GoogleCloudOptions.Authorization := gcaJWT;
oFCM.LoadSettingsFromFile('sgcfirebase-7x92e-5c80b8506a6c.json');
oFCM.GoogleCloudOptions.JWT.Subject := GoogleFCM.GoogleCloudOptions.JWT.ClientEmail;
ShowMessage(
oFCM.SendMessage('Project-id',
'{"message": {"topic": "news","notification": ' +
'{"title": "Breaking News",' +
'"body": "New news story available."},"data": {"story_id": "story_12345"}}}')
);
