app_appversion 业务语义纠正:审核切换标志 0/1(非版本号)

调研 daoqi/msext NewRootVC.m:1190-1208 initJSdata 发现 app_appversion
真实业务语义是审核切换标志,**不是 App 的版本号**:

  if (远端 ResolvedVersion.appVersion >= 本地 BundleConfig.appVersion) {
      app_gameconfig = BundleConfig.gameConfig;  // 正常业务接口
      app_appversion = '0';                       // 标志:正常
  } else {  // 远端 < 本地(罕见,审核期 / IPA 已升远端未跟上)
      app_gameconfig = BundleConfig.appleConfig; // 苹果审核期接口
      app_appversion = '1';                       // 标志:审核期
  }

H5 端 if (app_appversion === '1') 切苹果审核期分支;99% 时间下都是 '0'
+ gameconfig。

当前代码两处错误:
   app_appversion 写成 "43"(版本号字符串)
   app_gameconfig 永远是 BundleConfig.gameConfig 硬编码

不符合契约(H5 拿到错误标志会走错分支)。按 CLAUDE.md 原则 A 第一准则
必须 1:1 等价 msext。

修复(Source/WebView/AppDataWriter.swift writeAppData):
  - 加 result 计算:localAppVer = Int(bc.appVersion), remoteAppVer =
    resolvedVersion?.appVersion ?? localAppVer;result = remoteAppVer >=
    localAppVer ? 0 : 1
  - 加 gameConfigStr 切换:result == 0 ? bc.gameConfig : bc.appleConfig
  - app_appversion 写字面 '\(result)' 单引号包裹(与 msext "var
    app_appversion='%d';" 等价)
  - Logger 输出加 result 说明 + local/remote 版本号便于调试

Contract §4.2:新增详细业务语义说明段(含 msext 原 ObjC 代码 + result
0/1 含义解读 + app_gameconfig 动态切换说明),修订记录加一行。

Design §7.5.1 表格:#2 app_gameconfig 数据源改为"动态切换",#6
app_appversion 数据源改为"审核切换标志"。

Plan §6.4 里程碑加一行。

BuildProject 通过

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-22 18:28:08 +08:00
co-authored by Claude Opus 4.7
parent 7c856d0d66
commit 0a313afe8e
4 changed files with 56 additions and 19 deletions
+15 -6
View File
@@ -93,19 +93,28 @@ public struct AppDataWriter {
gameStart = name
}
let appVersion = resolvedVersion?.appVersion.description ?? bc.appVersion
// app_appversion "App " msext NewRootVC.m:1190-1208
// ResolvedVersion.appVersion >= BundleConfig.appVersion
// result = 0app_gameconfig BundleConfig.gameConfig
// < / IPA
// result = 1app_gameconfig BundleConfig.appleConfig
// app_appversion '0' / '1' msext "var app_appversion='%d';"
let localAppVer = Int(bc.appVersion) ?? 0
let remoteAppVer = resolvedVersion?.appVersion ?? localAppVer
let result: Int = remoteAppVer >= localAppVer ? 0 : 1
let gameConfigStr: String = result == 0 ? bc.gameConfig : bc.appleConfig
// docs/H5-Native-Contract.md §4.2 + msext NewRootVC.m:1204
// - msext "var x='%@';"
// - app_version=1 / app_Launchtype=0 / app_getwifisignalLevel=1
// - app_appversion msext %d NSString msext
// - app_appversion msext "var app_appversion='%d';"H5 '0' / '1'
// - app_Launchtype L app_getwifisignalLevel wifi + signal/Level
//
// 5 gameconfig / market / agent / channel / Launchtype
// 便 H5 console JS var
// msext
let lines =
"var app_gameconfig='\(escape(bc.gameConfig))';" +
"var app_gameconfig='\(escape(gameConfigStr))';" +
"var app_market='\(escape(bc.market))';" +
"var app_agent='\(escape(bc.agent))';" +
"var app_channel='\(escape(bc.channel))';" +
@@ -113,7 +122,7 @@ public struct AppDataWriter {
"var app_version=1;" +
"var app_gamedir='\(escape(gameDir))';" +
"var app_gamestart='\(escape(gameStart))';" +
"var app_appversion='\(escape(appVersion))';" +
"var app_appversion='\(result)';" +
"var app_getwifisignalLevel=1;" +
"var app_gamename='\(escape(gameName))';" +
"var app_invitationcode='\(escape(bc.other))';"
@@ -123,7 +132,7 @@ public struct AppDataWriter {
Self.log.debug("""
[\(containerRole.description, privacy: .public)] write app_data.js → \(url.path, privacy: .public)
app_gameconfig = '\(bc.gameConfig, privacy: .public)'
app_gameconfig = '\(gameConfigStr, privacy: .public)' (result=\(result, privacy: .public))
app_market = '\(bc.market, privacy: .public)'
app_agent = '\(bc.agent, privacy: .public)'
app_channel = '\(bc.channel, privacy: .public)'
@@ -131,7 +140,7 @@ public struct AppDataWriter {
app_version = 1
app_gamedir = '\(gameDir, privacy: .public)'
app_gamestart = '\(gameStart, privacy: .public)'
app_appversion = '\(appVersion, privacy: .public)'
app_appversion = '\(result, privacy: .public)' [审核切换标志,非版本号;local=\(localAppVer, privacy: .public) remote=\(remoteAppVer, privacy: .public)]
app_getwifisignalLevel = 1
app_gamename = '\(gameName, privacy: .public)'
app_invitationcode = '\(bc.other, privacy: .public)'