fluwx icon indicating copy to clipboard operation
fluwx copied to clipboard

冷启动时候无法获取标签参数

Open taozhixiang opened this issue 2 months ago • 1 comments

fluwx.addSubscriber((response) { // 1. 为安卓和ios分开处理响应 if (response is WeChatShowMessageFromWXRequest) { debugPrint("launch-app-from-h5 on android"); // 从微信启动后,在这里只为 android 做一些事情 } else if (response is WeChatLaunchFromWXRequest) { debugPrint("launch-app-from-h5 on ios"); // 从微信启动后,在这里只为 ios 做一些事情 }

// 2. 或者为安卓和ios一起处理响应
if (response is WeChatLaunchFromWXRequest ||
    response is WeChatShowMessageFromWXRequest) {
  debugPrint("launch-app-from-h5");
  // 从微信启动后,在这里为 android 和 ios 做一些事情
}

}); 这个方法在冷启动的时候里面没有执行,怎么获取微信标签传递的参数呢?

taozhixiang avatar Oct 24 '25 12:10 taozhixiang

冷啟動時,微信是通過scheme打開的,如果監聽深度鏈接可以獲取到_wechat_sdk_biz_data,但這個數據沒辦法在dart解析。我在插件裡加這個方法來解析的

/// 解析 _wechat_sdk_biz_data,傳入原始字串(可能是 URL encoded)
/// 成功時回傳 NSDictionary(bplist 裡的所有 key),失敗回傳 nil
- (NSDictionary *)parseWechatBizDataFromString:(NSString *)raw {
    if (raw.length == 0) return nil;

    // 先 URL decode 一次(有些情況會被 encode)
    NSString *decoded = raw.stringByRemovingPercentEncoding ?: raw;

    // base64 padding,不是 4 的倍數就補 '='
    while (decoded.length % 4 != 0) {
        decoded = [decoded stringByAppendingString:@"="];
    }

    NSData *data = [[NSData alloc] initWithBase64EncodedString:decoded options:0];
    if (!data) {
        NSLog(@"[FluwxPlugin] base64 decode _wechat_sdk_biz_data 失敗");
        return nil;
    }

    NSError *error = nil;
    id plist = [NSPropertyListSerialization propertyListWithData:data
                                                         options:NSPropertyListImmutable
                                                          format:NULL
                                                           error:&error];
    if (error || ![plist isKindOfClass:[NSDictionary class]]) {
        NSLog(@"[FluwxPlugin] 解析 bplist 失敗: %@", error);
        return nil;
    }

    return (NSDictionary *)plist;
}

Chihiro-bit avatar Dec 05 '25 03:12 Chihiro-bit