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

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

相关推荐
恋猫de小郭1 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
一只大侠的侠5 小时前
Flutter开源鸿蒙跨平台训练营 Day 10特惠推荐数据的获取与渲染
flutter·开源·harmonyos
未来侦察班9 小时前
一晃13年过去了,苹果的Airdrop依然很坚挺。
macos·ios·苹果vision pro
renke33649 小时前
Flutter for OpenHarmony:色彩捕手——基于HSL色轮与感知色差的交互式色觉训练系统
flutter
子春一11 小时前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
铅笔侠_小龙虾12 小时前
Flutter 实战: 计算器
开发语言·javascript·flutter
微祎_13 小时前
Flutter for OpenHarmony:构建一个 Flutter 重力弹球游戏,2D 物理引擎、手势交互与关卡设计的工程实现
flutter·游戏·交互
一起养小猫14 小时前
Flutter for OpenHarmony 实战_魔方应用UI设计与交互优化
flutter·ui·交互·harmonyos
hudawei99614 小时前
flutter和Android动画的对比
android·flutter·动画
一只大侠的侠14 小时前
Flutter开源鸿蒙跨平台训练营 Day7Flutter+ArkTS双方案实现轮播图+搜索框+导航组件
flutter·开源·harmonyos