Use MetaMask SDK with iOS
Import MetaMask SDK into your native iOS dapp to enable your users to easily connect with their MetaMask Mobile wallet.
Prerequisites
-
MetaMask Mobile version 7.6.0 or later installed on your target device (that is, a physical device or emulator). You can install MetaMask Mobile from the App Store or clone and compile MetaMask Mobile from source and build to your target device.
-
iOS version 14 or later. The SDK supports
ios-arm64
(iOS devices) andios-arm64-simulator
(M1 chip simulators). It currently doesn't supportios-ax86_64-simulator
(Intel chip simulators).
Steps
1. Install the SDK
- CocoaPods
- Swift Package Manager
To add the SDK as a CocoaPods dependency to your project, add the following entry to our Podfile:
pod "metamask-ios-sdk"
Run the following command:
pod install
To add the SDK as a Swift Package Manager (SPM) package to your project, in Xcode, select
File > Swift Packages > Add Package Dependency.
Enter the URL of the MetaMask iOS SDK repository: https://github.com/MetaMask/metamask-ios-sdk
.
Alternatively, you can add the URL directly in your project's package file:
dependencies: [
.package(
url: "https://github.com/MetaMask/metamask-ios-sdk",
from: "0.3.0"
)
]
2. Import the SDK
Import the SDK by adding the following line to the top of your project file:
import metamask_ios_sdk
3. Connect your dapp
Connect your dapp to MetaMask by adding the following code to your project file:
let appMetadata = AppMetadata(name: "Dub Dapp", url: "https://dubdapp.com")
@ObservedObject var metamaskSDK = MetaMaskSDK.shared(appMetadata)
metamaskSDK.connect()
By default, MetaMask logs three SDK events: connectionRequest
, connected
, and disconnected
.
This allows MetaMask to monitor any SDK connection issues.
To disable this, set MetaMaskSDK.shared.enableDebug = false
or ethereum.enableDebug = false
.
4. Call methods
You can now call any JSON-RPC API method using metamaskSDK.request()
.
Example: Get chain ID
The following example gets the user's chain ID by calling
eth_chainId
.
let chainIdRequest = EthereumRequest(method: .ethChainId)
let chainId = await metamaskSDK.request(chainIdRequest)
Example: Get account balance
The following example gets the user's account balance by calling
eth_getBalance
.
// Create parameters.
let account = metamaskSDK.account
let parameters: [String] = [
// Account to check for balance.
account,
// "latest", "earliest", or "pending" (optional)
"latest"
]
// Create request.
let getBalanceRequest = EthereumRequest(
method: .ethGetBalance,
params: parameters
)
// Make request.
let accountBalance = await metamaskSDK.request(getBalanceRequest)
Example: Send transaction
The following example sends a transaction by calling
eth_sendTransaction
.
- Use a dictionary
- Use a struct
If your request parameters make up a simple dictionary of string key-value pairs, you can use the
dictionary directly.
Note that Any
or even AnyHashable
types aren't supported, since the type must be explicitly known.
// Create parameters.
let account = metamaskSDK.account
let parameters: [String: String] = [
// Receiver address.
"to": "0x...",
// Sender address.
"from": account,
// Amount to send.
"value": "0x..."
]
// Create request.
let transactionRequest = EthereumRequest(
method: .ethSendTransaction,
// eth_sendTransaction expects an array parameters object.
params: [parameters]
)
// Make a transaction request.
let transactionResult = await metamaskSDK.request(transactionRequest)
For more complex parameter representations, define and use a struct that conforms to CodableData
,
that is, a struct that implements the following requirement:
func socketRepresentation() -> NetworkData
The type can then be represented as a socket packet.
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
]
}
}
// Create parameters.
let account = metamaskSDK.account
let transaction = Transaction(
// Receiver address.
to: "0x...",
// Sender address.
from: account,
// Amount.
value: "0x..."
)
// Create request.
let transactionRequest = EthereumRequest(
method: .ethSendTransaction,
// eth_sendTransaction expects an array parameters object.
params: [transaction]
)
// Make a transaction request.
let result = await metamaskSDK.request(transactionRequest)
Example
See the example iOS dapp in the iOS SDK GitHub repository for more information.