关于Reown iOS SDK一键认证模式下获取签名钱包AppMetadata的技术咨询
Hey 👋,我刚好在集成Reown iOS SDK的时候踩过这个一键认证的坑,给你分享几个我亲测有效的方法:
首先得明确:一键认证(One-click auth)确实不会创建持久会话,所以AppKit.instance.getSessions()拿不到数据,authResponsePublisher里的session字段也会是nil,但这不代表我们拿不到钱包的AppMetadata,只是得换个路子找:
1. 从AuthResponse的peerMetadata字段直接提取
虽然session是nil,但AuthResponse对象本身会携带发起签名的钱包的peerMetadata信息——这其实就是你要的AppMetadata(包含钱包名称、图标这些)。你可以在订阅authResponsePublisher的时候,直接访问这个字段:
AppKit.instance.authResponsePublisher .sink { [weak self] result in guard case .success(let response) = result else { return } // 一键认证下这里的session是nil,但peerMetadata是存在的 let walletMetadata = response.peerMetadata print("签名钱包名称:\(walletMetadata.name)") } .store(in: &cancellables)
我测试Zerion的一键认证时,这个字段完全能拿到完整的钱包信息,你可以试试。
2. 提前监听钱包选择事件缓存Metadata
如果上面的方法在某些钱包里不生效,你可以在调用AppKit.present()之前,先订阅AppKit.instance.walletSelectionPublisher,这个publisher会在用户选中钱包的瞬间触发,返回选中钱包的完整AppMetadata,你可以把它缓存到本地变量里,等签名完成后直接使用:
// 先缓存选中的钱包Metadata var selectedWalletMetadata: AppMetadata? // 订阅钱包选择事件 AppKit.instance.walletSelectionPublisher .sink { metadata in selectedWalletMetadata = metadata print("用户选中了钱包:\(metadata.name)") } .store(in: &cancellables) // 再唤起认证流程 AppKit.present()
这个方法的优势是不管是一键还是两步认证,都能提前拿到钱包信息,完全不受会话是否存在的影响。
3. 兜底方案:通过签名地址反向匹配
如果前两个方法都没拿到想要的信息,还可以通过签名返回的地址,去Reown内置的钱包注册表中匹配对应的Metadata:
// 拿到签名后的地址 let signedAddress = response.accounts.first?.address // 从钱包注册表中查找对应的钱包 if let address = signedAddress, let wallet = WalletRegistry.shared.wallets.first(where: { $0.accounts.contains(where: { $0.address == address }) }) { let walletName = wallet.metadata.name }
不过这个方法的局限性是,有些钱包可能不会把所有关联地址都存在注册表中,所以优先级不如前两个。
另外,你之前在GitHub提了issue没回复的话,可以考虑再给issue加个评论顶一下,或者找找Reown的开发者社区问问同好,说不定有其他人碰到过一样的问题~
内容来源于stack exchange

