这个一个困扰了我这边许久的一个问题,在社区也没有人去解答这个问题。 下面说一下这个问题出现的情形和我的结局方案。
问题描述
- 首先不论在使用 WalletConnectSwiftV2 或者是 WalletConnectSwiftV1 ,我们需要在向中继层发完消息后都需要自动去跳转
Wallet App
,然后Wallet App
在前台状态处理完Dapp
的消息后就会主动跳回到Dapp
- 跳转
Wallet App
方式一般是通过 DeepLink 或者是 Universal Link - 跳回是
Wallet App
控制的 - 建立连接 的跳转时需要携带 WCUrl 参数,例如是 使用DeepLink 与 MetaMask 建立连接时会用类似下面的链接,metamask://wc?uri=wc%3Aff2f0fc993764a90f3ac47028d344cdd5dedb8257c680%402%3Frelay-protocol%3Dirn%26symKey%3Dbdb0d378c9727a1a8d50099fc1bd3e7dcd
- 在v1 我们向钱包发送Sign请求后,可以通过不携带参数的 DeepLink 或者是 Universal Link 跳转到MetaMask ,例如这样:metamask://, 然后在MetaMask 确定交易后会自动跳回Dapp。
- 在v2 我们同样的跳转行为,MetaMask 只会跳回一次。然而其他 WalletApp 没有同样的问题。
解决方案
- 我发现在iOS浏览器使用Web端的 WalletConnectModal 在v2下跳转到MetaMask是没有这个问题
- 因为跳转方法在iOS都是使用 DeepLink 或者是 Universal Link是没区别的,所以我通过在App中使用 WebView 加载 Web端 WalletConnectSDK,然后在WebView 的加载URL 的 Delegate 中发现了其中的一些不同,Web端 WalletConnectSDK在调用完Sign请求向MetaMask发起跳转行为时,使用的链接是类似这样的:metamask://wc?requestId=undefined&sessionTopic=0f0a8661f4636ee5f060358dbf74e6db69a91f299fa4
- 可以看到使用的是DeepLink 模式的跳转,但是携带了关键的 sessionTopic 参数,这个参数是啥,相信使用过WalletConnectSwiftV2都很清楚,就不多解释。后面我通过带上sessionTopic这个参数也解决了这个问题。
- 其中还有requestId这个参数,但是看到是undefined的,所以说明这个参数暂时不重要,可传可不传。
总结
- WalletConnectSwiftV2的SDK 落后Web版本太多了,实际上Web端WalletConnectModal 把上面说的细节都处理,但是WalletConnectSwiftV2现在还是未提供类似WalletConnectModal这样的实现,所以需要开发者自行处理很多细节,例如上面的跳转
WalletApp
,还有 chainId 、account 的切换等等 - 如果发现有Web端SDK能实现,WalletConnectSwiftV2 未提供的实现,不妨研究下Wed端SDK的源码。因为在WalletConnect 这方面 Web端的用户会更多,所以Web端SDK也是对开发者最友好的,最方便的。