fluwx 拉起小程序WXLog:Error:fail to load Keychain status:-25300, keyData null:1

背景

最近在 Flutter 项目中使用 fluwx 插件版本5.7.5 版本开发微信拉起小程序功能。在调试过程中发现一个奇怪的现象:Android 端可以正常拉起微信小程序,但 iOS 端却毫无反应

查看 iOS 控制台日志,核心报错如下:

vbnet 复制代码
WXLog:Error:fail to load Keychain status:-25300, keyData null:1

问题复现与日志分析

在排查过程中,我捕获到了详细的日志流。虽然前面的检查步骤显示 check passed,但在最后一步 Universal Link 校验时失败了,并尝试降级使用 Scheme 跳转。

关键错误日志:

csharp 复制代码
// Universal Link 校验通过的前几步
2025-11-20 10:07:59.773 ... 1, 1, check passed,
2025-11-20 10:07:59.775 ... 2, 1, check passed,
...

// 核心报错点 1:Universal Link 校验失败
2025-11-20 10:08:02.351 ... 5, 0, Universal Link check failed. The application is launched by WeChat via scheme...

// 核心报错点 2:Keychain 读取失败
2025-11-20 10:08:09.554 ... WXLog:Error:fail to load Keychain status:-25300, keyData null:1

排查过程

1. 官方文档与自查指引

首先,我根据日志中提示的 微信开放平台自查指引 进行了全面检查,发现好多微信开发者平台,帖子都有25300的问题,但是都是先提出问题,后面没有解决问题,这里吐槽一下。

2. 对比官方 Demo

下载了 fluwx 的官方 Demo 进行运行对比。发现官方 Demo 中的 registeropen 代码逻辑与我的项目中基本一致,但 Demo 能正常运行,我的项目却不行。

重点检查了 Universal Link 的相关配置,确认无误:

  • apple-app-site-association 文件已上传至服务器 .well-known 目录。
  • ✅ 文件内容格式正确(JSON 格式,包含正确的 TeamID 和 BundleID)。
  • ✅ Xcode 中 Associated Domains 已正确配置 applinks:yourdomain.com

最终解决方案

在排查了所有常规配置后,我发现必须在 iOS 原生层的 AppDelegate 中手动实现微信的代理回调方法,才能解决这个问题。

虽然 fluwx 源码内部似乎已经处理了这些逻辑,但在我的环境下(可能是版本兼容性或特定的插件冲突),显式地在原生层重写以下代码解决了问题。

修改 AppDelegate.m (或 AppDelegate.swift)

在 iOS 工程的 AppDelegate 中添加以下代码:

Objective-C

objectivec 复制代码
// 处理 URL Scheme 跳转 (旧版微信跳转方式)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
    // 必须调用 super,否则可能影响 Flutter 其他插件
    [super application:app openURL:url options:options];
    
    // 手动处理微信回调
    if ([WXApi handleOpenURL:url delegate:self]) {
        NSLog(@"[WeChat] 分享回调 url: %@", url);
    }
    return YES;
}

// 处理 Universal Link 跳转 (iOS 9+ 推荐方式)
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
    [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler];

    if ([WXApi handleOpenUniversalLink:userActivity delegate:self]) {
        NSLog(@"[WeChat] 分享回调 webpageURL: %@", userActivity.webpageURL);
    }
    return YES;
}

// 微信 SDK 回调处理
- (void)onReq:(BaseReq*)req {
    // 处理从微信启动 App 的逻辑,例如获取开放标签传递的 extinfo
    if ([req isKindOfClass:[LaunchFromWXReq class]]) {
        LaunchFromWXReq *wxreq = (LaunchFromWXReq *)req;
        WXMediaMessage *msg = wxreq.message;
        NSString *extinfo = msg.messageExt;
        
        NSLog(@"[WeChat] 分享回调 extinfo: %@", extinfo);
    }
    NSLog(@"[WeChat] onReq 回调收到");
}

// 如果需要处理响应结果,还需要实现 onResp
- (void)onResp:(BaseResp*)resp {
    NSLog(@"[WeChat] onResp 回调收到 code: %d", resp.errCode);
}

总结

虽然 fluwx 插件旨在让开发者免于编写原生代码,但在处理复杂的第三方 SDK 集成(特别是涉及 iOS 系统级跳转如 Universal Link)时,有时仍需要回归原生层进行"补丁"处理。

希望这篇记录能帮助遇到同样问题的开发者节省排查时间。

相关推荐
book多得40 分钟前
刷题专用微信小程序推荐
微信小程序·小程序
Sheffi2 小时前
iOS 内存管理深度解析:从原理到实践
ios
QuantumLeap丶2 小时前
《Flutter全栈开发实战指南:从零到高级》- 19 -手势识别
flutter·ios·前端框架
00后程序员张2 小时前
iOS 抓不到包怎么办?从 HTTPS 解密、QUIC 排查到 TCP 数据流分析的完整解决方案
android·tcp/ip·ios·小程序·https·uni-app·iphone
Haha_bj4 小时前
Swift UI数据存储
ios
技术与健康4 小时前
微信小程序云开发实践:共享环境与LLM整合经验
微信小程序·小程序
卢叁4 小时前
Flutter之阿里云视频播放器支持 iOS模拟器解决方案
flutter
鹏多多7 小时前
flutter睡眠与冥想数据可视化神器:sleep_stage_chart插件全解析
android·前端·flutter
Zender Han14 小时前
Flutter 新版 Google Sign-In 插件完整解析(含示例讲解)
android·flutter·ios·web