H5 调 accreditlogin 仍无反应。加临时 print 排查链路: AccreditLoginHandler: - 入口"H5 调用命中 ✅" → 确认 WVJB 协议握手 + handler 注册 OK - canImport(WechatOpenSDK) 真值 → 确认 SDK 是否真链接进了 binary - Task @MainActor 入口 → 确认 actor hop 没卡死 - 失败分支区分用户取消(errCode -2)/ 其它 WeChatManager.authorize(): - isWXAppInstalled() → 用户手机是否真装了微信 - getVersion() → 加载的 SDK 版本字符串(验证链接的 framework) - topmostViewController() nil 检测 → present 上下文是否拿到 - sendAuthReq completion success=true/false → SDK 是否成功拉起微信 app 跑一次 H5 调 accreditlogin 看 Xcode console 输出序列,按 print 出现/缺失 精确定位卡点(H5 没调进来 / SDK 未链接 / VC 拿不到 / SDK 拉起失败)。 排查完成后可删除 print。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
60 lines
2.9 KiB
Swift
60 lines
2.9 KiB
Swift
//
|
||
// AccreditLoginHandler.swift
|
||
// ylgamehall
|
||
//
|
||
// H5 → Native handler:accreditlogin — 微信授权登录
|
||
// 契约:docs/H5-Native-Contract.md §3.1 [1] + §3.2 [10]sharelogin
|
||
//
|
||
// 完整链路(Phase 4.E):
|
||
// 1. WeChatAuth.authorize() → 拉起微信授权 + 客户端直拼 oauth2 + userinfo
|
||
// (msext NewRootVC.m:2415-2428 等价路径,沿用 AppID/AppSecret/scope)
|
||
// 2. bridge.call("sharelogin", data: 7 字段) 反向 callback
|
||
// 字段名严格 1:1 含历史包袱:`Province` 大写 P / `city` 经 danbian 去单引号
|
||
//
|
||
// ⚠️ canImport(WechatOpenSDK) 守卫:SDK 未链接前走 stub(与 Phase 4.A 一致),
|
||
// 仅响应 callback 不触发 sharelogin;项目方在 Xcode Embed & Sign 后真实路径激活。
|
||
//
|
||
|
||
import Foundation
|
||
|
||
public enum AccreditLoginHandler {
|
||
|
||
public static func register(on bridge: any BridgeProtocol) {
|
||
bridge.register("accreditlogin") { _, callback in
|
||
print("[Bridge] accreditlogin H5 调用命中 ✅")
|
||
callback?(.string("Response from accreditlogin"))
|
||
|
||
#if canImport(WechatOpenSDK)
|
||
print("[Bridge] accreditlogin → canImport(WechatOpenSDK)=true,启动 Task")
|
||
// SDK 已链接:拉起微信授权 → 拿 7 字段 → 反向 callback sharelogin
|
||
Task { @MainActor in
|
||
print("[Bridge] accreditlogin Task @MainActor 开始执行 WeChatAuth.authorize()")
|
||
do {
|
||
let user = try await WeChatAuth.authorize()
|
||
print("[Bridge] accreditlogin 拿到 user,发 sharelogin 反向 callback")
|
||
bridge.call("sharelogin", data: .object([
|
||
// 字段名严格 1:1 contract §3.2 表 [10] / msext NewRootVC.m:2428
|
||
"openid": .string(user.openid),
|
||
"headimgurl": .string(user.headimgurl),
|
||
"nickname": .string(user.nickname),
|
||
"sex": .number(Double(user.sex)),
|
||
"city": .string(user.city),
|
||
"Province": .string(user.Province), // ← 大写 P
|
||
"unionid": .string(user.unionid)
|
||
]), callback: nil)
|
||
} catch WeChatAuthError.userCancelled {
|
||
print("[Bridge] accreditlogin 用户取消授权(errCode -2)")
|
||
// msext 行为:用户取消不弹 alert、不触发 sharelogin
|
||
} catch {
|
||
print("[Bridge] accreditlogin 失败:\(error)")
|
||
// 其它失败也吞下(msext 同款乐观策略:不反向通知 H5)
|
||
// 后续 Phase 9 监控接入后此处可发 Sentry breadcrumb
|
||
}
|
||
}
|
||
#else
|
||
print("[Bridge] accreditlogin → ⚠️ canImport(WechatOpenSDK)=false,SDK 未链接,仅 stub")
|
||
#endif
|
||
}
|
||
}
|
||
}
|