Harmony NEXT 推送基础版实现

520 阅读4分钟

只是最基础的推送功能,更多内容扩展看文档

1、工程配置

  1. 在项目模块(entry)下src/main/module.json5 增加metaDta

    "metadata": [
      {
        "name": 'client_id',
        "value": "11*****"
      }
    ]
    
  2. 配置证书等文件

    File -->Project Structure-->Signing Configs

sign.png

注意:不要勾选Automatically generate signture. 勾选了会自动生成证书并覆盖配置的证书信息 生成和配置证书 自行查看文档

2、后台配置

  1. 开通推送服务。 配置页 可以稍后根据错误码进行配置

push服务.png

  1. 配置API服务

    在我的项目(我的项目,和我的应用 不一样),项目设置,API管理 打开推送服务

API服务.png

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

名称说明
项目ID388********2098在后台的项目ID就是,或者通过 服务帐号密钥文件获取

b.配置header:

字段说明
COntent-Typeapplication/json
push-type0一般情况下传0就行
AuthorizationBearer jwt这个要详细说一下

push-type取值说明:

消息类型,取值如下:0:通知消息1:卡片刷新消息2:通知扩展消息6:后台消息7:实况窗更新消息10:VoIP呼叫消息
生成服务帐号鉴权令牌

凭证.png 点生成公钥--> 创建并下载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字段,标识数据生成者
iat10位时间戳(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
  }
}