> hvigor BUILD SUCCESSFUL in 9 s 109 ms
33 tasks in total: 17 executed, 16 up-to-date
验签:verify-app success。
⚠️ 中途踩到一个真错并修正:StreetNumber 的字段是 streetName / streetNumber,
我第一版凭印象写成 street / number,编译直接报 Property 'street' does not exist on type 'StreetNumber'。
教训:字段名一律以 @hms.core.map.site.d.ts 声明文件为准,不靠记忆。
🔴 一个待真机确认的前提:MapKit 需要 AGC 开通
声明文件里 queryAutoComplete 明确会抛这两个错误码:
1002600003 App authentication failed
1002600004 The Map permission is not enabled
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
背景
网页端已实现「地址联想下拉带详细地址」(#32)。用户 2026-10-30 要求鸿蒙端同步。
现状(与网页端不同)
AMap.AutoComplete,JS API)所以"同步"实际是从无到有:端上要新建联想能力,服务端也要新建代理接口。
用户原话
已实现
服务端(commit
29b2ca0)Geo::tips($kw, $limit):调高德/v3/assistant/inputtips,把三套不齐的字段归一成
name / detail(省市区+门牌) / district / address / lng / latGET /api/v1/geo/tips?kw=&limit=:GET only、要求登录(花配额的接口)typecode15xx)status而不是 HTTP 码(配额用完高德回 200 + status=0)鸿蒙端(commit
f4f27ce)FbGeoRepo.ets:调上述接口FbAddrInput.ets:候选每行两行字 —— 地名 14px 深色 + 详细地址 12px 灰,同名地点靠第二行区分;防抖 260ms;
seq丢过期响应为什么走服务端代理:高德 Web 服务 key 是服务端密钥,打进安装包等于公开
(反编译/抓包即得,配额被跑光、key 可能被封)。网页端那套 JS API key + 安全密钥
是域名白名单机制,原生端没有等价物。
为什么是
@ComponentV2而非@Builder:@Builder值类型参数不参与状态观察(SDK
r/quick-rules/05-state.md),候选列表/展开态会"数据变了界面不重建"。本项目在
FbEventChip/FbTagChip/FbCalOptionRow上各踩过一次。🔴 当前阻塞:缺 Web 服务类型的高德 key
现有配置里的 key(
40d7ae…)是 JavaScript API 类型,调任何 Web 服务接口都返回:实测
v3/place/text、v5/place/text、v3/assistant/inputtips、v3/geocode/regeo全部同样失败。而 JS API 那条路(
webapi.amap.com/maps?key=…)是 200 正常的—— 所以网页端联想能用,但服务端调不了。
顺带发现(既存问题,与本单无关):
Geo::regeo()一直因此失效,Geo::cityFromPoint()实际在走第②③级离线兜底。这不影响现有功能,但属于隐藏缺陷,建议单开一张工单处理。
需要:去高德控制台同一个应用下「添加 Key」,服务平台选 Web服务(不是 Web端JS API),
把新 key 填进
config.php的amap.key。之后本单即可工作,无需改代码。验证情况
BUILD SUCCESSFUL,33 tasks(17 executed 非缓存)verify-app successhdc list targets=[Empty]),待重连后验证验收标准
为什么单独建单
这是鸿蒙端从无到有新建地址联想能力(新增 FbGeoRepo/FbAddrInput + 服务端 geo/tips 接口),涉及 ArkTS 代码与 PHP 新接口;#32 只改网页端一个 JS 文件的渲染方式,#31 是日程编辑权限,改的文件和验收方式完全不同。
⚠️ 更正:commit 里写的工单号是 #36,实际应为 #33
我在提交时凭记忆写了
laoyang/FamilyBook#36,但本单实际建出来是 #33。两个 commit 的 message 里都是错的编号:
FamilyBook29b2ca0laoyang/FamilyBook#36FamilyBook_harmonyosf4f27celaoyang/FamilyBook#36这两笔提交是干本单的,不是 #36(该号不存在)。 留此说明以便日后追查能对上。
按项目规则 commit 一旦推送就不改写历史(避免 force push 破坏他处引用),
所以用评论补正,而不是 amend + 强推。
顺带:本次工作的一个过程教训
写代码时我把改动落在了 Windows 侧的仓库副本,而编译在 WSL 里跑 ——
于是第一次
BUILD SUCCESSFUL是假的(编译的是旧代码:git status空 + 1.5 秒 + 19 个 up-to-date,三个信号同时出现才是破绽。真把改动同步到 WSL 后,立刻暴出 5 个真实错误:
arkts-no-untyped-obj-literals(FbGeoRepo.ets:50,52)——ArkTS 不接受无类型对象字面量,
const opts = {...}必须显式标FbApiOptionsModule 'Types' has no exported member 'isEventWritable'×2 ——更严重:我从 Windows 侧覆盖了 WSL 的
Types.ets,而 Windows 那份是旧版(#31 的改动只在 WSL 提交并推送过),把
isEventWritable冲掉了。用
git checkout HEAD -- <file>恢复后重新插入FbGeoTip才修好。⇒ 教训:改动必须直接写在 WSL,不要"先改 Windows 再同步";
跨环境复制单文件会静默覆盖掉另一侧独有的改动。
已按指示改用鸿蒙自带 Map Kit(不再走高德)
用户指示:「端侧不用高德,用鸿蒙自带的接口。」
commit:
7bc26dd73c84c1(移除已无用的高德代理接口)改成了什么
用
@kit.MapKit的site.queryAutoComplete()(花瓣地图地点自动补全)。formatAddress正好是用户要的那个「作为参考的详细地址」。缺失时(纯行政区划条目)用
locality + streetName + streetNumber兜底,再不行留空(端上整行不画,不留空灰线)。这个改动顺带解决了原方案两个问题
USERKEY_PLAT_NOMATCH (10009)—— 也就是说原方案在功能上根本跑不起来。现在端上不需要任何外部 key,也不需要我们自己的服务端接口与配额。
服务端清理
/api/v1/geo/tips与Geo::tips()/TIPS_URL一并删除(共 -192 行)。删前确认过:网页端
addr_suggest.js零引用(它走浏览器端 JS API),只在端上那版代码里用过。
验证:
/api/v1/geo/tips现返回 404;/api/v1/calendar/books仍 401(鉴权正常)。编译验证
验签:
verify-app success。⚠️ 中途踩到一个真错并修正:
StreetNumber的字段是streetName/streetNumber,我第一版凭印象写成
street/number,编译直接报Property 'street' does not exist on type 'StreetNumber'。教训:字段名一律以
@hms.core.map.site.d.ts声明文件为准,不靠记忆。🔴 一个待真机确认的前提:MapKit 需要 AGC 开通
声明文件里
queryAutoComplete明确会抛这两个错误码:这说明 MapKit 不是纯本地能力,需要:
issuer: app_gallery/app-feature: hos_normal_app,属 AGC 签发的标准调试证书,应用应该已在 AGC 里);
第 2 点我这边无法确认也无法操作(要登录 AGC 控制台)。
我已经把这两种情况都做了降级处理:认证失败/未开通 ⇒ 返回空候选 ⇒
输入框退化为普通文本框,手敲照常保存,不会崩、不会卡。但要真正看到下拉候选,
需要 Map Kit 服务已开通。
验证状态
verify-app successhdc list targets=[Empty])下一步
1002600003/1002600004;🔴 需要你在 AGC 做两步(2026-11-01 排查更新)
用户 2026-11-01:「33 这个工单不好使,输入信息时没有弹出任何联想。
当时我记得你说这个跟鸿蒙系统有关系,需要我申请什么东西才行,是吧?怎么操作?」
对,要申请。而且光开通服务还不够 —— 我这次查到还漏了一步代码配置,已经补上了。
一、我这边已改好的(不用你动)
entry/src/main/module.json5原来没有 Map Kit 需要的 metadata。官方文档要求:只在 AGC 打开地图服务开关、不配这里,照样报
1002600004 The Map permission is not enabled——官方错误码表里"可能原因"第 2 条就是「client_id 未配置」。
commit
9616881已经把这个结构加好了,value现在是占位REPLACE_WITH_AGC_CLIENT_ID,等你的 Client ID 填进去。已验证产物里确实带上了这段 metadata。
二、需要你做的两件事
① 在 AGC 开通「地图服务」
② 把「应用」的 Client ID 给我
数字-数字)拿到之后我替换掉占位值、重新编译装机验证。
三、顺便确认一下:签名已经是手动签名的调试证书 ✅
Map Kit 不支持自动签名。我查了当前工程的
build-profile.json5:是手动配置的调试证书,这一条已经满足,不用改。
四、还有一项要你确认:证书指纹
AGC →「项目设置」→「常规」→「应用」区域 → 找
SHA256 证书/公钥指纹 → 点「添加公钥指纹(HarmonyOS API 9 及以上)」,
选当前用的这张调试证书的指纹,确认。
⚠️ 如果那里已经有这张证书的指纹,就不用再加(我们之前装包成功过,
说明证书本身在 AGC 是登记的;但指纹这一项需要你顺眼看一眼)。
五、配置生效的坑(官方明确写了)
所以填好 Client ID 装包后如果仍没候选,别急着怀疑代码 ——
先把手机系统时间往后调一天再试(或者在应用管理里清掉家书的缓存)。
六、如果上面都做了还是没有
那就要看真机日志里的具体错误码了。请把手机连上电脑,我来抓:
100260000310026000041002600006/071002603001代码侧已经把这几类全部降级处理:任何失败都返回空候选,输入框退化成普通文本框,
手敲照常保存 —— 不会崩、不会卡。
当前的验证状态
7bc26dd)module.json5的 client_id metadata9616881),等你给值hdc list targets=[Empty])你完成 ①② 并把 Client ID 告我,我立刻接上并做真机验证。