只是最基础的推送功能,更多内容扩展看文档
1、工程配置
-
在项目模块(entry)下src/main/module.json5 增加metaDta
"metadata": [ { "name": 'client_id', "value": "11*****" } ] -
配置证书等文件
File -->Project Structure-->Signing Configs
注意:不要勾选Automatically generate signture. 勾选了会自动生成证书并覆盖配置的证书信息 生成和配置证书 自行查看文档
2、后台配置
- 开通推送服务。 配置页 可以稍后根据错误码进行配置
-
配置API服务
在我的项目(我的项目,和我的应用 不一样),项目设置,API管理 打开推送服务
3、客户端开发
1、生成pushToken
AAID 还没弄清楚是干什么的,反正也拿不到,暂时对推送通知没影响,后续加上
import { Log } from './hgh_util'
import { pushService,AAID } from '@kit.PushKit'
static async pushtoken(){
const pushToken: string = await pushService.getToken();
Log.debug('获取pushtoken:'+pushToken)
const aaID = await AAID.getAAID()
Log.debug('获取的AAID:'+aaID)
AAID.getAAID((aadi)=>{
Log.debug('获取aaid:'+aadi)
})
}
至此,已经可以完成推送的客户端功能了
2、接受消息(可选)
两种情况,服务端发送通知时的clickAction 下的actionType字段 0:在应用首页, 1:应用内页
a.默认情况下 点击通知 进入到应用主页(src/main/module.json5中的mainElement的值)的onCreate()
onCreate(want: Want): void {
// 获取消息中传递的data数据
hilog.info(0x0000, 'testTag', 'Get message data successfully: %{public}s', JSON.stringify(want.parameters));
}
b.进入应用内页
进入应用内页需要在src/main/module.json5 中设置跳转Ability的skill。 action 和uris 两种配置方式
{
"name": "TestAbility",
"srcEntry": "./ets/abilities/TestAbility.ets",
"exported": false,
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"skills": [
{
"actions": [
"com.test.action"
]
}
]
}
{
"name": "TestAbility",
"srcEntry": "./ets/abilities/TestAbility.ets",
"skills": [
{
"actions": [""],
"uris": [
{
"scheme": "https",
"host": "www.test.com",
"port": "8080",
"path": "push/test"
}
]
}
]
}
4、服务器发送通知
请求地址和参数
a.请求地址:
push-api.cloud.huawei.com/v3/ [projectid] /messages:send
| 名称 | 值 | 说明 |
|---|---|---|
| 项目ID | 388********2098 | 在后台的项目ID就是,或者通过 服务帐号密钥文件获取 |
b.配置header:
| 字段 | 值 | 说明 |
|---|---|---|
| COntent-Type | application/json | 无 |
| push-type | 0 | 一般情况下传0就行 |
| Authorization | Bearer jwt | 这个要详细说一下 |
push-type取值说明:
| 消息类型,取值如下:0:通知消息1:卡片刷新消息2:通知扩展消息6:后台消息7:实况窗更新消息10:VoIP呼叫消息 |
|---|
生成服务帐号鉴权令牌
点生成公钥--> 创建并下载JSON 就可以得到 服务帐号密钥文件
JWT生成规则
RSASHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
private_key
)
服务帐号密钥文件:(private_key中间被我删了一部分,参考样式)
{
"project_id": "388***98",
"key_id": "b68f****ce",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCNEyOgNO2at6xRKGGgxkXkIC26DBYW6C7SFtizlgzETg38TounTKPlRkhL+++va5J6+79xRwE98pcvM4Ur5jlR2R5uRz5l65b1Efeodhw3WqvmzrEQnQejjvCUqrDE9BQFCktrSXo1F1xthspobeADNrW/Ptea8+nY2VvptfSC9ok7hFi/R001gskt/XmjKEJgXEqoDUHCsU7QmFEmCqVc6DeePyHTpC5Ln4Ng1FOFbsLWGNYXO2jhQHf4sRdPTg6t1xpDexiaoFrRkGHMX8lf0fOhs2SONSSzFBzIMZRxuZmD96d+/4CfBEOEE61VDSkXux89+TOG43i5Xzpm2xAsxlnYo0W8vMA8ByzIMDlQ8GiNPYktMux9/9eRxBoS8ekQdWXzZMf1Cz2rqHJ37Tu3qC3KwKCAQAnGe67cRF1QS9Il/Tu1Hc0lVA0M46ns+NNDl+fNH77gHYbeEh/7iLgFS7xXh3pqzKO2Fjo/CivK4XYX/lgx/jaOXAppe+T/jrqd1d8/3FnGETLrgOgvH6f/De4vBVBfUJynr3SgVT/w9GwGWwwcu4hzfqO72ll6kP8dDB+pdTwhnFXooZE2zgYIUXKLm0DxVK2XJ2Z113ejFxHGbkTYTbsB1+WVbZUKdNCXU/8VgHutmO+DJXsgonzxhRc3/93nw55ca5+D7BVtnrKddDpiuXDpEUb2dAAvymDUVztNtU5m/UqkCR37LtO7822dg/D5lUXvY6dJO8DpU1KvgXhrgZ3\n-----END PRIVATE KEY-----\n",
"sub_account": "110***",
"auth_uri": "https://oauth-login.cloud.huawei.com/oauth2/v3/authorize",
"token_uri": "https://oauth-login.cloud.huawei.com/oauth2/v3/token",
"auth_provider_cert_uri": "https://oauth-login.cloud.huawei.com/oauth2/v3/certs",
"client_cert_uri": "https://oauth-login.cloud.huawei.com/oauth2/v3/x509?client_id="
}
header:
| 字段 | 说明 |
|---|---|
| kid | 服务账号密钥里面的key_id |
| type | 固定JWT |
| alg | 固定RS256 |
{
"kid": "*****",
"typ": "JWT",
"alg": "RS256"
}
payload:
| 字段 | 说明 |
|---|---|
| aud | 固定为:oauth-login.cloud.huawei.com/oauth2/v3/t… |
| iss | 服务帐号密钥文件中sub_account字段,标识数据生成者 |
| iat | 10位时间戳(s) |
| exp | 过期时间戳,iap + 3600 |
{
"aud": "https://oauth-login.cloud.huawei.com/oauth2/v3/token",
"iss": "*****",
"exp": 1581410664,
"iat": 1581407064
}
附上python代码
import jwt
import time
PRIVATE_KEY = b"-----BEGIN PRIVATE KEY-----\nMIIJQQIBUKdNCXU/8VgHutmO+DJXsgonzxhRc3/93nw55ca5+D7BVtnrKddDpiuXDpEUb2dAAvymDUVztNtU5m/UqkCR37LtO7822dg/D5lUXvY6dJO8DpU1KvgXhrgZ3\n-----END PRIVATE KEY-----\n"
ISS = "110xxx"
KID = "b68f682sxxxxxxxxxxxxxxxxxxxxxxxxxx"
AUD = "https://oauth-login.cloud.huawei.com/oauth2/v3/token"
def create_jwt():
iat = int(time.time())
exp = iat + 3600 # 设置过期时间为1小时后
payload = {
"iat": iat,
"exp": exp,
"iss": ISS,
"aud": AUD
}
header = {
"kid": KID,
"alg":"RS256"
}
print(payload)
print('--------------------------\n')
encoded_jwt = jwt.encode(
payload,
PRIVATE_KEY,
algorithm='RS256',
headers = header
)
return encoded_jwt
jwt_token = create_jwt()
print(jwt_token)
c. 配置body
把token里面的换成自己的pushToken. 更多参数配置 看文档
{
"payload": {
"notification": {
"category": "MARKETING",
"title": "普通通知标题",
"body": "普通通知内容",
"clickAction": {
"actionType": 0
},
"notifyId": 12345
}
},
"target": {
"token": ["MAMzLgJnP0HLhVO3P"]
},
"pushOptions": {
"testMessage": true
}
}