用户原话:「另外,要有定期同步的功能,就是家书app在后台,也能自动同步
数据,这样打开app,基本上数据就是最新的。同步的策略,去synccalendar找,
里面有办法。」
四层调度(缺一层就会在某种场景下"永远不同步"):
1. 前台:onForeground 时若距上次同步超过 5 分钟,补一次
2. 退后台:requestSuspendDelay 短时任务(单次≤3分钟、单日10分钟配额)
3. 延迟任务:workScheduler(周期 2 小时 —— 系统按活跃分组压制,
请求更短不报错但不生效)
4. 桌面卡片:updateDuration:1(=30 分钟,唯一不受压制的通道,
每天上限 50 次);先推卡片再触发同步
关键约束(写错了都不报错,只是静默失效):
- WorkSchedulerExtensionAbility 单次回调上限 2 分钟,必须在 finally 里 stopWork
- 后台扩展跑在独立进程,EntryAbility.onCreate 的初始化一步都没跑过
⇒ prepare() 必须补齐 token store / module token / FbDb.open
- 回前台必须 cancelSuspendDelay 归还配额,否则两三天后用光
- workInfo 要带 isPersisted,否则重启后任务永久消失
- abilityName 必须与 module.json5 声明一致,对不上时 startWork 不报错但不回调
- ApplicationInfo 没有 bundleName 字段,包名在 .name
其他:
- 卡片驱动的同步有节流(CARD_MIN_GAP_MS 25 分钟 < 卡片刷新 30 分钟,
反了就是每次刷新都被跳过、一次都不跑)
- 设置页新增「同步」分组:开关 + 上次同步时间 + 说明
同时修:首页日程红线左侧缺一块(nowLayer 从 Row{圆点;线} 改成单个
Column 满宽 —— Row 里圆点占行首,线只能从第 5vp 起画)
守卫 1106/0、v83 反向验证 10/10 全中、已装机。
123 lines
5.1 KiB
JSON
123 lines
5.1 KiB
JSON
{
|
||
"module": {
|
||
"name": "entry",
|
||
"type": "entry",
|
||
"description": "$string:module_desc",
|
||
"mainElement": "EntryAbility",
|
||
"deviceTypes": [
|
||
"phone",
|
||
"tablet"
|
||
],
|
||
"requestPermissions": [
|
||
{
|
||
"name": "ohos.permission.INTERNET"
|
||
},
|
||
{
|
||
"name": "ohos.permission.GET_NETWORK_INFO"
|
||
},
|
||
{
|
||
// 🔴 质感握姿(左手/右手握持)—— 用户 2026-10-16 第 4 条。
|
||
// `multimodalAwareness.motion` 的 `holdingHandChanged` 要求此权限。
|
||
// ⚠️ 它是 `system_grant` + `availableLevel: normal` + `provisionEnable: false`
|
||
// (在 SDK 的权限定义里核过)⇒ **安装即获得,不会弹授权框**。
|
||
// ⚠️ API 20 起才有;低版本设备会抛 801(能力不支持)——
|
||
// 代码里已 try/catch 兜住,拿不到就退回默认方向。
|
||
"name": "ohos.permission.DETECT_GESTURE"
|
||
}
|
||
],
|
||
"deliveryWithInstall": true,
|
||
"installationFree": false,
|
||
/* 🔴 v73(用户 2026-10-21「有地址的可以一键导航」):
|
||
这是 `bundleManager.canOpenLink()` 的**前置条件**,不是可选配置。
|
||
⚠️ 没声明时 `canOpenLink` **不抛错、直接返回 false** ⇒
|
||
"手机上装了高德"和"我忘了声明"在运行期长得一模一样,
|
||
症状是"导航按钮点了只是复制了一下地点",极难归因。
|
||
⚠️ 四个 scheme 必须与 `common/FbNav.ets` 的 `MAP_APPS[].probe` **一一对应**;
|
||
加一家地图要么两处一起加,要么两处一起没有。守卫 `_fb_arkts_guard.js` 钉了这条。
|
||
⚠️ 只声明 scheme 名(`amapuri`),不带 `://`。 */
|
||
"querySchemes": [
|
||
"amapuri",
|
||
"baidumap",
|
||
"maps",
|
||
"qqmap"
|
||
],
|
||
"pages": "$profile:main_pages",
|
||
"abilities": [
|
||
{
|
||
"name": "EntryAbility",
|
||
"srcEntry": "./ets/entryability/EntryAbility.ets",
|
||
"description": "$string:EntryAbility_desc",
|
||
// 🔴 v45 修:原为 `$media:layered_image`(分层图标),导致桌面图标
|
||
// 外面有一圈米色底、且图案显得小。原因:
|
||
// · `background.png` 是**纯米色满幅图**(512²)⇒ 那圈底色;
|
||
// · `foreground.png` 的图案**只占 44%**,系统还要留安全区
|
||
// ⇒ 图案被缩得更小。
|
||
// 另一个真 bug:`app.json5` 的分层图在 **AppScope** 下找,
|
||
// 但 `background/foreground.png` **只在 entry 里**,AppScope 里没有
|
||
// ⇒ 引用落空。
|
||
// ⇒ 直接改用与应用内左上角**同一个** `fb_logo`(图案几乎铺满)。
|
||
"icon": "$media:fb_logo",
|
||
"label": "$string:EntryAbility_label",
|
||
"startWindowIcon": "$media:startIcon",
|
||
"startWindowBackground": "$color:start_window_background",
|
||
"exported": true,
|
||
"orientation": "auto_rotation_restricted",
|
||
"skills": [
|
||
{
|
||
"entities": [
|
||
"entity.system.home"
|
||
],
|
||
"actions": [
|
||
"ohos.want.action.home"
|
||
]
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"extensionAbilities": [
|
||
{
|
||
"name": "EntryBackupAbility",
|
||
"srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
|
||
"type": "backup",
|
||
"exported": false,
|
||
"metadata": [
|
||
{
|
||
"name": "ohos.extension.backup",
|
||
"resource": "$profile:backup_config"
|
||
}
|
||
]
|
||
},
|
||
// 🔴 v66(用户 2026-10-20「做几个和 syncCalendar 差不多的卡片」):
|
||
// 桌面服务卡片。三种尺寸(2×2 / 2×4 / 4×4)都登记在 `form_config.json`,
|
||
// 这里只声明**提供方**(FormExtensionAbility)。
|
||
// ⚠️ `type` 必须是 `form`,`metadata` 的名字必须是 `ohos.extension.form`,
|
||
// 少一个桌面就把这个应用当成"没有卡片"。
|
||
{
|
||
"name": "FbFormAbility",
|
||
"srcEntry": "./ets/entryformability/FbFormAbility.ets",
|
||
"description": "$string:form_ability_desc",
|
||
"type": "form",
|
||
"exported": true,
|
||
"metadata": [
|
||
{
|
||
"name": "ohos.extension.form",
|
||
"resource": "$profile:form_config"
|
||
}
|
||
]
|
||
},
|
||
// 🔴 v83(用户 2026-10-23「要有定期同步的功能,家书app在后台也能自动同步」):
|
||
// 延迟任务扩展。由 `common/FbBackgroundSync.ets` 用 `workScheduler.startWork`
|
||
// 注册(周期 2 小时、`isPersisted` 重启自动恢复)。
|
||
// ⚠️ `name` 必须与 `FbBackgroundSync.ets` 里的 `WORK_ABILITY` **逐字相同**,
|
||
// 否则 `startWork` 不报错、但**永远不会有回调**(系统找不到这个扩展)。
|
||
// ⚠️ `type` 必须是 `workScheduler`;`exported: false` —— 它只由系统拉起,
|
||
// 不需要(也不应该)被别的应用调起。
|
||
{
|
||
"name": "FbSyncWorkAbility",
|
||
"srcEntry": "./ets/syncwork/FbSyncWorkAbility.ets",
|
||
"type": "workScheduler",
|
||
"exported": false
|
||
}
|
||
]
|
||
}
|
||
} |