Files
youle_app_ios_v2/ylgamehall/Source/Bridge/Handlers/AccreditLoginHandler.swift
T
joywayerandClaude Opus 4.7 a060f29070 微信授权诊断 print:定位 H5 调用 → 拉起微信卡在哪一步
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>
2026-06-23 07:36:57 +08:00

60 lines
2.9 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// AccreditLoginHandler.swift
// ylgamehall
//
// H5 → Native handleraccreditlogin — 微信授权登录
// 契约:docs/H5-Native-Contract.md §3.1 1 + §3.2 10sharelogin
//
// 完整链路(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)=falseSDK 未链接,仅 stub")
#endif
}
}
}