背景
最近在 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 中的 register 和 open 代码逻辑与我的项目中基本一致,但 Demo 能正常运行,我的项目却不行。
3. 检查 Universal Link 配置
重点检查了 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)时,有时仍需要回归原生层进行"补丁"处理。
希望这篇记录能帮助遇到同样问题的开发者节省排查时间。