metamask-ios-sdk 0.8.2

metamask-ios-sdk 0.8.2

Mpendulo Ndlovu 维护。



 
依赖项
Starscream= 4.0.6
Socket.IO-Client-Swift~> 16.1.0
 

  • MetaMask

MetaMask iOS SDK

MetaMask iOS SDK 让开发者能够通过 MetaMask 移动钱包将他们的原生 iOS 应用连接到以太坊区块链,从而实现原生 iOS 分散式应用(DApps)的创建。

入门

您可以将 MetaMask iOS SDK 导入原生 iOS 应用,使用户能够轻松连接到他们的 MetaMask 移动钱包。请参阅 MetaMask API 参考,了解所有可用的以太坊 RPC 方法。

1. 安装

Cocoapods

要将MetaMask iOS SDK作为cocoapods依赖项添加到您的项目中,请在Podfile中添加以下条目

  pod 'metamask-ios-sdk'

然后运行

pod install

Swift Package Manager

通过Xcode菜单

要将MetaMask iOS SDK作为SPM包添加到您的项目中,在Xcode中选择: 文件 -> Swift Packages -> 添加包依赖。然后输入此存储库的url,例如 https://github.com/MetaMask/metamask-ios-sdk

通过包文件
    dependencies: [
        .package(
            url: "https://github.com/MetaMask/metamask-ios-sdk",
            from: "0.2.1"
        )
    ]

注意

请注意,SDK支持ios-arm64(iOS设备)和ios-arm64-simulator(M1芯片模拟器)。目前我们不支持ios-ax86_64-simulator(Intel芯片模拟器)。

2. 导入SDK

import metamask_ios_sdk

3. 连接您的Dapp

@ObservedObject var ethereum = MetaMaskSDK.shared.ethereum

// We log three events: connection request, connected, disconnected, otherwise no tracking. 
// This helps us to monitor any SDK connection issues. 
//  

let dapp = Dapp(name: "Dub Dapp", url: "https://dubdapp.com")

// This is the same as calling "eth_requestAccounts"
ethereum.connect(dapp)

我们记录三个SDK事件:connectionRequestconnecteddisconnected。否则不进行跟踪。这有助于我们监控任何SDK连接问题。如果您希望禁用此功能,可以通过将MetaMaskSDK.shared.enableDebug = falseethereum.enableDebug = false设置来实现。

4. 现在您可以调用任何以太坊提供者方法

我们使用Combine发布以太坊事件,因此您需要一个AnyCancellable存储。

@State private var cancellables: Set<AnyCancellable> = []

示例 1:获取链ID

@State var chainId: String?

let chainIdRequest = EthereumRequest(method: .ethChainId)

ethereum.request(chainIdRequest)?.sink(receiveCompletion: { completion in
    switch completion {
    case .failure(let error):
        print("\(error.localizedDescription)")
    default: break
    }
}, receiveValue: { result in
    self.chainId = result
})
.store(in: &cancellables)  

示例2:获取账户余额

@State var balance: String?

// Create parameters
let parameters: [String] = [
    ethereum.selectedAddress, // address to check for balance
    "latest" // "latest", "earliest" or "pending" (optional)
  ]
  
// Create request  
let getBalanceRequest = EthereumRequest(
    method: .ethGetBalance,
    params: parameters)

// Make request
ethereum.request(getBalanceRequest)?.sink(receiveCompletion: { completion in
    switch completion {
    case .failure(let error):
        print("\(error.localizedDescription)")
    default: break
    }
}, receiveValue: { result in
    self.balance = result
})
.store(in: &cancellables)  

示例3:发送交易

使用参数字典

如果您的请求参数是一个简单的字符串键值对的字典,您可以直接使用它。请注意,不支持使用 Any 或甚至 AnyHashable 类型,因为需要显式知道类型。

// Create parameters
let parameters: [String: String] = [
    "to": "0x...", // receiver address
    "from": ethereum.selectedAddress, // sender address
    "value": "0x..." // amount
  ]
    
// Create request
let transactionRequest = EthereumRequest(
    method: .ethSendTransaction,
    params: [parameters] // eth_sendTransaction rpc call expects an array parameters object
    )

// Make a transaction request
ethereum.request(transactionRequest)?.sink(receiveCompletion: { completion in
    switch completion {
    case .failure(let error):
        print("\(error.localizedDescription)")
    default: break
    }
}, receiveValue: { result in
    print(result)
})
.store(in: &cancellables)  
使用一个结构体

对于更复杂的参数表示,您可以定义并使用一个符合 CodableData 的结构体,即实现必要的要求

func socketRepresentation() -> NetworkData

以便该类型可以表示为数据包。

struct Transaction: CodableData {
    let to: String
    let from: String
    let value: String
    let data: String?

    init(to: String, from: String, value: String, data: String? = nil) {
        self.to = to
        self.from = from
        self.value = value
        self.data = data
    }

    func socketRepresentation() -> NetworkData {
        [
            "to": to,
            "from": from,
            "value": value,
            "data": data
        ]
    }
}

let transaction = Transaction(
    to: "0x...", // receiver address
    from: ethereum.selectedAddress, // sender address
    value: "0x..." // amount
)

let transactionRequest = EthereumRequest(
    method: .ethSendTransaction,
    params: [transaction] // eth_sendTransaction rpc call expects an array parameters object
    )

然后像上方所示的 示例3 那样发出请求

示例

我们创建了一个示例dapp,以指导如何连接到以太坊并发出请求。有三个示例

  1. ConnectView.swift - 通过MetaMask SDK连接到以太坊区块链。其他示例基于本示例中的成功连接

  2. TransactionView.swift - 发送交易

  3. SignView.swift - 对交易进行签名

  4. SwitchChainView.swift - 切换到不同的网络链(如果MetaMask钱包中尚不存在,需要先调用addEthereumChain rpc调用)。

要运行示例项目,克隆此存储库,更改目录到metamask-ios-sdk/Example,然后在示例目录中运行pod install以把SDK作为项目依赖项进行安装,接着打开metamask-ios-sdk.xcworkspace并运行项目。

您需要在目标设备上安装MetaMask移动钱包,即物理设备或模拟器,因此您可以选择从App Store安装它,或者从克隆编译MetaMask移动钱包,并构建到目标设备上。

要求

此SDK对iOS的最低版本要求为14.0。您需要您的应用的iOS最低部署版本不少于14.0。