
鸿蒙开发远程推送详解 原创 精华
大家好,今天分享一下鸿蒙开发中的远程推送通知。
之前分享过本地推送通知的方式,但是通过服务器远程推送通知是更加常见的推送方式,下面为大家分享详细的开发步骤。
移动端
先说移动开发端,首先要在移动端添加权限:
{ "name": "ohos.permission.PUBLISH_AGENT_REMINDER" }
第二部,需要获取推送服务的Token,方法是:
const pushToken: string = await pushService.getToken();
这里的Token是可能随时变化的,所以获取方法最好写在onCreate()方法中,并同时将Token上传到服务端。
第三步,请求推送通知权限,这一方法可以写在onWindowStageCreate方法下:
notificationManager.requestEnableNotification(this.context).then(() => {
}).catch((err: BusinessError) => {
});
最后移动端还需要绑定应用内账号匿名标识。什么意思呢,就是在移动端先自主生成一个唯一的profileId,它类似userid,但是不建议直接使用userid,将profileId上传到服务端,并且在本地绑定。
它的作用是用户登录后绑定profileId就会收到远端的推送,反之用户退出时随之解绑profileId后就不会再收到推送,绑定和解绑的具体代码如下:
pushService.bindAppProfileId(pushCommon.AppProfileType.PROFILE_TYPE_APPLICATION_ACCOUNT, profileId).then(() => {
console.log('成功');
}).catch((err: BusinessError) => {
console.log('失败');
});
pushService.unbindAppProfileId(profileId, (err: BusinessError) => {
if (err) {
hilog.error(0x0000, 'testTag', 'Failed to unbind app profile id: %{public}d %{public}s', err.code, err.message);
} else {
hilog.info(0x0000, 'testTag', 'Succeeded in unbinding app profile id.');
}
});
这样移动端的工作基本完成了,接下来是服务端。
服务端
服务端所有的工作就配置header和body去完成推送接口的请求工作,它的请求信息是这样的:
// Request URL
POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
// Request Header
Content-Type: application/json
Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
push-type: 0
// Request Body
{
"payload": {
"notification": {
"category": "MARKETING",
"title": "普通通知标题",
"body": "普通通知内容",
"profileId": "111***222",
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["MAMzLg**********lPW"]
}
}
可以看到,在上面的请求中我们还缺少一些信息,首先是URL中的projectId,它表示项目ID,登录AGC网站,选择“开发与服务”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。
接下来是header中的参数Authorization,它是JWT格式的字符串,由三部分使用字符’.’拼接组成,分别是Header、Payload和Signature。
Header和Payload都是对应的结构体生成的Base64编码,Header的结构体是这样的:
{
"kid": "*****",
"typ": "JWT",
"alg": "PS256"
}
其中kid是服务账号密钥文件中key_id字段,Payload的结构体如下:
{
"aud": "https://oauth-login.cloud.huawei.com/oauth2/v3/token",
"iss": "*****",
"exp": 1581410664,
"iat": 1581407064
}
其中iss是服务账号密钥文件中sub_account字段。iat是当前时间戳,exp则是时间戳加3600后的值。
最后,Signature是由Header和Payload进行Base64编码后,由’.’拼接,使用SHA256withRSA/PSS算法计算得来。
Request Body中的profileId和token我们在上面已经说过,配置好所有的请求头和请求参数就可以调用接口进行推送了。
