ke: 鸿蒙 UI 整改:emoji→AmIcon 图标、宽屏侧栏、Md 第三方库、通知可配置项
- common/Icons.ets(生成器产出):43 枚与 WebUI icons.tsx 同几何的 Path 图标 - NavItems.ts:icon(emoji) → iconKey,与 WebUI 导航同图标 - 全页面 emoji 清除(空态改单行灰字,按钮/头像/刷新等换 AmIcon) - MailDetailPage 接入 @luvi/lv-markdown-in(第三方,替代手写解析器) - WideSidebar + MainPage isWide(≥768vp):宽屏侧栏 60vp 图标轨、藏底部条、onAreaChange 断点 - 通知=可配置项(默认关):PushService.isEnabled/setEnabled + reportToken 最前 gate (关=不取token/不弹权限/不打网关)+ SettingsPage Toggle + 服务端通道状态提示 - EntryAbility.onCreate 解析 want:冷启点通知也能路由(原来只有 onNewWant) - 判据:harmony-widescreen(4) + harmony-push-optin(4) 新增;harmony-nav 同步 iconKey/条件 padding
This commit is contained in:
@ -37,6 +37,14 @@ const DOMAIN: number = 0x0001;
|
||||
const TAG: string = 'PushService';
|
||||
const STORE: string = 'push_store';
|
||||
const MARKER_KEY: string = 'reported_marker';
|
||||
const SETTING_KEY: string = 'push_enabled';
|
||||
|
||||
/*
|
||||
* ★ 2026-09-15:接入系统通知是**可配置项**(用户强调多次)。
|
||||
* 默认 **关** —— 自部署的用户没有服务端推送凭证时,App 不取 token、不请求权限、不上报、不打网关。
|
||||
* 开了以后才走 getToken → requestEnableNotification → 上报这一整条。
|
||||
* 这条开关存在 PushService 里(而不是设置页 @State),是因为 onCreate(ability 阶段)要读它。
|
||||
*/
|
||||
|
||||
/** 点击跳转的目标(由通知 data 解析而来;只有两样东西要路由) */
|
||||
export interface PushRoute {
|
||||
@ -72,6 +80,31 @@ export class PushService {
|
||||
return PushService.instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读「接入系统通知」开关(**默认关** —— 自部署/无凭证时零开销)。
|
||||
* 读不到(首次/异常)都返回 false:宁可不开,也不要"默认就把用户裹进来"。
|
||||
*/
|
||||
static isEnabled(context: common.Context): boolean {
|
||||
try {
|
||||
const store = preferences.getPreferencesSync(context, { name: STORE });
|
||||
const v = store.getSync(SETTING_KEY, false);
|
||||
return v === true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** 写开关(设置页 Toggle 回调;写入失败静默 —— 关着总比误开着安全,下次再试不迟) */
|
||||
static setEnabled(context: common.Context, enabled: boolean): void {
|
||||
try {
|
||||
const store = preferences.getPreferencesSync(context, { name: STORE });
|
||||
store.putSync(SETTING_KEY, enabled);
|
||||
store.flush();
|
||||
} catch (e) {
|
||||
hilog.info(DOMAIN, TAG, '推送开关写不进去(静默):%{public}s', (e as BusinessError).message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取 Push Kit 的 token。**取不到就返回空串**(没装 HMS Core、没登录华为账号、没权限……都是正常情况)。
|
||||
*/
|
||||
@ -132,6 +165,15 @@ export class PushService {
|
||||
* 放在启动后调用(登录成功之后、或已有账号时),调用方**不需要** catch —— 它自己内部全静默。
|
||||
*/
|
||||
async reportToken(api: ApiClient): Promise<void> {
|
||||
/*
|
||||
* ★ 开关 gate(2026-09-15):"接入系统通知"是**可配置项**,默认关。
|
||||
* 关 ⇒ 不取 token(不碰 Push Kit)、不申请权限(不弹系统弹窗)、不上报、不打网关 ——
|
||||
* 自部署用户没有服务端推送凭证时,这一整条都是无谓的开销。
|
||||
* 这条 gate 在**最前**:getToken/requestEnableNotification 都在它后面。
|
||||
*/
|
||||
if (!PushService.isEnabled(this.context)) {
|
||||
return;
|
||||
}
|
||||
const token: string = await this.getToken();
|
||||
if (token.length === 0) {
|
||||
return; // 没有 token 就没什么可报的(这不是错误)
|
||||
|
||||
Reference in New Issue
Block a user