同一設備多賬號登錄,如何避免消息推送“串門”?
對各應用廠商而言,推送通知消息是App提高用戶活躍度和轉化率的高性價比營銷工具。然而,當一個用戶設備登錄多個賬號時,開發者可能會遇到同一條消息在同一設備的不同賬號上重復展示的問題,這不僅降低了消息推送的精準度,還可能對用戶造成困擾。
為解決這一問題,HarmonyOS SDK推送服務(Push Kit)推出了通知消息賬號校驗功能。該功能允許開發者根據終端設備上不同賬號的屬性來推送消息,確保通知精準地發送給對應設備上的對應賬號。例如,在華為手機上,某個應用同時登錄了賬號A和賬號B。當賬號A切換至賬號B后,原本發送給賬號A的通知消息在到達設備后將不會展示,從而避免賬號B看到賬號A的消息。

錯誤示例:同一設備賬號A切換至賬號B后,接收并展示賬號A的通知消息
若要實現賬號校驗功能,其關鍵便在于profileId。profileId是應用內賬號id匿名標識,無論用戶是選擇華為賬號作為應用登錄賬號,還是選擇使用應用賬號直接登錄賬號,該profileId都是應用通過賬號映射的唯一匿名標識。所以我們需要為待綁定的賬號生成一個非空唯一的profileId,這里不建議使用真實的賬號id,推薦使用賬號id自行生成對應的匿名標識,能與該賬號id建立唯一映射關系即可,生成算法無限制。
那么,當用戶選擇華為賬號作為應用登錄賬號并登錄賬號A成功后,開發者可調用Push Kit綁定接口bindAppProfileId()將已生成的賬號A的profileId綁定到當前設備的應用token上。Push Token標識了每臺設備上的每個應用,是Push Kit實現消息推送的前提條件,應用服務器在發送通知消息時token中若攜帶該賬號A的profileId,則只有當前設備登錄的華為賬號為賬號A時,才會展示通知消息;若不攜帶profileId,則無論當前設備登錄的華為賬號是否為賬號A,都正常展示通知消息。
下面,我們來看一下實現推送服務賬號校驗功能的具體開發步驟。
開發步驟
import { pushService } from '@kit.PushKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
// 入參 want 與 launchParam 并未使用,為初始化項目時自帶參數
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
// 獲取Push Token
try {
const pushToken: string = await pushService.getToken();
hilog.info(0x0000, 'testTag', 'Succeeded in getting push token');
} catch (err) {
let e: BusinessError = err as BusinessError;
hilog.error(0x0000, 'testTag', 'Failed to get push token: %{public}d %{public}s', e.code, e.message);
}
// 上報Push Token并上報到您的服務端
}
}
- 為確保應用可正常收到通知消息,建議應用發送通知前調用requestEnableNotification()方法彈出提醒,告知用戶需要允許接收通知消息。
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common } from '@kit.AbilityKit';
const TAG: string = '[PublishOperation]';
const DOMAIN_NUMBER: number = 0xFF00;
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
notificationManager.isNotificationEnabled().then((data: boolean) => {
hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));
if(!data){
notificationManager.requestEnableNotification(context).then(() => {
hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
}).catch((err : BusinessError) => {
if(1600004 == err.code){
hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
} else {
hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
}
});
}
}).catch((err : BusinessError) => {
hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
});
- 為待綁定的賬號生成一個非空唯一的profileId,調用bindAppProfileId()方法,添加當前設備上該用戶與應用的關系。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { pushCommon, pushService } from '@kit.PushKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 定義需要綁定的profileId,建議使用賬號id對應的匿名標識
const profileId = '1****9';
// 綁定應用賬號
pushService.bindAppProfileId(pushCommon.AppProfileType.PROFILE_TYPE_APPLICATION_ACCOUNT, profileId).then(() => {
hilog.info(0x0000, 'testTag', 'Succeeded in binding app profile id');
}).catch((err: BusinessError) => {
hilog.error(0x0000, 'testTag', 'Failed to bind app profile id: %{public}d %{public}s', err.code, err.message);
});
-
建議您將Push Token和生成的profileId上報到應用服務端,便于應用服務端向終端推送消息。
-
應用服務端調用REST API推送通知消息,通知消息示例如下:
// 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": ["IQAAAA**********4Tw"]
}
}
消息發送成功后,Push Kit會先校驗綁定賬號(華為賬號或應用賬號)時的AppProfileType。
若綁定華為賬號,則先校驗下發消息中攜帶的profileId和之前應用綁定的profileId是否一致,再校驗當前登錄的華為賬號和綁定時登錄的分布式賬號是否一致,若全部滿足則展示消息,否則不展示消息。
若綁定應用賬號則校驗下發消息中攜帶的profileId和之前應用綁定的profileId是否一致,若滿足則展示消息,否則不展示消息。
了解更多詳情>>
訪問推送服務聯盟官網
浙公網安備 33010602011771號