游戏中,在玩家离线时,也会发生许多重要的事件,如玩家建筑升级完成、玩家被攻击等事件。若能及时将这些信息同步给玩家,有助于提升用户活跃度,有利于游戏体验。
FCM简介
Firebase Cloud Messaging是Google提供的免费推送消息的服务。我们使用此服务来完成给玩家推送消息的功能。
FCM支持多种消息发送的方式,使用ios、android、c++、js的fcm sdk及服务器fcm sdk发送消息,也可使用服务器直接调用API发送消息
基于项目需求,这里采用服务器调用API
发送消息的方式来使用FCM,先来看一下使用FCM时的官方示例
// 这个网址是根据你注册的信息替换其中的myproject-b5ae1即可
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA // 这里是验证信息
// post内容
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", // 设备注册令牌
"notification":{
"body":"This is an FCM notification message!",
"title":"FCM Message"
}
}
}
由示例可知推送1个消息,我们需要以下3点
- post网址 (根据注册信息来替换即可)
- 设备注册令牌在手机安装含有FCM SDK的包后生成 (让客户端上报至服务器即可)
- 验证信息需要我们自己根据相关信息生成 (需自己生成,生成方式见下节OAuth 2.0部分)
基于以上信息,开始FCM接入工作
要使用FCM的WEB API需要先通过OAuth 2.0方法来获取Google的Acess Token
一. Acess Token获取步取如下
- OAuth 2.0
在注册帐号时会获取包含project_id private_key等的OAuth 2.0客户端凭据,将信息保存下来,以备使用 - 创建一个JSON Web令牌,其中包括标头,声明集和签名。
{"alg":"RS256","typ":"JWT"}
和
{
"iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope": "https://www.googleapis.com/auth/prediction",
"aud": "https://oauth2.googleapis.com/token",
"exp": 1328554385, // 过期时间 指定为自1970年1月1日UTC 00:00:00以来的秒数
"iat": 1328550785 // 开始时间 指定为自1970年1月1日UTC 00:00:00以来的秒数
}
- 使用private_key,使用SHA256withRSA对{Base64url encoded header}.{Base64url encoded claim set}进行签名将结果base64后与前面内容用
.
连在一起 - 进行post请求
POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=xxx.yyy.zzz
// xxx.yyy.zzz即为上一步中的结果
- 处理授权服务器返回的JSON响应。
{
"access_token": "ya29.c.Kp8xxxxxxxxxx",
"token_type": "Bearer",
"expires_in": 3599
}
将返回值中的token_type 和 access_token保存起来
二. 开始消息推送
这一步简单了
- 直接对指定地址进行post即可
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
Authorization: Bearer ya29.c.Kp8xxxxxxxxxx
// 推送内容
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", // 这是客户端设备上报的token,相当于收件人
"notification":{
"title":"Portugal vs. Denmark", // 通知标题
"body":"great match!" // 通知内容
}
}
}
推送成功后返回内容如下
{
"name": "projects/ugame-global/messages/0:1622082421135981%f2a7efe6f2a7efe6"
}