背景
搜狐新聞作為HarmonyOS的合作伙伴,于2023年12月成功上架鴻蒙單框架應用市場,成為首批鴻蒙應用矩陣的一員。
新聞類推送作為應用的重要組成部分,在二期規劃中,我們將推送功能列為核心功能模塊。本文將推送集成過程中的步驟和經驗分享給大家,以供大家學習交流,不足之處還望大家多多指正。
開發環境
IDE:DevEco Studio NEXT Developer Beta1,Build Version: 5.0.3.300, built on May 10, 2024。
SDK:HarmonyOS NEXT Developer Beta1 SDK, based on OpenHarmony SDK Ohos_sdk_public 5.0.0.22 (API Version 12 Canary3)。
集成步驟
1.生成簽名證書
在主菜單欄單擊Build > Generate Key?and CSR。先生成P12證書,后生產CSR證書,這和IOS證書生成順序恰好相反。
1.生成p12證書。
Key Store File:設置密鑰庫文件存儲路徑,并填寫p12文件名;
Alias:密鑰的別名信息,用于標識密鑰名稱。請記住該別名,后續簽名配置需要使用;
Validity:證書有效期,默認25年;
Certificate:輸入證書基本信息,如組織、城市或地區、國家碼等。
2.生成CSR證書。
兩者都生成完后的結果如圖
2.申請開發和發布證書
登錄AppGallery Connect,選擇“用戶與訪問”。
在左側導航欄點擊“證書管理”,進入“證書管理”頁面,點擊“新增證書”。
在彈出的“新增證書”窗口填寫要申請的證書信息,點擊“提交”。可建最多兩個開發證書,一個發布證書。
3.申請開發和發布Profile
選擇“HarmonyOS應用 >?HAP Provision Profile管理”,進入“管理HAP Provision Profile”頁面,點擊右上角“添加”。
在彈出的“HarmonyAppProvision信息”窗口添加調試Profile,完成后點擊“提交”。
???????
4.配置應用簽名證書指紋
打開DevEco Studio,進入配置工程的簽名信息的界面,點擊“Store file(*.p12)”后的指紋圖標。彈出的“Certificate Fingerprint”窗口將展示自動生成的簽名證書指紋,復制保存此信息
???????
在“項目設置 > 常規”頁面的“應用”區域,點擊“SHA256證書/公鑰指紋”后的“添加證書指紋”。
指紋配置成功后大約10分鐘左右生效。
在“項目設置 > 常規”頁面的“應用”區域,點擊“SHA256證書/公鑰指紋”后的“添加公鑰指紋(HarmonyOS API 9及以上)”。指紋配置成功后大約10分鐘左右生效。
5.開通推送服務
登錄AppGallery Connect網站,選擇“我的項目”,在項目列表中找到您的項目,在左側導航欄選擇“增長?>?推送服務”,點擊“立即開通”,在彈出的提示框中點擊“確定”。開通后頁面如下:
?6.配置Client ID
在項目模塊級別下的src/main/module.json5(例如entry/src/main/module.json5)中,新增metadata并配置client_id,如下所示:
7.申請用戶推送權限
在 onWindowStageCreate(windowStage: window.WindowStage) 方法中申請推送權限彈窗。代碼如下:
notificationManager.requestEnableNotification(this.context).then(() => {console.info("requestEnableNotification success");}).catch((err: Base.BusinessError) => {console.error(`requestEnableNotification fail: ${JSON.stringify(err)}`);});
8.獲取PushToken
在 EntryAbility類中的onCreate,添加上獲取pushToken方法,調用此方法,需保持設備網絡暢通。
export default class EntryAbility extends UIAbility {async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');GlobalContext.getContext().setObject("context", this.context);try {const pushToken: string = await pushService.getToken();hilog.info(0x0000, 'testTag', 'Get push token successfully: %{public}s', pushToken);//保存pushToken 并 上傳至應用服務端} catch (err) {let e: BusinessError = err as BusinessError;hilog.error(0x0000, 'testTag', 'Get push token catch error: %{public}d %{public}s', e.code, e.message);}}
9.收到推送
1.冷啟動
通過EntryAbility文件中的onCreate方法,want.parameters方法可以獲取到推送的詳細數據。
在示例項目中,跳轉的落地頁鏈接存放在uri字段中,拿到該鏈接,我們將它暫存在一個單例對象中,在首頁加載完后,從該單例對象,取出鏈接,完成router跳轉動作。
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');//處理push,獲取push中的數據let pushLink: string = (want.parameters as Record<string, string>)['uri'] || '';//跳轉落地頁:單例存儲跳轉鏈接,在首頁加載完成后,讀取鏈接完成跳轉SNPushManager.instance().pushLink = pushLink;}
以下示例為?SNPushManager單例中的部分業務代碼,pushSpecialPage()為首頁加載完后的跳轉落地頁方法,以供大家參考。
export class SNPushManager {private static manager: SNPushManager;public static instance(): SNPushManager {if (!SNPushManager.manager) {SNPushManager.manager = new SNPushManager();}return SNPushManager.manager;}private constructor() {}public pushLink:string = '';// push 跳轉對應的落地頁public pushSpecialPage() {if(this.pushLink.length > 0) {openProtocolURL(this.pushLink);// push完后需要置空,不然可能導致跳轉兩次this.pushLink = '';}}
}
2.熱啟動
與冷啟動不同的時,熱啟動在onNewWant方法中,取出推送的落地頁鏈接,因此時應用已處于運行階段,可以直接完成跳轉。代碼中的openProtocolURL(pushLink),為本示例項目中處理router跳轉的統一方法。
onNewWant(want: Want): void {let pushLink: string = (want.parameters as Record<string, string>)['uri'] || '';hilog.info(0x0000, 'testTag', 'Get message data successfully: %{public}s', JSON.stringify(want.parameters));//跳轉落地頁openProtocolURL(pushLink);}
結語
通過以上步驟,即可完成HarmonyOS推送開發,以供大家參考學習。HarmonyOS的SDK還在不斷迭代完善中,截止本文發表前,該步驟和集成方法是可行的。由于首次接觸HarmonyOS的推送,文中如有不足或者錯誤的地方,歡迎大家指出,一起學習提高。