接入原生壳生命周期事件

新增 app.lifecycle HostBridge 能力与 H5 订阅入口

Expo 壳通过 React Native AppState 注入真实前后台状态

Tauri 壳通过主窗口 focus 和 blur 注入真实激活状态

更新壳能力漂移检查、测试和架构文档
This commit is contained in:
2026-06-18 02:16:47 +08:00
parent 45eec17007
commit 346368f0e7
16 changed files with 299 additions and 6 deletions

View File

@@ -6,6 +6,7 @@ import {
normalizeHostBridgeColorScheme,
normalizeHostBridgeExportFileName,
normalizeHostBridgeExternalUrl,
normalizeHostBridgeLifecycleState,
} from './hostBridge';
describe('HostBridge shared contract helpers', () => {
@@ -49,6 +50,7 @@ describe('HostBridge shared contract helpers', () => {
test('识别 HostBridge 能力白名单', () => {
expect(isHostBridgeCapability('appearance.getColorScheme')).toBe(true);
expect(isHostBridgeCapability('share.open')).toBe(true);
expect(isHostBridgeCapability('app.lifecycle')).toBe(true);
expect(isHostBridgeCapability('app.setBadgeCount')).toBe(true);
expect(isHostBridgeCapability('navigation.canGoBack')).toBe(true);
expect(isHostBridgeCapability('unknown.capability')).toBe(false);
@@ -71,4 +73,11 @@ describe('HostBridge shared contract helpers', () => {
expect(normalizeHostBridgeColorScheme('unspecified')).toBe('unknown');
expect(normalizeHostBridgeColorScheme(null)).toBe('unknown');
});
test('归一化宿主生命周期状态', () => {
expect(normalizeHostBridgeLifecycleState('active')).toBe('active');
expect(normalizeHostBridgeLifecycleState('background')).toBe('background');
expect(normalizeHostBridgeLifecycleState('extension')).toBe('inactive');
expect(normalizeHostBridgeLifecycleState(null)).toBe('inactive');
});
});

View File

@@ -35,6 +35,7 @@ export type HostBridgeMethod = (typeof HOST_BRIDGE_METHODS)[number];
export const HOST_BRIDGE_CAPABILITIES = [
...HOST_BRIDGE_METHODS,
'host.events',
'app.lifecycle',
'navigation.canGoBack',
] as const;
@@ -103,6 +104,22 @@ export type NavigationCanGoBackEventPayload = {
canGoBack: boolean;
};
export type HostAppLifecycleState = 'active' | 'inactive' | 'background';
export type AppLifecycleEventPayload = {
state: HostAppLifecycleState;
focused: boolean;
nativeState?: string;
};
export function normalizeHostBridgeLifecycleState(
rawState: unknown,
): HostAppLifecycleState {
return rawState === 'active' || rawState === 'background'
? rawState
: 'inactive';
}
export type HostAppearanceColorScheme = 'light' | 'dark' | 'unknown';
export type AppearanceColorSchemeResult = {