鸿蒙开发远程推送详解 原创 精华

幽蓝计划
发布于 2025-7-25 08:35
浏览
0收藏

大家好,今天分享一下鸿蒙开发中的远程推送通知。

之前分享过本地推送通知的方式,但是通过服务器远程推送通知是更加常见的推送方式,下面为大家分享详细的开发步骤。

移动端

先说移动开发端,首先要在移动端添加权限:

{ "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我们在上面已经说过,配置好所有的请求头和请求参数就可以调用接口进行推送了。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
收藏
回复
举报
回复
    相关推荐