 lanterngamescnandClaude Opus 4.8
|
cb8e398bfb
|
feat(录音): 声明 MICROPHONE 权限 + reason_microphone 文案(Task8)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 17:29:53 +08:00 |
|
lanterngamescn
|
4c02ef0dc4
|
feat(录音): 容器接 Web触摸观察(方案A onTouch)+录音浮层+SHOW_RECORDING+计时/上滑取消/太短决策
- 补 import: AudioEvents, ShowRecordingRequest, RecordResult (from common) + RecordingOverlay
- 新增字段: recordOverlayVisible/recordState/recordResultEvent/touchDown/touchStartY/
recordingActive/wantCancel/recordSeconds/recordTimer
- subscribeEvents() 追加 SHOW_RECORDING → onShowRecording
- onShowRecording: 手指未按时立即 cancel 回投; 否则显浮层+启计时器
- onWebTouch(TouchEvent): Down记起点/Move判上滑(>100vp)/Up调 finishRecording
- finishRecording: <0.8s→tooShort延1.3s撤层; 上滑→cancel; 否则→send; 一次性清 resultEvent
- 大厅/子游戏 Web 各加 .onTouch((e)=>this.onWebTouch(e)) (方案A, 不消费触摸)
- Stack 顶层(ShareGuideDialog 之后)追加 RecordingOverlay({ state })
- aboutToDisappear 清 recordTimer
对应 §10 录音浮层设计; 手势观察接线
|
2026-06-27 17:27:00 +08:00 |
|
 lanterngamescnandClaude Sonnet 4.6
|
481afc803d
|
feat(录音): RecordingOverlay 录音浮层(波形/上滑取消/太短,触摸穿透)
新增 entry/src/main/ets/components/RecordingOverlay.ets:
- @Prop state: 'recording'|'cancel'|'tooShort' 三态展示
- recording 状态:7根波形柱 setInterval(120ms) 随机高度跳动动画
- cancel 状态:红底(#C0392B) + '✕'
- tooShort 状态:暗底 + '!'
- hitTestBehavior(HitTestMode.None) 触摸穿透到下方 Web,由容器 Web.onTouch 感知手势
- aboutToAppear/aboutToDisappear 正确管理 timer 生命周期
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-27 17:06:21 +08:00 |
|
 lanterngamescnandClaude Sonnet 4.6
|
0a9ba6c8be
|
feat(录音): 七牛 uploadToken 端侧生成(HMAC-SHA1,对齐原工程不走服务端) + 结构单测
新增 platform/src/main/ets/upload/QiniuToken.ets:
- QiniuToken.uploadToken() 异步生成 uploadToken(deadline=now+1h)
- HMAC-SHA1 via cryptoFramework.createMac('SHA1'),对齐原 Android 硬编码 AK/SK
- urlsafeBase64 工具方法(util.Base64Helper.encodeToStringSync + 替换+/-/_)
- eslint-disable-next-line @security/no-unsafe-mac 注释说明七牛协议强制要求
platform/Index.ets 导出 QiniuToken。
entry/src/test/QiniuToken.test.ets 结构单测(三段token格式/AK/scope验证)。
List.test.ets 注册 QiniuTokenTest。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-27 17:06:13 +08:00 |
|
lanterngamescn
|
f82ec89027
|
feat(share): 朋友圈分享(sharefriend=2)走文本分享但指引专门指向朋友圈
ShareGuideRequest 加 timeline 标记(sharefriend==2);指引框 timeline 时显示『分享到朋友圈步骤』
(打开微信→发现→朋友圈→长按相机发表文字→粘贴→发表),否则好友/群聊步骤。
|
2026-06-27 15:58:58 +08:00 |
|
lanterngamescn
|
0b6c5dfc54
|
feat(share): 文本分享指引框重做为分步引导卡片(参考截图),去掉系统分享
ShareGuideDialog: 居中卡片 标题{渠道}分享准备完成 + 内容已复制到剪贴板 + 微信/QQ/抖音三套分步指引
+ 两按钮(稍后分享/立即打开{渠道},渠道主题色)。文本不再提供系统分享(移除onGuideAction system分支+systemText)。
容器移除 contentKind 接线。
|
2026-06-27 15:52:05 +08:00 |
|
 lanterngamescnandClaude Sonnet 4.6
|
1902e4e5be
|
fix(share): 截图改用 componentSnapshot 抓Web组件渲染像素(修WebGL黑屏) + 剪贴板图片改fd写入
- BridgeGameContainer: 大厅Web加 .id('web_lobby'),子游戏Web加 .id('web_subgame'),
供 componentSnapshot.get 按组件id定位
- WebSlot: captureCanvas 整体替换为 componentSnapshot.get + image.ImagePacker.packToData,
规避 WebGL canvas.toDataURL 黑屏;packToData 为 packing 的非废弃替代(§API13+);
删除 parseJsString(仅被旧 captureCanvas 内联用,新实现不需要)
- ShareProvider: writeClipboardImage 改用 fileIo.openSync 取 fd 再
createImageSource(fd),修复传路径字符串可能失败问题;补 import fileIo
API签名核对(devecocli docs):
componentSnapshot.get(id, options) → Promise<PixelMap>(deprecated API18,仍可用)
ImagePacker.packToData(pixelMap, PackingOption) → Promise<ArrayBuffer>(API13+,WARN无error)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-27 15:31:56 +08:00 |
|
lanterngamescn
|
02d0ae0856
|
fix: 桌面显示名 EntryAbility_label 改为 进贤聚友棋牌(原为模板占位 label)
|
2026-06-27 14:39:10 +08:00 |
|
lanterngamescn
|
457ebf2f74
|
test(share): buildShareText 单测(单换行/空字段/无url,分享重构 §9)
|
2026-06-27 14:17:09 +08:00 |
|
 lanterngamescnandClaude Sonnet 4.6
|
b1055c79f6
|
feat(share): 容器接线 ShareGuideDialog(订阅 SHOW_GUIDE/渲染/返回键/一次性回投,分享重构 §7)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-27 14:15:23 +08:00 |
|
lanterngamescn
|
fffb353345
|
feat(share): 新增 ShareGuideDialog 指引弹窗(打开App/用系统分享/取消,分享重构 §7.2)
|
2026-06-27 14:12:21 +08:00 |
|
lanterngamescn
|
a03c61e188
|
feat(share): querySchemes 增加 mqqapi/snssdk1128 供指引窗拉起QQ/抖音(分享重构 §7.4)
|
2026-06-27 14:00:24 +08:00 |
|
lanterngamescn
|
f938e91dfd
|
修改为调试配置
|
2026-06-27 09:57:48 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
a104394076
|
修复 H5 音效完全不出声 + 子游戏音效路径错(srcIsloop)
真机诊断([SFX-DIAG])锁定两因:
1. AVPlayer.url 不接受 file:// 本地路径,报 `401 ... not fd:// or network
address`——所有本地音效播放失败,故"完全没声"。改用 fdSrc(openSync 取 fd),
远程语音(mediaTypeAudio)仍走 url(网络地址可直接用)。
2. 子游戏音效路径写死 local.gamestart(=gamehall),而 sangelaok 等子游戏音效在
各自目录(.../sangelaok/assets/wav/),找不到文件 → 子游戏更是无声。对齐 Android
webviewActivity(gamestart)/NewwebviewActivity(gamedirectory):按"本槽内容目录"
定位,经 CapabilityContext.gameContentDir 注入(大厅=gamestart、子游戏=其目录)。
并发模型重写(复刻 Android SoundPool 并发一次性 + MediaPlayer-per-src 循环):
- 原单 AVPlayer 每次 release 再建,互相打断、还杀正在循环的 BGM。
- 改为:循环 BGM 每 src 一个播放器(loopPlayers map);一次性音效各自独立瞬时
播放器(oneShots,播完自释),互不打断。isloop<0 停止该 src 循环。
- fd 生命周期:随播放器释放(release 后)关闭,防泄漏;mute(voicePlaying)作用于全部播放器。
链路改动:CapabilityContext 增 gameContentDir;WebSlot.setup 透传;
BridgeGameContainer setupLobby 传 gamestart、switchGame 记录子游戏目录供 setupSubgame 传入。
真机验证:大厅(dir=gamehall)与子游戏(dir=sangelaok)音效均 exists=true、无 401,
循环 BGM 与一次性音效正常播放。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 09:55:43 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
d335a589b6
|
修正 app_data.js 三处字段与 Android 不一致(H5 零改动)
§4.2 配置项接口逻辑审计发现 app_data.js 注入有三处偏离原 Android
inith5data(weclomeactivity1/NewwebviewActivity 两处实测一致):
1. app_version:Android 硬编码 `var app_version=1;`(数字常量,"初始化框架
加载方式"标志,非资源版本);原实现误用 res.localVersion()(如 "261" 且成
字符串)。改为固定数字字面量 1。契约文档 §6 此处亦误录为"version.xml 的
version",一并纠正。
2. app_gamename:Android 取 getAllFilename("gamestart")(即 'gamehall');原
实现误用 version.xml 的 <game name>(如"友乐游戏")。改为 config.gamestart。
3. app_getwifisignalLevel:Android 硬编码 `=1`(数字);原实现为字符串 '0'。
改为固定数字字面量 1。
buildValues 签名随之简化为 (config, launchtype),去掉不再需要的 version/
gameName 入参;大厅(StartupOrchestrator '0')、子游戏(BridgeGameContainer '1')
两调用点同步更新。buildJs 对 app_version/app_getwifisignalLevel 输出数字字面量
(无引号),其余字符串字段保持引号,逐字对齐 Android。
其余审计结论一致:11 个本地配置键读取一致(servertype/gameserver 契约标
"无代码读取"已正确省略);桥 handler getmarketname→market、getOther→other、
getothername→按名取配置(lookupConfig 全键 + 未知返回'')均与 Android getAllFilename
对齐。真机回归:大厅 V1.261 正常加载渲染。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 09:31:22 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
db206068c0
|
修复大厅启动页→H5"白闪+二次显示 splash":启动图覆盖层上移到根层
现象:大厅资源下载完成、splash 进度满后,进入 H5 前先闪一下白屏、又重新
显示一次 splash 背景图,才进 H5(真机 nova 14 复现)。
根因:原启动图视觉随 SplashPage 渲染,replacePathByName 切到
BridgeGameContainer 时,旧页销毁与新页 Web 首帧之间存在导航空隙(白闪);
而 BridgeGameContainer 自带的大厅 cover 又在切换后重新挂载,看起来像"第二次
splash"。两者皆因视觉绑定在会被切换/重建的页面上、与时序耦合。
修法(H5 零改动,纯原生):
- 启动图 + 金色进度条整体上移到 Index 根层 Stack 覆盖层,由 AppStorage
KEY_SPLASH_VISIBLE 控制,从 app 启动持续显示到大厅首帧上屏(onPageEnd)才撤。
- SplashPage 退化为纯启动逻辑载体(透明 NavDestination),仅把进度/文案/
阻断写入 AppStorage 供根层覆盖层呈现。
- BridgeGameContainer 移除自带大厅 cover,onPageEnd 置 splashVisible=false。
SplashPage→BridgeGameContainer 的页面切换由此发生在常驻覆盖层之下,时序无关,
彻底消除导航空隙白闪与二次 splash,大厅就绪即直接显示 H5。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 08:57:30 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
0425123465
|
消除 splash→大厅的白屏/黑屏闪烁
大厅 Web 首帧前用启动图(launch_image)盖住,保留到 onPageEnd(页面加载完、已稳定
上屏)再撤——不在 onFirstContentfulPaint 撤,避免首帧绘制到合成上屏间一帧黑屏。
另给容器 Stack 垫白底,使页面切换/Web 初始化的残留缝隙显白色(与启动页白底无缝),
而非刺眼黑屏。
真机验证:splash→覆盖层(品牌图)→大厅 全程白底基调,无黑屏/白屏突兀闪烁。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 02:40:10 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
de5b950d9b
|
实现子游戏按需下载,修复点子游戏白屏(§11.1 路径A)
根因:整包 gamehall.zip 顶层只含 gamehall,子游戏需按需单独下载;原 switchGame
直接 loadUrl 不存在的目录 → ArkWeb invalidFileUrl → 白屏。
对齐 Android NewwebviewActivity 的 updategamezip:
- ConfigManager.resolveGame(remote, gameid):以 gamedownloadurl 为 gameid 经
agent→game→channel→market 分层解析子游戏 game_zip/game_version(复用 VersionResolver)。
- ResourceManager.updateSubgame:下载→暂存解压→校验 <dir>/index.html→原子换入 urlpath/<dir>。
另加 subgameInstalled/subgameLocalVersion/subgameLocalGameId。
- BridgeGameContainer.switchGame 改 async + prepareSubgame:目录缺失先下载、已装比对远程
版本更高才更新;下载期复用启动页同款金色进度条;远程配置 10 分钟缓存(对齐 gameconfigtime)。
- SwitchGamePayload 增 gameId(gamedownloadurl)。
真机验证:点三个老K → 下载 sangelaok.zip(9.4M) → 解压加载,子游戏正常渲染
(V1.155 与配置 game_version=155 一致);日志不再 invalidFileUrl。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 02:33:55 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
a2758333cc
|
全屏沉浸:同时隐藏顶部状态栏与底部手势条
横屏游戏外壳下顶部状态栏与底部导航条都会遮挡/拦截 H5 内容点击。
setWindowSystemBarEnable 入参由 ['status'] 改为 [],两个系统栏均隐藏,
内容延伸至屏幕上下边缘。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 01:46:58 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
53fdd6d358
|
启动后隐藏底部系统手势条,避免遮挡/拦截 H5 底部点击
横屏游戏外壳下底部导航条(手势指示条)会压在 H5 内容上并拦截点击。
在 onWindowStageCreate 调用 setWindowSystemBarEnable(['status']):
保留顶部状态栏、隐藏底部导航条,隐藏后避让区更新,H5 内容自动延伸到屏幕底部。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 01:43:01 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
5cfb68209c
|
修复启动页横屏下进度条/提示文字与 logo 重叠
auto_rotation_landscape 横屏时屏幕高为短边,原 padding bottom 56vp 约占 17%,
配合 FlexAlign.End 把进度块顶进居中 logo 的英文行。改为底边距 24vp,
使进度条+提示文字以底部为基准、落在 logo 下方空白带(系统手势条由安全区避让)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 01:39:49 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
4b291396bc
|
清理排查过程的非必需改动:移除 onActive 保活与 H5 console 调试转发
定位 touch→mouse 时序为真因后,清理排查途中加入但最终非必需的代码:
- 移除 onActive/notifyShown(基于"ArkWeb 未激活态暂停动画"的误判;实测页面本就 active/visible,无需)。
含 WebSlot.notifyShown + setup 调用 + BridgeGameContainer NavDestination.onShown。
- 移除 onConsole H5 console→hilog 调试转发(三容器 + webConsoleOn 字段 + logWebConsole + 多余 AppEnv 引入)。
保留:touch→mouse shim(真正修复)、expandSafeArea(白边修复)、debug 版 setWebDebuggingAccess。
(合成保活、SYNC_RENDER 已于 0caf385 移除。)devecocli build 通过、真机正常启动。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 00:48:50 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
0caf3853af
|
修正:H5 按钮按下缩放真因是触摸→鼠标时序,改用 shim(移除上一版无用的合成保活)
真因(真机定位,更正 5d21cc7):引擎(gameabc)按下缩放绑 mousedown(缩小)/mouseup(还原)。
Android WebView 触摸合成的鼠标事件按真实按住时长跨开;ArkWeb 把合成的 mousedown/mouseup
**挤在抬手后 ~12ms 内** → 缩放一闪而过看不见(click 正常故功能无碍)。chrome://inspect 用真鼠标
时序正常,故"调试时正常、真机直接点不动"。
实测证伪上一版"合成保活"假设:无保活时注入的连续 canvas 动画照样逐帧上屏(5 帧 md5 全不同),
故 ArkWeb 不存在 canvas 合成节流问题,合成保活无必要、已移除(省去 60fps 持续合成的耗电)。
修法(H5 零改动,原生注入,onPageEnd,仅大厅/子游戏容器):preventDefault(touchstart) 抑制 ArkWeb
那套错时的原生合成鼠标事件,改由 pointer 事件按真实时序补发 mousedown/mousemove/mouseup/click
(仅 touch 指针),单次、时序正确、不重复触发,并支持拖动。真机验证:按下缩放正常、登录单次触发、
拖动正常。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 00:43:08 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
5d21cc7d65
|
修复 H5 canvas 动画"定格不上屏":注入合成保活(按钮按下缩放等恢复)
根因(真机定位):ArkWeb 默认 ASYNC 渲染下,H5 用 requestAnimationFrame 逐帧重绘 <canvas>
(JS 在跑、像素在变,rAF/时钟/引擎循环/CSS 经探针全部证实正常),但 ArkWeb 判定"组件内容未变"
不再产出新合成帧 → canvas 更新不上屏,表现为按钮按下缩放等 canvas 动画定格;连上 DevTools
会强制持续合成,故"调试时正常、真机直接点不动"。SYNC_RENDER 无效。
修法(H5 零改动,原生注入,符合铁律):onPageEnd 注入一个不可见(opacity .02/1px/pointer-events:none)、
独立合成层(will-change:transform)元素,每帧微动其 transform,强制 ArkWeb 持续产出合成帧,
把 canvas 一并刷上屏(等效 DevTools)。rAF 在页面不可见/后台自动暂停,仅前台活跃期有开销。
真机验证:注入后"无自带 nudge 的测试画布"纯靠该保活即可逐帧上屏(连拍 5 帧 md5 全不同)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-27 00:14:41 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
eccd0efb91
|
onConsole 仅 debug 生效,release 零日志开销
H5 console 转发开关固化为构造期 DEBUG 常量字段 webConsoleOn;release 下 onConsole 回调
仅一次字段读取即 return,不格式化、不写 hilog;setWebDebuggingAccess 本就仅 debug。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 22:15:40 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
5462643ce2
|
调试:onConsole 覆盖全部三个 Web 容器,全量转发 H5 console
大厅/子游戏(BridgeGameContainer)/通用网页(GenericWebContainer) 的 Web 均加 onConsole,
统一 tag=WebConsole,带角色(lobby/subgame/genericweb)+级别+来源文件行,debug 限定。
便于从 H5 console 排查问题(如动画/缩放)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 22:04:23 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
7179e95da1
|
调试:onConsole 转发 H5 console 到 hilog(debug 限定)
便于排查 H5 渲染/行为问题(如动画、缩放)。release 不转发以免噪声。
(移除临时诊断探针,保留 onConsole。)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 21:33:57 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
d16c7259b4
|
修复 H5 缩放等动画不播放:大厅 Web 首次显示补 onActive()
ArkWeb 文档:onInactive 态会暂停"可安全暂停的内容,例如动画"(CSS 动画/rAF),onActive 恢复。
本工程 controller.onActive() 原仅在从子游戏返回(activate)时调,**首次进大厅从未调用**,
大厅 Web 处于未激活态 → CSS transform/keyframes 动画与 requestAnimationFrame 被暂停,
表现为"画面在、但缩放等动画卡住不播放"。
修复:WebSlot 增 notifyShown()(调 controller.onActive(),幂等),在 setup() 激活槽建好即调,
并在 BridgeGameContainer 的 NavDestination.onShown 调用(首次进大厅 + 从通用网页返回均覆盖)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 21:19:33 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
81ba09b597
|
H5 全屏适配:Web 扩展系统安全区,消除底部白边
大厅/子游戏(BridgeGameContainer)与通用网页(GenericWebContainer)的 Web 组件加
.expandSafeArea([SYSTEM],[TOP,BOTTOM]),让 H5 铺满系统安全区(底部导航手势区),
消除底部白边,与原 Android 全屏 WebView 一致。模拟器验证:大厅满屏到底,无白边。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 20:56:51 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
f839c5b413
|
启动页:阶段提示文字移到进度条下方
SplashPage 覆盖层顺序调整为 进度条 → 阶段文案(原为文案 → 进度条)。模拟器验证通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 20:49:08 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
2702b619a7
|
启动改为:纯白启动窗 → 全屏 splash 启动图
- startWindowIcon 改为透明图 start_window_blank.png(108×108),系统启动窗仅剩白底 → 纯白屏
(顺带消除 startWindowIcon 超 144px 限制的构建警告)。
- SplashPage 恢复用全屏启动图 launch_image(ImageFit.Cover)+ navy 阶段文案 + 金色进度条。
- 删除不再引用的 startIcon.png。
时序:纯白启动窗 → 淡入全屏启动图(大 logo)+进度。系统窗无 logo,不存在两套资源比例不一致问题。
模拟器验证:首屏纯白,随后全屏启动图 + "准备游戏资源/正在下载更新NN%"。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 20:46:08 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
fbad796ab3
|
清理:删除已无人引用的 launch_image,闪屏资源统一为单一 startIcon
系统启动窗(startWindowIcon)与 SplashPage 现已统一引用同一个 $media:startIcon,
横图 launch_image 因系统启动窗无法铺全屏图而被淘汰、已无任何引用,删除以保证
"一套闪屏资源"单一来源,避免再次出现两套资源比例漂移。devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 20:33:57 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
4877e13f9a
|
闪屏一致性修复:SplashPage 复刻系统启动窗,消除两屏比例不一致
根因(代码层面):启动有两套不同资源/渲染的"闪屏":
- 系统启动窗(module.json5 startWindowIcon=$media:startIcon):1024×1024 方形(1:1),系统居中按图标尺寸渲染;
- ArkUI 闪屏(SplashPage):launch_image 2436×1125 横图(2.17:1),ImageFit.Cover 全屏铺满,logo 明显更大。
两套资源宽高比与 logo 占比都不同、渲染机制不同 → 同一 logo 两屏尺寸/比例不一致,切换跳变;
且系统启动窗图标尺寸系统固定、无法放大到全屏,只能让 ArkUI 闪屏向系统启动窗看齐。
修复:SplashPage 改为白底 + 居中显示**同一个 startIcon**(同资源/同宽高比/同位置),进度条置底。
两屏视觉一致,切换无跳变。(模拟器实测:系统启动窗在该机型渲染为纯白,序列为
白底→白底+logo淡入+进度,全程白底、logo 单次出现尺寸恒定。)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 20:30:38 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
ccf5a2acec
|
启动闪屏体验修复:品牌启动窗 + 阶段中文文案 + 白底可见的进度条
针对"首屏白底系统窗、闪屏文字不可见、缺阶段提示"修复:
- startWindowIcon(startIcon.png) 由 DevEco 默认蓝色图标换成与闪屏一致的品牌 logo
(白底+金色游戏手柄+快乐游戏健康生活),系统启动窗与 SplashPage 无缝衔接,消除白屏突兀感。
- SplashPage:
- 修复白色文字在白底闪屏上不可见的问题,改用品牌 navy 文字 + 金色进度条/加载圈。
- 各启动阶段展示中文文案:读取本地配置/检测网络权限/获取配置文件/检测升级版本/
准备游戏资源/正在下载更新NN%/即将进入大厅;下载阶段进度条实时推进。
模拟器验证:系统启动窗=白底金 logo;SplashPage 0.4s 显示"准备游戏资源35%",
下载期显示"正在下载更新69%"金色进度条。
注:网络/震动/传感器为 normal 级权限,安装即授予、无运行期弹窗(HarmonyOS 正常行为,非缺陷);
定位为 user_grant,按设计在 H5 首次调用定位能力时才弹窗,启动期不申请。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 18:07:35 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
799e78d8af
|
启动链路真实化:版本解析层对齐线上配置,复刻 Android chuliversion_1(H5 零改动)
对照原 Android 工程 + 线上实测配置,修正 4 处会破坏 H5 适配的根因:
1. 配置树层级改为真实的 agentlist→gamelist→channellist→marketlist
(原抄了废弃 Bean1 的 agent→channel→market→game)。
2. 资源下载字段名 game_download → 真实的 game_zip(原永远取空,资源升级永不触发)。
3. marketid/版本为数字,匹配/比较做 string↔number 归一(原 === "3" 永不命中 market 层)。
4. 大厅 app_config.gameid 为空时回退 version.xml 的 <game id>(复刻 versd.getGameid()),
否则大厅永远定位不到自己的 game_zip。
实现:
- RemoteConfig/VersionResolver 按真实格式重写,VersionResolver 复刻 chuliversion_1
的 game/channel/market 三层累积 + market 层 app 升级,"0"/空不覆盖。
- ConfigManager 拆分 fetchRemote(IO) / resolveWith(纯函数 + gameid 回退),移除失效的二级 url 编排。
- VersionXml 补解析 <game id>;ResourceManager 增 localGameId()。
- StartupOrchestrator 调整时序:内置资源(version.xml 种子)就绪→取 gameid→解析远程,拉取仍并行。
- 内置 gamehall_builtin.zip 改为真实版本种子(game id=G2hw... version=42),离线首启阻断、联网下载真实大厅。
- app_config.json gameconfig 切生产端点(去 _test),不再使用测试配置。
- VersionResolver 单测重写为真实格式 + 线上大厅样例。
注:远程配置格式属原生内部消费(H5 不可见),按铁律以线上服务器为准对齐。devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 17:43:20 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
4b671c7437
|
素材接入:分享面板图标 + 启动闪屏 + App 图标(从 docs/Res 拷入)
- 分享图标:shareWechat/QQ/Douyin@3x → entry media,SharePanel 颜色块占位替换为
真实图标 Image($r('app.media.share_*'))
- 启动闪屏:LaunchImage(2436x1125 横屏) → launch_image,SplashPage 改为全屏背景图
+ 底部叠加启动进度/公告(白字)
- App 图标:AppIcon 替换 AppScope/entry 的 layered_image foreground 前景层
docs/Res 为只读原始素材库,按需拷入;显示效果待真机/模拟器确认
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 12:24:42 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
5cbe5d4dd0
|
M3(T-M3-13): 分享面板对齐原工程——微信SDK + QQ/抖音系统分享
对齐 Android SharePanelHelper 流程:H5 friendsSharetypeUrlToptitleDescript →
原生弹自定义面板(微信/QQ/抖音) → 按所选平台分享。
- common ShareEvents:SHOW_PANEL + SharePanelRequest/Result;ShareProvider 经一次性
resultEvent 与 entry 容器一对一解耦(双槽实例隔离,避免广播串扰)
- ShareProvider 重构:微信走 SDK(type2 Canvas截图→WXImageObject / 其他→WXWebpageObject;
scene 好友/朋友圈;回传 sharesuccess);QQ/抖音走 @kit.ShareKit 系统分享(文本/图片/链接/视频,
不集成对应 SDK、不回传);截图失败统一降级
- 截图:CapabilityContext.captureCanvas(WebSlot 用 controller.runJavaScript 取 canvas
toDataURL,非激活/出错返回空);FileSystem.writeBytes 落盘;fileUri 给 WXImageObject/系统分享
- entry SharePanel 组件 + BridgeGameContainer 顶层叠加;重复面板/销毁均取消回投防 once 悬挂
真机验证项:微信开放平台注册后的真分享、系统分享面板拉起、canvas 截图
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 08:00:03 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
01e4c0e99e
|
M3 补全:移除 EchoSample 样板 + getcompareCode 接版本决策 + app_gamename
- 移除 EchoSampleProvider(组装根/导出/文件):M3 全部 Provider 已就位,
getTime 由 DeviceProvider 提供;样板回显仅 M1 测试页用,生产无依赖
- getcompareCode:启动期 StartupOrchestrator 把网络 App 版本(VersionDecision.appVersion)
存 KvStore(KV_KEY_NET_APP_VERSION),DeviceProvider 同步读出与本地 config.appversion 比较,
本地>网络→'1' 否则'0'(对齐 Android apputil.code 语义)
- app_gamename:VersionXml.parse 解析子 <game name>;ResourceManager.localGameName 暴露;
AppDataInjector.buildValues 接 gameName 参数;大厅/子游戏两处注入均填入
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 07:33:13 +08:00 |
|
 lanterngamescnandClaude Opus 4.8
|
b461b291f5
|
M5(T-M5-06): 可观测——BridgeTracer 全链路 traceId + ErrorCenter→APM sink
- Message 加非协议 traceId 字段(不进 toJson/toArray,对 H5 透明)
- BridgeController 在 OUTBOUND/INBOUND/HANDLER/RESPONSE/DISPATCH/RETURN/DROP
各阶段打点,一条桥消息往返可经 traceId 还原
- entry 新增 ErrorReporter.installErrorSink(),打通 ErrorCenter Report→APM/Crash
上报通道(结构化字段就位,接入真实 SDK 仅改 reportToApm)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 07:09:14 +08:00 |
|
lanterngamescn
|
9be1a23635
|
review: M5 双 Web 审查后的质量加固(两轮真机验证)
八角度审查双 Web 批次。修确凿问题:
铁律风险(最高)
- network_config:base-config cleartextTrafficPermitted 由 false 改 true。我之前的"白名单收紧"比平台默认更严,
会拦掉 H5 可能访问的任意第三方明文 http 与本地 127.0.0.1 上传 → 违反 H5 零改动。改回允许明文(对齐原 Android)
正确性
- 子游戏 controller 不再复用:每次进子游戏 new WebviewController()(存 slotS.controller),消除"复用同一 controller
时 onControllerAttached 不再触发致第二个子游戏建不出桥"的竞态。真机两轮验证 subB 桥正常 ✓
- BridgeController.dispose 置 active=false:显式抑制 dispose 后能力延迟异步 callHandler(不靠 adapter emitter-off 偶然安全)
- WebSlot.resumeLoaded 补发 setPostUrl:覆盖"非激活期渲染崩溃重载后 onFirstProgress 被闸门抑制丢失上传地址"。真机验证返回必带 setPostUrl ✓
- onRenderExited 不可见时延迟重载:非激活槽崩溃标记 needReload,激活时再 reload(官方建议可见后重载);activate 返回是否重载,resumeLoaded 据此避免重复推送
- 容器 aboutToDisappear:先退订 cancels 再 dispose 槽,关闭销毁期事件又建槽窗口
- LocationProvider:权限对话框 await 后加 disposed 守卫(防 onDestroy 后再注册监听泄漏+打已弃桥)
- AudioProvider:createAVPlayer.then 加 disposed 守卫(创建期已销毁则直接 release,防孤儿播放器泄漏)
- NetworkProvider.onForeground:重订阅后补播当前网络(覆盖非激活期网络变化,避免 H5 状态陈旧)
研判驳回:network_config 需 metadata 关联(官方文档证实 profile 路径自动识别);app 前后台只发 activeSlot(非激活大厅已收 appservice'2',正确)。
延期:WeChatApi 单例陈旧回调(随微信集成)。
devecocli build + scripts/test.sh 通过;模拟器两轮(大厅↔subA↔大厅↔subB↔大厅)无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 00:13:44 +08:00 |
|
lanterngamescn
|
c0addf8ec2
|
M5(T-M5-05): 安全加固清单(明文HTTP白名单 + 日志脱敏审计)
- 明文 HTTP 最小授权:新增 resources/base/profile/network_config.json(网络栈自动识别)——
base-config 默认禁明文,domain-config 仅放行 daoqi88.cn(含子域 tsgames/gameaudio)。附录B "明文域名显式放行"
- 日志脱敏审计:grep 确认无 code/token/openid/unionid/AppSecret/AK/SK 明文落日志(命中均为 resultCode/responseCode/stub)
- 已完成项复核:WebDebug 仅 debug(AppEnv.isDebug)、密钥下沉(微信code/七牛tokenProvider)、file 跨域最小授权(仅 filesDir/tsgames)
- 自定义 scheme(gamepaywelcome/gamepaywx…)随支付 M6 落地(现声明未处理 scheme 会致意外唤起,故延期)
WBS:M5 标记 T-M5-01/02/04/05 完成;余 T-M5-03 节流/06 可观测/07 冷启动/08 包体
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 23:57:16 +08:00 |
|
lanterngamescn
|
1aa1ccf9af
|
M5(T-M5-04): onRenderExited 渲染崩溃兜底
- WebSlot.onRenderExited(reason):渲染子进程异常退出(崩溃/被杀/OOM)时 controller.refresh() 重载恢复,
重置 firstDone 使重载后重推 appservice/setPostUrl;disposed 守卫避免子游戏销毁期误刷
- BridgeGameContainer:大厅 Web 与子游戏 Web 各挂 .onRenderExited → 对应 slot 恢复
- 防渲染子进程崩溃白屏(框架 §9 内存/崩溃兜底、附录 B 渲染兜底)
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 23:52:42 +08:00 |
|
lanterngamescn
|
9abd571f43
|
M5: 显式化导航拓扑约束(无子游戏→子游戏,须经大厅)
确认当前实现已符合用户拓扑:大厅常驻不销毁、子游戏临时销毁、仅 大厅↔子游戏、
子游戏换子游戏须 backgameData 回大厅再 SwitchOverGameData 进新子游戏。
- switchGame 守卫拆分:已在子游戏中(subgameUrl!='')时忽略 SwitchOverGameData 并告警日志
(此前静默忽略);注释说明拓扑约束与正确流程。无功能变更,仅可观测性。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 23:49:47 +08:00 |
|
lanterngamescn
|
d7148a72e6
|
M5(T-M5-01/02): 双 Web 大厅/子游戏架构 + WebSlot 激活协议(真机验证通过)
- 新增 entry/web/WebSlot:封装单 Web 的桥+能力+激活生命周期(setup/onLoadIntercept/onPageEnd/
onFirstProgress/activate/resumeLoaded/deactivate/onAppForeground/onAppBackground/dispose)
- BridgeGameContainer 重写为 Stack 双 Web:大厅常驻(始终在 Stack,subgame 时 Hidden+onInactive)、
子游戏临时(subgameUrl 非空时渲染,onControllerAttached 各自 setup);替换 M2/M4 单 WebView loadUrl
- 激活协议:进子游戏 deactivate(大厅 appservice'2'+forEachBackground+setActive(false)+onInactive)→
注入子游戏 app_data(LT'1')→建子游戏 slot→onFirstProgress(appservice'1'+setPostUrl);
返回 dispose 子游戏→大厅 resumeLoaded(appservice'1'+getWebdata)
- 每槽独立 BridgeController+buildCapabilities(结构隔离,接口不串);nav/前后台事件路由到 activeSlot
- 内置测试包升级:gamehall+subA 自动驱动页(大厅→SwitchOverGameData→子游戏→backgameData→大厅)
真机验证(Pura 90 全新装):LOBBY LT=0 appservice1→SwitchOverGameData→LOBBY appservice2→
SUB LT=1 appservice1+独立 getTime→backgameData→LOBBY appservice1+getWebdata=fromSub。
大厅无二次 ready=未重载=常驻保活 ✓;接口不串 ✓;只一个激活 ✓。无 registration failed/RenderExited。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 23:32:18 +08:00 |
|
lanterngamescn
|
a865ac766b
|
M5: BridgeController 激活闸门 setActive(双 Web 基础件)
- BridgeController 加 active 状态 + setActive/isActive:
- 非激活:onLoadIntercept 拦截 yy:// 但不分发(入站忽略)、dispatch 直接返回(出站抑制)
- 保证双 Web 下"同时只有一个 Web 执行桥接口",且去激活端不会收到 native 推送
- 去激活顺序约定:先 callHandler(appservice,'2')(彼时仍激活),再 setActive(false)
- 单测新增 inactive_gate_suppresses_outbound_and_inbound;scripts/test.sh 通过
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 23:25:49 +08:00 |
|
lanterngamescn
|
6bec98d584
|
review: M3+M4 成果审查后的质量加固
八角度审查 15 Provider+微信/七牛+双容器+导航。桥核心/契约骨架基本无误;修确凿问题:
正确性/健壮性
- ShakeProvider:stop()/onDestroy 取消未决 shakeEnd 计时并复位 pending(修停止后仍触发出站、重启后首摇被吞、计时器泄漏)
- VibrateProvider:startRepeat 先 stopRepeat(修重复 repeatvibrator('1') 叠加出无法取消的孤儿计时链)
- PhotoProvider:JSON.parse 后 Array.isArray 守卫(修 H5 传非数组致 .map 抛错、出站永不下发使 H5 挂死);去不可达 .catch
- GenericWebContainer:getWebdata 直调改用 JSON.stringify 生成 JS 字符串实参(修 data 含换行/行分隔符断行致注入语法错误)
- LocationProvider:单次请求前先停连续监听(修连续后切单次仍持续推送);去 push() 中 !continuousOn→stopContinuous 死代码
加固/清理
- BridgeGameContainer:抽 firstReadyPush() 幂等助手(appservice/setPostUrl/pendingWebdata);保持 100% 触发时序
(注明为何用 100% 而非更早 onPageEnd:确保 H5 已注册 handler);aboutToDisappear 置空 hostCtx/config/resource
研判驳回(与原 Android 一致/契约默认/自愈):getphonestate CallState 值映射、通用容器 orientation 默认横屏、setMuted prepared 自愈、exitDialog backgameData() 无参通知。
延期(随微信集成):WeChatApi 单例陈旧回调/instanceof(容器重建后回调打旧 bridge;微信运行期本就待开放平台注册)。
记录待重构:AbstractProvider 基类 + parseJson 助手(去 15 Provider 重复 bridge/ctx/解析样板)、AVPlayer 复用、openBrowser/orientation 抽公共。
devecocli build 通过;单测通过;模拟器复测桥往返/appservice/setPostUrl 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 21:30:06 +08:00 |
|
lanterngamescn
|
98854f7312
|
M4: 通用网页容器 + SettingsProxy + NavProvider + 子游戏切换
T-M4-01/02/03 GenericWebContainer(§11.3 第二套机制,不挂桥):
- javaScriptProxy 注入 settings 对象 6 方法(SettingsProxy,函数回调避开 ArkTS 对象字面量限制)
- 首次 100% runJavaScript 直调 getWebdata('<data>');返回键 isbackfinishweb→gamebackkeydown /
isexitdialogeshow→退出确认→backgameData();关闭 pop({data}) 101 语义回上层
- orientation "1"竖/其他横(window.setPreferredOrientation);browser 隐式 want
T-M3-06 NavProvider:OpenurlTitleData(开通用容器,onPop→callHandler getWebdata)、
SwitchOverGameData(同容器 loadUrl 切子游戏+重注入 app_data(launchtype'1')+方向+复位首屏标志)、
getGameinstall(同步 1/0 查 <解压根>/<dir>/index.html)、backgameData(重载大厅+待加载后 getWebdata)
导航解耦:common NavEvents(名+具名 payload interface);NavProvider 发 EventBus → BridgeGameContainer 执行
(容器持 pathStack/controller)。EventBus payload 放宽为 Object(ArkTS 禁 Record 字面量),用 GenericEventData
domain AppDataInjector.buildValues 复用(StartupOrchestrator + 子游戏切换共用,去重)
组装根装配 NavProvider
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 20:58:10 +08:00 |
|
lanterngamescn
|
4a8524bcbe
|
M3(批5): AudioProvider 播放 + 七牛上传器(@qiniu/upload)
依赖:ohpm i @qiniu/upload@1.0.2(platform)
platform QiniuUploader:UploadFile.fromPath + key + createMultipartUploadV2Task(context,file,{tokenProvider})。
🔴 token 走 tokenProvider(服务端用 AK/SK 生成 uploadToken(bucket)),AK/SK 不入端——纠正原 Android 硬编码 AK/SK
T-M3-10 AudioProvider(@kit.MediaKit AVPlayer):
- mediaTypeAudio:播放语音 url → gameui_play_voice/gameui_stop_voice(user 透传)
- srcIsloop:播放本地 wav(<gameDir>/assets/wav/<src>,isloop 0一次/>0循环/<0停止)
- voicePlaying:静音总开关 setVolume
- prepareaudio:录音分档(QiniuUploader 链路就绪;按住说话手势+麦克风+七牛服务端 token 三依赖未就绪前安全空实现)
bucket/域名/key 规则对齐原工程(bucket gameauio、回放 http://gameaudio.daoqi88.cn/<key>,由服务端 token 与 AudioProvider 接入时落地)
devecocli build 通过(CompileArkTS 编译七牛/音频无误)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 20:14:02 +08:00 |
|
lanterngamescn
|
9dc3e2ddf7
|
M3(批4): 图片/摇一摇/扫码/相机/定位 Provider
T-M3-07 PhotoProvider:getphoto 批量下载到资源根 photos/(file:// 白名单内) → 出站 getphoto[{pid,photourl}],复用 Downloader 并行
T-M3-08 ShakeProvider:startshake/SwitchShake/stopshake,@ohos.sensor 加速度合力阈值检测+节流,~1s 后出站 shakeEnd(空串),反馈震动
T-M3-11 ScanProvider:opensaoma → @kit.ScanKit 默认界面扫码(免权限) → 出站 getsaomaData(originalValue)
T-M3-12 CameraProvider:opencamera → @kit.CameraKit cameraPicker.pick(免权限) → 出站 getcameraaAddress(resultUri)
T-M3-09 LocationProvider:startlocation(连续/单次,用时申请权限)/getlocationinfo(同步) → geoLocationManager 定位+逆地理编码 →
出站 getlocationinfo(MaplocationInfo;错误码 0/-1未就绪/-2权限拒绝)
module.json5 增 ACCELEROMETER/LOCATION/APPROXIMATELY_LOCATION;组装根装配 5 者
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 19:59:04 +08:00 |
|
lanterngamescn
|
b1e3ce7433
|
M3(批3): 微信分享 + 登录(@tencent/wechat_open_sdk)
依赖:ohpm i @tencent/wechat_open_sdk@1.0.19(feature_capabilities)
T-M3-13 ShareProvider:friendsSharetypeUrlToptitleDescript → SendMessageToWXReq(scene 会话/朋友圈)
+ WXWebpageObject → 回传 sharesuccess{success(2成功/3取消),type(1好友/2朋友圈)}。
type 2截图/3图片/4视频暂回退网页分享(TODO);微信未安装回 cancel 不卡死
T-M3-14 LoginProvider:accreditlogin("1"=QQ空实现/其他=微信) → SendAuthReq(scope snsapi_userinfo) → 取 code。
🔴 AppSecret 不入端:code 换 profile 必须服务端,无端点时记录 code+TODO,不推不完整 sharelogin(红线)
WeChatApi 单例:createWXAPI(AppID wxd2bd650e06bdfe58 公开标识) + sendReq + handleWant 路由 onResp
EntryAbility.onCreate/onNewWant → WeChatApi.handleWant(接收微信回调)
module.json5:querySchemes ["weixin"](isWXAppInstalled)
运行期成功前提(已注释说明):微信开放平台注册本 HarmonyOS 应用(bundleName+指纹绑 AppID)、登录 profile 需服务端 code 换取端点。
devecocli build 通过(CompileArkTS 编译微信代码无误)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-25 19:43:11 +08:00 |
|