集成 WalletConnectSwiftV2 按照官方文档就可以(github.com/WalletConne… WalletConnect Inc 现已更名为 Reown。作为此次过渡的一部分,我们将弃用我们支持的平台上的大量存储库/软件包,并过渡到 Reown 组织下发布的等效版本。 此存储库现已被视为已弃用,并将于 2025 年 2 月 17 日终止使用。有关更多详细信息(包括迁移指南),请参阅:docs.reown.com/advanced/wa…),
WalletConnectSwiftV2(reown-swift)是用swift实现的,所有项目用swift会方便很多 git库 github.com/WalletConne…改为github.com/reown-com/r…
pod WalletConnectSwiftV2
但有些依赖库会缺少, 需要单独pod 如:
pod 'WalletConnectSwiftV2/Web3Wallet', '1.6.6' pod 'WalletConnectSwiftV2/WalletConnectRouter', '1.6.6' pod 'WalletConnectSwiftV2/WalletConnectIdentity', '1.6.6'
wallet使用
AppDelegate-- didFinishLaunchingWithOptions 中初始化 walletConfigurators()
private let app = Application()
var presenter:WalletPresenter?
private var configurators: [Configurator] {
return [
MigrationConfigurator(app: app),
ThirdPartyConfigurator(),
ApplicationConfigurator(app: app)
]
}
public func walletConfigurators(){
configurators.configure()
let interactor = WalletInteractor()
self.presenter = WalletPresenter(interactor: interactor, uri:app.uri)
}
WalletPresenter
init(
interactor: WalletInteractor,
uri: String?
) {
defer {
setupInitialState()
}
self.interactor = interactor
self.uri = uri
}
private func setupInitialState() {
interactor.requestPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] result in
//self?.router.present(request: result.request, context: result.context)
}
.store(in: &disposeBag)
//状态更新
interactor.sessionProposalPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] session in
self?.connectionStatusUpdated(proposal:session.proposal, context: session.context)
}
.store(in: &disposeBag)
//数据返回
interactor.sessionRequestPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] request, context in
self?.handle(request: request,context: context)
}.store(in: &disposeBag)
interactor.sessionsPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] sessions in
self?.sessions = sessions
}
.store(in: &disposeBag)
sessions = interactor.getSessions()
pairFromDapp()
}
扫码获取Dapp的URI
func onScanUri(uri:String) {
guard let uri = WalletConnectURI(string: uri) else {
self.errorMessage = Errors.invalidUri(uri: uri).localizedDescription
self.showError.toggle()
return
}
print("URI: \(uri)")
self.pair(uri: uri)
}
private func pair(uri: WalletConnectURI) {
Task(priority: .high) { [self] in
do {
try await self.interactor.pair(uri: uri)
} catch {
Task.detached { @MainActor in
self.errorMessage = error.localizedDescription
self.showError.toggle()
}
}
}
}
是否同意连接提示
func connectionStatusUpdated(proposal: Session.Proposal, context: VerifyContext?) {
let interactor = SessionProposalInteractor()
let presenter = SessionProposalPresenter(
interactor: interactor,
proposal: proposal,
context: context
)
DecentralizeWalletConnectManager.shared().showConnectPopViewType(.connectSuccess, dict: [:]) {[weak self] index,_ in
if index == 1{
Task(priority: .userInitiated) { try await
presenter.onApprove()
}
}else{
Task(priority: .userInitiated) { try await
presenter.onReject()
}
}
}
}
签名,交易授权
private func handle(request: Request,context:VerifyContext?) {
let interactor = SessionRequestInteractor()
let presenter = SessionRequestPresenter(interactor: interactor ,sessionRequest: request, context: context)
DispatchQueue.main.async { [unowned self] in
if request.method == "eth_sendTransaction" {
let arr:[Any] = request.params.value as? [Any] ?? []
DecentralizeWalletConnectManager.shared().showConnectPopViewType(.transaction,dict:arr[0] as! [AnyHashable : Any]) {[weak self] index, dic in
if index == 1{
let hashHex:String = dic["hashHex"] as! String
Task(priority: .userInitiated) { try await
presenter.onApprove(hashHex: hashHex)
}
}else{
Task(priority: .userInitiated) { try await
presenter.onReject()
}
}
}
}
else if request.method == "personal_sign"{
DecentralizeWalletConnectManager.shared().showConnectPopViewType(.auth, dict: ["message":presenter.message]) { [weak self] index,_ in
if index == 1 {
//self?.setURICode(code: self!.codeStr)
Task(priority: .userInitiated) { try await
presenter.onApprove(hashHex: "")
}
}else{
Task(priority: .userInitiated) { try await
presenter.onReject()
}
}
}
}
else if request.method == "eth_signTransaction"{
let arr:[Any] = request.params.value as? [Any] ?? []
DecentralizeWalletConnectManager.shared().showConnectPopViewType(.transaction, dict:arr[0] as! [AnyHashable : Any]) {[weak self] index, dic in
if index == 1{
let hashHex:String = dic["hashHex"] as! String
Task(priority: .userInitiated) { try await
presenter.onApprove(hashHex: hashHex)
}
}else{
Task(priority: .userInitiated) { try await
presenter.onReject()
}
}
}
}
else {
}
}
}