Skip to content

Commit a496a75

Browse files
authored
Merge pull request #82 from MetaMask/reconnection-handling
Re-connection handling and response decoding fix
2 parents f0e5748 + 68bcbf8 commit a496a75

File tree

6 files changed

+55
-31
lines changed

6 files changed

+55
-31
lines changed

Example/metamask-ios-sdk/SignView.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import metamask_ios_sdk
1010
struct SignView: View {
1111
@ObservedObject var ethereum: Ethereum = MetaMaskSDK.shared.ethereum
1212

13-
@State var message = "{\"domain\":{\"chainId\":1,\"name\":\"Ether Mail\",\"verifyingContract\":\"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC\",\"version\":\"1\"},\"message\":{\"contents\":\"Hello, Linda!\",\"from\":{\"name\":\"Aliko\",\"wallets\":[\"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\"0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF\"]},\"to\":[{\"name\":\"Linda\",\"wallets\":[\"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\"0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57\",\"0xB0B0b0b0b0b0B000000000000000000000000000\"]}]},\"primaryType\":\"Mail\",\"types\":{\"EIP712Domain\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\"}],\"Group\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"members\",\"type\":\"Person[]\"}],\"Mail\":[{\"name\":\"from\",\"type\":\"Person\"},{\"name\":\"to\",\"type\":\"Person[]\"},{\"name\":\"contents\",\"type\":\"string\"}],\"Person\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"wallets\",\"type\":\"address[]\"}]}}"
13+
@State var message = ""
1414

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

@@ -57,6 +57,16 @@ struct SignView: View {
5757
}
5858
}
5959
}
60+
.onAppear {
61+
updateMessage()
62+
}
63+
.onChange(of: ethereum.chainId) { _ in
64+
updateMessage()
65+
}
66+
}
67+
68+
func updateMessage() {
69+
message = "{\"domain\":{\"chainId\":\"\(ethereum.chainId)\",\"name\":\"Ether Mail\",\"verifyingContract\":\"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC\",\"version\":\"1\"},\"message\":{\"contents\":\"Hello, Linda!\",\"from\":{\"name\":\"Aliko\",\"wallets\":[\"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\"0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF\"]},\"to\":[{\"name\":\"Linda\",\"wallets\":[\"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\"0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57\",\"0xB0B0b0b0b0b0B000000000000000000000000000\"]}]},\"primaryType\":\"Mail\",\"types\":{\"EIP712Domain\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\"}],\"Group\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"members\",\"type\":\"Person[]\"}],\"Mail\":[{\"name\":\"from\",\"type\":\"Person\"},{\"name\":\"to\",\"type\":\"Person[]\"},{\"name\":\"contents\",\"type\":\"string\"}],\"Person\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"wallets\",\"type\":\"address[]\"}]}}"
6070
}
6171

6272
func signInput() {

Package.resolved

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ let package = Package(
1717
dependencies: [
1818
// Dependencies declare other packages that this package depends on.
1919
// .package(url: /* package url */, from: "1.0.0"),
20-
.package(url: "https://github.com/socketio/socket.io-client-swift", .upToNextMajor(from: "16.0.1"))
20+
.package(url: "https://github.com/socketio/socket.io-client-swift", .upToNextMajor(from: "16.1.0"))
2121
],
2222
targets: [
2323
// Targets are the basic building blocks of a package. A target can define a module or a test suite.

README.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ To add MetaMask iOS SDK as an SPM package to your project, in Xcode select: `Fil
2424
dependencies: [
2525
.package(
2626
url: "https://github.com/MetaMask/metamask-ios-sdk",
27-
from: "0.2.0"
27+
from: "0.2.1"
2828
)
2929
]
3030
```
@@ -196,8 +196,4 @@ To run the example project, clone this repository, change directory to `metamask
196196
You will need to have MetaMask Mobile wallet installed on your target i.e physical device or simulator, so you can either have it installed from the [App Store](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202), or clone and compile MetaMask Mobile wallet from [source](https://github.com/MetaMask/metamask-mobile) and build to your target device.
197197

198198
## Requirements
199-
### iOS
200-
This SDK has an iOS minimum version requirement of 14.0. You need your app to have an iOS minimum deployment of no less than 14.0. We have not tested the SDK on beta versions of iOS 17 yet, it is possible that compatibility issues may be experienced therefore we advise against running it on iOS 17 for best results.
201-
202-
### Xcode
203-
This SDK has been tested on up to version Xcode 14.3. Some compatibility issues may exist with beta versions of Xcode 15, therefore we advise against using Xcode 15 for best results.
199+
This SDK has an iOS minimum version requirement of 14.0. You need your app to have an iOS minimum deployment of no less than 14.0.

Sources/metamask-ios-sdk/Classes/Communication/SocketClient.swift

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,6 @@ class SocketClient: CommunicationClient {
9999
handleDisconnection()
100100
}
101101

102-
func resetClient() {
103-
isConnected = false
104-
self.keyExchange.reset()
105-
tearDownConnection?()
106-
}
107-
108102
func connect() {
109103
guard !channel.isConnected else { return }
110104

@@ -137,7 +131,6 @@ class SocketClient: CommunicationClient {
137131

138132
func clearSession() {
139133
store.deleteData(for: SESSION_KEY)
140-
resetClient()
141134
setupClient()
142135
}
143136

@@ -229,10 +222,8 @@ private extension SocketClient {
229222
let message = data.first as? [String: Any]
230223
else { return }
231224

232-
if
233-
let message = message["message"] as? [String: Any],
234-
message["type"] as? String == KeyExchangeType.start.rawValue {
235-
self.keyExchange.reset()
225+
if !self.isValidMessage(message: message) {
226+
return
236227
}
237228

238229
if !self.keyExchange.keysExchanged {
@@ -244,6 +235,35 @@ private extension SocketClient {
244235
}
245236
}
246237
}
238+
239+
func isValidMessage(message: [String: Any]) -> Bool {
240+
if
241+
let message = message["message"] as? [String: Any],
242+
let type = message["type"] as? String {
243+
if type == "ping" {
244+
return false
245+
}
246+
247+
if type.contains("key_handshake") {
248+
return true
249+
} else if !keyExchange.keysExchanged {
250+
return false
251+
}
252+
}
253+
254+
return true
255+
}
256+
257+
func isKeyExchangeMessage(_ message: [String: Any]) -> Bool {
258+
if
259+
let msg = message["message"] as? [String: Any],
260+
let type = msg["type"] as? String,
261+
type.contains("key_handshake") {
262+
return true
263+
}
264+
265+
return false
266+
}
247267

248268
// MARK: Socket disconnected event
249269

@@ -262,7 +282,6 @@ private extension SocketClient {
262282
)
263283

264284
if !self.connectionPaused {
265-
self.resetClient()
266285
self.connectionPaused = true
267286
}
268287
}
@@ -286,6 +305,11 @@ private extension SocketClient {
286305
}
287306

288307
func handleMessage(_ msg: [String: Any]) {
308+
if isKeyExchangeMessage(msg) {
309+
handleReceiveKeyExchange(msg)
310+
return
311+
}
312+
289313
guard let message = Message<String>.message(from: msg) else {
290314
Logging.error("Could not parse message \(msg)")
291315
return
@@ -376,8 +400,6 @@ extension SocketClient {
376400

377401
do {
378402
let encryptedMessage: String = try self.keyExchange.encryptMessage(message)
379-
// debug code
380-
let data = try! JSONEncoder().encode(message)
381403
let message: Message = .init(
382404
id: self.channelId,
383405
message: encryptedMessage
@@ -396,8 +418,6 @@ extension SocketClient {
396418

397419
do {
398420
let encryptedMessage: String = try self.keyExchange.encryptMessage(message)
399-
// debug code
400-
let data = try! JSONEncoder().encode(message)
401421
let message: Message = .init(
402422
id: self.channelId,
403423
message: encryptedMessage
@@ -411,7 +431,6 @@ extension SocketClient {
411431
} else {
412432
do {
413433
let encryptedMessage: String = try self.keyExchange.encryptMessage(message)
414-
let data = try! JSONEncoder().encode(message)
415434
let message: Message = .init(
416435
id: channelId,
417436
message: encryptedMessage
@@ -423,7 +442,6 @@ extension SocketClient {
423442
}
424443
}
425444
} else {
426-
let data = try! JSONEncoder().encode(message)
427445
let message = Message(
428446
id: channelId,
429447
message: message

metamask-ios-sdk.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'metamask-ios-sdk'
3-
s.version = '0.2.0'
3+
s.version = '0.2.1'
44
s.summary = 'Enable users to easily connect with their MetaMask Mobile wallet.'
55
s.swift_version = '5.0'
66

0 commit comments

Comments
 (0)