【数据流改造(三分制)】 - 微信 AppID 唯一源 = Info.plist CFBundleURLTypes (URLName=weixin first scheme) - 应用级凭证 唯一源 = AppSecrets.plist (wxAppSecret/qiniuAccessKey/qiniuSecretKey) - 七牛运行参数 唯一源 = RemoteConfig 顶层 audio_domain / audio_bucket(远端动态注入) 【契约影响】 - ChannelConfig.plist:11 key → 10 key,移除 qiniudomain(ADR-007 守护规则同步) - BundleConfig:删除 qiniuDomain 属性 - RemoteConfig:顶层新增可选字段 audioDomain / audioBucket(JSON snake_case 自动归一化) - 启动期:WebContainerViewController parsed 分支校验 audio_domain/audio_bucket 非空, 缺失抛 BootError.audioConfigMissing 弹 modal 永停(与 showmessage 同等致命) - 上线前置:测试 / 生产远端 .txt 配置必须先补 audio_domain / audio_bucket 两个顶层 key - WeChatSDK.appID / WeChatAuth.appSecret / QiniuConfig.* 调用方零签名变化 【新增】 - ylgamehall/Resources/AppSecrets.plist(3 key) - ylgamehall/Source/Resource/AppSecrets.swift(单例加载,对齐 BundleConfig 模式) - QiniuConfig 改 actor:cdnDomain/bucketName 进 actor 状态 + update(...) async; accessKey/secretKey 仍 nonisolated(直接读 AppSecrets) - QiniuTokenSigner.uploadToken() 改 async(bucketName 来自 actor) - QiniuUploader 预取 cdnDomain 闭包外,SDK 同步 callback 内直接拼 URL 【删除】 - WeChatSDK.swift static let appID 硬编码 → Info.plist 启动期解析 - WeChatAuth.swift static let appSecret 硬编码 → AppSecrets.shared.wxAppSecret - QiniuConfig 中 accessKey / secretKey / bucketName / cdnDomain 四处硬编码 - ChannelConfig.plist 的 qiniudomain 字段(plist 与代码双源僵尸字段) 【文档同步】 - Plan:新增 ADR-009 + ADR-007 守护规则改 10 key + §236 BundleConfig 描述 - Design §3.4 多处 "11 项" → "10 项";§7.0.3 plist 示例 + BundleConfig 代码骨架 + Scripts/inject_channel.sh 同步 - SDK-Integration-Guide §0 凭证位置改三分制 + §尾"七牛域名读取"加新外壳路径 - Verification-Checklist L69 "(11 项)" → "(10 项)" 参考契约章节:docs/Development-Plan.md ADR-009、docs/H5-Native-Implementation-Design.md §7.0.3 BuildProject 通过,Xcode 即时诊断 0 警告。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
52 lines
2.0 KiB
Swift
52 lines
2.0 KiB
Swift
//
|
||
// WeChatSDK.swift
|
||
// ylgamehall
|
||
//
|
||
// 微信 OpenSDK 1.8.2 启动注册(与 daoqi msext 同款,避免 2.x 强制
|
||
// Universal Link 的运维负担:HTTPS 域名 + AASA + 微信开放平台后台审核)。
|
||
//
|
||
// 通过 Bridging Header 导入 ObjC 头(1.x .a 静态库无 Swift module),
|
||
// 详见 ylgamehall-Bridging-Header.h。
|
||
//
|
||
|
||
import Foundation
|
||
import UIKit
|
||
|
||
@MainActor
|
||
public enum WeChatSDK {
|
||
|
||
/// 微信 AppID — **唯一来源** 是 Info.plist 的 CFBundleURLTypes 中
|
||
/// URLName=`weixin` 节点下 CFBundleURLSchemes 的首个 scheme(这是 iOS
|
||
/// 系统级 URL Scheme 注册,运行期无法注入,必须在 Info.plist 静态声明)。
|
||
///
|
||
/// 多渠道分发若需更换 AppID,由 plutil 改 Info.plist 同步即可(同样需要
|
||
/// 在微信开放平台后台改后台配置),不需要再改 Swift 源码。
|
||
///
|
||
/// 配置缺失视为构建配置错误,启动期 preconditionFailure(fail-fast)。
|
||
public static let appID: String = {
|
||
guard let urlTypes = Bundle.main.infoDictionary?["CFBundleURLTypes"] as? [[String: Any]],
|
||
let weixinType = urlTypes.first(where: {
|
||
($0["CFBundleURLName"] as? String) == "weixin"
|
||
}),
|
||
let schemes = weixinType["CFBundleURLSchemes"] as? [String],
|
||
let appID = schemes.first, !appID.isEmpty
|
||
else {
|
||
preconditionFailure(
|
||
"Info.plist 缺少 weixin URL Scheme(CFBundleURLTypes 中 CFBundleURLName=weixin 的 CFBundleURLSchemes 首项即为微信 AppID)"
|
||
)
|
||
}
|
||
return appID
|
||
}()
|
||
|
||
/// 启动注册:在 AppDelegate.didFinishLaunchingWithOptions 调用一次。
|
||
/// 1.x 单参数 registerApp,不需要 Universal Link。
|
||
public static func register() {
|
||
WXApi.registerApp(appID)
|
||
}
|
||
|
||
/// SceneDelegate.openURLContexts 转发入口。
|
||
public static func handleOpenURL(_ url: URL) -> Bool {
|
||
WXApi.handleOpen(url, delegate: WeChatManager.shared)
|
||
}
|
||
}
|