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)时,有时仍需要回归原生层进行"补丁"处理。

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

相关推荐
小a杰.9 小时前
Flutter 与 AI 深度集成指南:从基础实现到高级应用
人工智能·flutter
sweet丶12 小时前
UIWindowScene 使用指南:掌握 iOS 多窗口架构
ios
汝生淮南吾在北15 小时前
SpringBoot3+Vue3小区物业报修系统+微信小程序
微信小程序·小程序·vue·毕业设计·springboot·课程设计·毕设
静待雨落15 小时前
如何在Taro项目中使用axios
微信小程序·taro
程序员老刘15 小时前
跨平台开发地图:客户端技术选型指南 | 2025年12月
flutter·客户端
一名普通的程序员16 小时前
使用 Flutter Pay 插件实现 Apple Pay 和 Google Pay 的完整指南
flutter
前端小黑屋16 小时前
小程序直播挂件Pendant问题
前端·微信小程序·直播
汤姆yu16 小时前
基于微信小程序的自习室座位预约系统
微信小程序·小程序
崽崽长肉肉17 小时前
swift中的知识总结(一)
ios·swift
麦客奥德彪17 小时前
Flutter riverpod 对应Android开发概念理解
flutter