微信授权诊断 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>
This commit is contained in:
joywayer
2026-06-23 07:36:57 +08:00
co-authored by Claude Opus 4.7
parent 624dd93c65
commit a060f29070
2 changed files with 15 additions and 0 deletions
@@ -21,13 +21,17 @@ public enum AccreditLoginHandler {
public static func register(on bridge: any BridgeProtocol) { public static func register(on bridge: any BridgeProtocol) {
bridge.register("accreditlogin") { _, callback in bridge.register("accreditlogin") { _, callback in
print("[Bridge] accreditlogin H5 调用命中 ✅")
callback?(.string("Response from accreditlogin")) callback?(.string("Response from accreditlogin"))
#if canImport(WechatOpenSDK) #if canImport(WechatOpenSDK)
print("[Bridge] accreditlogin → canImport(WechatOpenSDK)=true,启动 Task")
// SDK 7 callback sharelogin // SDK 7 callback sharelogin
Task { @MainActor in Task { @MainActor in
print("[Bridge] accreditlogin Task @MainActor 开始执行 WeChatAuth.authorize()")
do { do {
let user = try await WeChatAuth.authorize() let user = try await WeChatAuth.authorize()
print("[Bridge] accreditlogin 拿到 user,发 sharelogin 反向 callback")
bridge.call("sharelogin", data: .object([ bridge.call("sharelogin", data: .object([
// 1:1 contract §3.2 [10] / msext NewRootVC.m:2428 // 1:1 contract §3.2 [10] / msext NewRootVC.m:2428
"openid": .string(user.openid), "openid": .string(user.openid),
@@ -39,12 +43,16 @@ public enum AccreditLoginHandler {
"unionid": .string(user.unionid) "unionid": .string(user.unionid)
]), callback: nil) ]), callback: nil)
} catch WeChatAuthError.userCancelled { } catch WeChatAuthError.userCancelled {
print("[Bridge] accreditlogin 用户取消授权(errCode -2")
// msext alert sharelogin // msext alert sharelogin
} catch { } catch {
print("[Bridge] accreditlogin 失败:\(error)")
// msext H5 // msext H5
// Phase 9 Sentry breadcrumb // Phase 9 Sentry breadcrumb
} }
} }
#else
print("[Bridge] accreditlogin → ⚠️ canImport(WechatOpenSDK)=falseSDK 未链接,仅 stub")
#endif #endif
} }
} }
@@ -42,6 +42,9 @@ public final class WeChatManager: NSObject {
/// 1.x `WXApi.send(req)` deprecated vc/delegate H5 /// 1.x `WXApi.send(req)` deprecated vc/delegate H5
public func authorize() async throws -> WXAuthCodePayload { public func authorize() async throws -> WXAuthCodePayload {
#if canImport(WechatOpenSDK) #if canImport(WechatOpenSDK)
print("[WeChat] authorize() 开始")
print("[WeChat] - WXApi.isWXAppInstalled = \(WXApi.isWXAppInstalled())")
print("[WeChat] - WXApi.getVersion = \(WXApi.getVersion() ?? "nil")")
let state = UUID().uuidString let state = UUID().uuidString
return try await withCheckedThrowingContinuation { cont in return try await withCheckedThrowingContinuation { cont in
authPending[state] = cont authPending[state] = cont
@@ -50,11 +53,14 @@ public final class WeChatManager: NSObject {
req.state = state req.state = state
guard let vc = Self.topmostViewController() else { guard let vc = Self.topmostViewController() else {
print("[WeChat] ⚠️ topmostViewController() 返回 nil,无 present 上下文")
authPending.removeValue(forKey: state) authPending.removeValue(forKey: state)
cont.resume(throwing: WeChatError.authFailed(-3)) cont.resume(throwing: WeChatError.authFailed(-3))
return return
} }
print("[WeChat] 调 sendAuthReq vc=\(type(of: vc)) scope=\(Self.authScope) state=\(state)")
WXApi.sendAuthReq(req, viewController: vc, delegate: self) { [weak self] success in WXApi.sendAuthReq(req, viewController: vc, delegate: self) { [weak self] success in
print("[WeChat] sendAuthReq completion success=\(success)")
// success = SDK app fail // success = SDK app fail
// URL Scheme onResp // URL Scheme onResp
guard !success else { return } guard !success else { return }
@@ -67,6 +73,7 @@ public final class WeChatManager: NSObject {
} }
} }
#else #else
print("[WeChat] ⚠️ canImport(WechatOpenSDK)=false")
throw WeChatError.sdkNotLinked throw WeChatError.sdkNotLinked
#endif #endif
} }