鸿蒙中使用极光推送

官方给出的步骤是对的,就是一时不知道从何下手,自己整了下,按照这个来就行

1.步骤

打开 APP 通知功能

1.先按照这个页面进行配置SDK 集成指南 - 极光文档,主要就是下载极光sdk,然后在AGC里开通推送服务,配置调试证书,配置签名,配置应用 client_id
2.在极光平台配置包名和 appKey(Server Key 在AGC里可以下载JSON)一定要启用,包名需要和AGC的一样(json文件可以在这个文档按照配置厂商参数申请指南 - 极光文档
3.创建新的一个Ability在product中,和EntryAbility.ets同级(就是在Entry模块中),Ability的代码下面会有,然后在module.json5中配置srcEntry字段 "srcEntry": "./ets/entryability/MyAbilityStage.ets", ,这样才可以启动这个Ability (点击通知消息打开应用的话,还是在module.json5配置actions为:"action.system.home")这个文件现在有两个Ability。一个在module下面,一个是默认的在abilities下面,module是自己新加的
4.在EntryAbility里也需要调用个方法,还需要写个方法,下面代码也有
5.在页面中使用eventhub来进行获取Registration ID
6.拿到Registration ID以后就说明成功了,这样就可以测试是否可以推送成功了
这个是测试地址极光推送,里面有个字段是HarmonyOS category 可以根据自己需求看文档填写文档中心这里需要注意(如果app在前台可以推送,后台不可以推送的话是因为AGC上没有开通消息权益,下面会详细写)
这里也有官方给出的demo感兴趣的可以自己看看资源下载 - 极光文档

2.代码

1. MyAbilityStage.ets 这个直接复制就能用,就是setAppKey这个key需要替换自己的
TypeScript 复制代码
import AbilityStage from '@ohos.app.ability.AbilityStage';
import { hilog } from '@kit.PerformanceAnalysisKit';
import {
  CallBackMsg,
  JAliasMessage,
  JCmdMessage,
  JCustomMessage,
  JMessage,
  JMessageExtra,
  JMessageVoIP,
  JMobileNumberMessage,
  JPushInterface,
  JTagMessage
} from '@jg/push';
import { common } from '@kit.AbilityKit';

const TAG: string = 'JPUSH-JLog-MyAbilityStage'

class MyCallBackMsg extends CallBackMsg {
  context: common.ApplicationContext

  constructor(co: common.ApplicationContext) {
    super();
    this.context = co
  }

  /**
   * 注册成功后回调rid
   * @param registrationId 注册成功后回调rid
   */
  onRegister(registrationId: string): void {
    hilog.info(0x0000, TAG, '%{public}s', 'onRegister registrationId:' + registrationId);
    this.context.eventHub.emit('jPush_event_rid', registrationId);
    this.context.eventHub.emit('jPush_event', "registrationId:" + registrationId);
  }

  /**
   * 长连接登陆 回调
   * @param isConnected true:成功,false:失败
   */
  onConnected(isConnected: boolean): void {
    hilog.info(0x0000, TAG, '%{public}s', 'onConnected isConnected:' + isConnected);
    this.context.eventHub.emit('jPush_event_isConnected', isConnected);
    this.context.eventHub.emit('jPush_event', "isConnected:" + isConnected);
  }

  /**
   * 操作 tag 接口回调
   * @param jTagMessage
   * export class JTagMessage {
   * sequence?: number //对应操作id,全局不要重复
   * code?: number //0成功,JTagMessage.CODE_TIME_OUT超时
   * op?: string
   * tags?: string[] //对应数据
   * curr?: number //数据当前页数,页数从1开始
   * total?: number //数据总页数
   * msg?: string
   * }
   */
  onTagOperatorResult(jTagMessage: JTagMessage): void {
    hilog.info(0x0000, TAG, '%{public}s', 'onTagOperatorResult JTagMessage code:' + jTagMessage.code);
    hilog.info(0x0000, TAG, '%{public}s', 'onTagOperatorResult JTagMessage:' + JSON.stringify(jTagMessage));
    this.context.eventHub.emit('jPush_event', "onTagOperatorResult:" + JSON.stringify(jTagMessage));
  }

  /**
   * 操作 Alias 接口回调
   * @param jAliasMessage
   * export class JAliasMessage {
   * sequence?: number //对应操作id,全局不要重复
   * code?: number //0成功,JAliasMessage.CODE_TIME_OUT超时
   * op?: string
   * alias?: string //对应数据
   * curr?: number
   * total?: number
   * msg?: string
   * }
   */
  onAliasOperatorResult(jAliasMessage: JAliasMessage): void {
    hilog.info(0x0000, TAG, '%{public}s', 'onAliasOperatorResult jAliasMessage:' + JSON.stringify(jAliasMessage));
    this.context.eventHub.emit('jPush_event', "onAliasOperatorResult:" + JSON.stringify(jAliasMessage));
  }

  onMobileNumberOperatorResult(jMobileNumberMessage: JMobileNumberMessage) {
    hilog.info(0x0000, TAG, '%{public}s',
      'onMobileNumberOperatorResult jMobileNumberMessage:' + JSON.stringify(jMobileNumberMessage));
    this.context.eventHub.emit('jPush_event', "onMobileNumberOperatorResult:" + JSON.stringify(jMobileNumberMessage));
  }

  /**
   * 通知点击事件回调
   * @param jMessage
   *
   * export class JMessage {
   * msgId?: string //通知id
   * title?: string //通知标题
   * content?: string//通知内容
   * extras?: string//自定义数据
   * }
   */
  onClickMessage(jMessage: JMessage) {
    hilog.info(0x0000, TAG, '%{public}s', 'onClickMessage jMessage:' + JSON.stringify(jMessage));
    this.context.eventHub.emit('jPush_event', "onClickMessage:" + JSON.stringify(jMessage));
  }

  onArrivedMessage(jMessage: JMessage) {
    hilog.info(0x0000, TAG, '%{public}s', 'onArrivedMessage jMessage:' + JSON.stringify(jMessage));
    this.context.eventHub.emit('jPush_event', "onArrivedMessage:" + JSON.stringify(jMessage));
  }

  /**
   * 自定义信息通知回调
   *  回调一:冷启动调用sdk初始化后回调之前还没有回调的信息
   *  回调二:app存活时会直接回调信息
   * @param jCustomMessage
   *
   * export class JCustomMessage {
   *  msgId?: string //通知id
   *  title?: string //通知标题
   *  content?: string //通知内容
   *  contentType?: string //通知内容类型
   *  extras?: Record<string, Object> //通知自定义键值对
   *  ttl?: number //后台下发的信息过期时间,单位秒
   *  stime?: number //后台下发时间,毫秒
   * }
   */
  onCustomMessage(jCustomMessage: JCustomMessage) {
    hilog.info(0x0000, TAG, '%{public}s', 'onCustomMessage jCustomMessage:' + JSON.stringify(jCustomMessage));
    this.context.eventHub.emit('jPush_event', "onCustomMessage:" + JSON.stringify(jCustomMessage));
  }

  /**
   * 通知扩展消息回调
   * @param jMessageExtra
   *
   * export class JMessageExtra {
   * msgId?: string //通知id
   * title?: string //通知标题
   * content?: string//通知内容
   * extras?: Record<string, Object>//自定义数据
   * extraData?: string//通知扩展消息的自定义数据
   * }
   */
  onJMessageExtra(jme: JMessageExtra) {
    hilog.info(0x0000, TAG, '%{public}s', 'onJMessageExtra jme:' + JSON.stringify(jme));
    this.context.eventHub.emit('jPush_event', "onJMessageExtra:" + JSON.stringify(jme));
  }

  /**
   * VoIP呼叫消息回调
   * export class JMessageVoIP {
   * msgId?: string //通知id
   * extraData?: string //VoIP自定义数据
   }
   * @param jmVoIP
   */
  onJMessageVoIP(jmVoIP: JMessageVoIP) {
    hilog.info(0x0000, TAG, '%{public}s', 'JMessageVoIP jmVoIP:' + JSON.stringify(jmVoIP));
    this.context.eventHub.emit('jPush_event', "JMessageVoIP:" + JSON.stringify(jmVoIP));
  }

  /**
   * 交互事件回调
   * @param cmdMessage
   * export class JCmdMessage {
   * public static CMD_PUSH_STOP = 2007 //通知停止 设置回调
   * public static CMD_PUSH_RESUME = 2006 //  通知恢复 设置回调
   *
   * cmd?: number  //操作事件,2007通知停止,2006恢复通知
   * errorCode?: number //0表示成功,其他为错误
   * msg?: string //内容信息
   * extra?: Record<string, Object>
   * }
   */
  onCommandResult(cmdMessage: JCmdMessage) {
    hilog.info(0x0000, TAG, '%{public}s', 'onCommandResult cmdMessage:' + JSON.stringify(cmdMessage));
    this.context.eventHub.emit('jPush_event', "onCommandResult:" + JSON.stringify(cmdMessage));
  }
}

export default class MyAbilityStage extends AbilityStage {
  onCreate() {
    // 应用的HAP在首次加载的时,为该Module初始化操作
    hilog.info(0x0000, TAG, '%{public}s', 'MyAbilityStage onCreate');
    JPushInterface.setChannel("demo")
    JPushInterface.setAppKey("你自己的key")
    JPushInterface.setDebug(true)
    JPushInterface.setCallBackMsg(new MyCallBackMsg(this.context.getApplicationContext()))

  }
}
2.EntryAbility.ets
TypeScript 复制代码
import {
  abilityAccessCtrl,
  AbilityConstant,
  common,
  PermissionRequestResult,
  Permissions,
  UIAbility,
  Want
} from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { PreferencesUtils } from 'common';
import { notificationManager } from '@kit.NotificationKit';
import { JMessage, JPushInterface } from '@jg/push';
import { BusinessError } from '@kit.BasicServicesKit';
import { pushCommon, pushService } from '@kit.PushKit';

const TAG: string = 'JPUSH-JLog-PushMessageAbility'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.setClickWant(want)
    JPushInterface.init(this.context)
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }


  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, TAG, '%{public}s', 'Ability onNewWant');
    super.onNewWant(want, launchParam)
    this.setClickWant(want);
  }

  private async setClickWant(want: Want) {
    let j: JMessage | undefined = await JPushInterface.setClickWant(want);
    hilog.info(0x0000, TAG, '%{public}s', 'setClickWant: ' + JSON.stringify(j));
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    // 读取本地token(异步)
    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}
3.页面调用
TypeScript 复制代码
onEventhub() {
    // 获取eventHub
    let eventhub = this.context.getApplicationContext().eventHub;
    hilog.info(0x0000, TAG, '%{public}s', 'jPush_event on');
    // 执行订阅操作
    eventhub.on('jPush_event_rid', (data: string) => {
      // 触发事件,完成相应的业务操作
      hilog.info(0x0000, TAG, 'jPush_event_rid:' + JSON.stringify(data));
      Logger.log(data)
      this.rid = "rid: " + data;
    }); // 执行订阅操作
    eventhub.on('jPush_event_isConnected', (data: boolean) => {
      // 触发事件,完成相应的业务操作
      hilog.info(0x0000, TAG, 'jPush_event_isConnected:' + JSON.stringify(data));
      this.rid = "rid: " + JPushInterface.getRegistrationId();
      Logger.log(JPushInterface.getRegistrationId() + 'hhhhhhhhh')
    });
    // 执行订阅操作
    eventhub.on('jPush_event', (data: string) => {
      // 触发事件,完成相应的业务操作
      hilog.info(0x0000, TAG, '%{public}s', 'jPush_event:' + data);
      this.message = this.message + "\n" + JSON.stringify(data)
      this.message = this.message + "\n" + "============================"
    });
  }

  aboutToAppear(): void {
    this.onEventhub()
  }

4.前台推送,后台不推送Bug

是因为AGC消息权益没有开通激活,根据自己的业务需求开通,激活以后需要根据业务类型取值

自分类权益生效后,应用的推送消息将根据category字段进行归类。

官方文档:文档中心