Android WebView中WalletConnect Deeplink失效:需替换为wc://协议
Android WebView中WalletConnect深度链接崩溃问题
问题描述
在Android应用内嵌的WebView中,调用外部钱包(如WalletConnect的wc:3cc...格式深度链接)时无法正常工作,应用会因ERR_UNKNOWN_URL_SCHEME错误崩溃。
复现步骤
通过Telegram迷你应用(Android App内的WebView实例加载网页应用)可复现ConnectKit的问题:
- 按照快速入门指南创建演示网页应用;
- 托管该网页应用的HTTPS实例(可使用Next.js搭配Vercel);
- 在Telegram上创建迷你应用并填入网页应用的HTTPS地址;
- 启动迷你应用并点击“连接钱包”;
- 选择Metamask,此时应用崩溃。
预期行为
Android平台下应触发wc://3cc...格式链接而非wc:3cc...;网页端、iOS及桌面端的钱包连接不受影响,可正常运行。
环境信息
所有版本的Android WebView均存在此问题
解决方案
要解决这个问题,可通过WebView的链接拦截回调做协议适配:
- 拦截WebView的所有URL请求,判断是否为
wc:开头的WalletConnect链接; - 若符合规则,将链接中的
wc:替换为wc://; - 通过系统Intent唤起外部钱包应用处理修改后的链接;
- 返回标识告知WebView已自行处理该请求,避免触发未知协议错误。
示例代码(Kotlin):
webView.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { val url = request?.url?.toString() ?: return super.shouldOverrideUrlLoading(view, request) if (url.startsWith("wc:")) { val modifiedUrl = url.replaceFirst("wc:", "wc://") val intent = Intent(Intent.ACTION_VIEW, Uri.parse(modifiedUrl)) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) try { context.startActivity(intent) } catch (e: ActivityNotFoundException) { // 处理钱包未安装的场景,可提示用户下载对应钱包应用 } return true } return super.shouldOverrideUrlLoading(view, request) } }
也可在前端层面针对Android WebView做适配:通过环境检测判断当前运行在Android WebView中时,自动将WalletConnect链接的wc:替换为wc://。但这种方式依赖环境检测的准确性,原生WebView拦截处理的可靠性更高。
内容的提问来源于stack exchange,提问作者skhetcho
相关产品推荐
相关产品推荐

