Skip to content

Commit c4c5a7f

Browse files
committed
add backward compatibility support
iOS 15, macOS 12 use the new data(for: older version fall back on a older implementation
1 parent f42f197 commit c4c5a7f

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ let excludeFiles: String = []
1414
let package = Package(
1515
name: "Web3swift",
1616
platforms: [
17-
.macOS(.v12), .iOS(.v15)
17+
.macOS(.v10_15), .iOS(.v13)
1818
],
1919
products: [
2020
.library(name: "web3swift", targets: ["web3swift"])

Sources/web3swift/Web3/Web3+HttpProvider.swift

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ public class Web3HttpProvider: Web3Provider {
5757
attachedKeystoreManager = manager
5858
}
5959

60+
fileprivate static func dataFrom(session: URLSession, request urlRequest: URLRequest) async throws -> Data{
61+
if #available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *) {
62+
let (data, _) = try await session.data(for: urlRequest)
63+
return data
64+
} else {
65+
let (data, _) = try await session.data(forRequest: urlRequest)
66+
// Fallback on earlier versions
67+
return data
68+
}
69+
}
70+
6071
static func post<T: Decodable, U: Encodable>(_ request: U, providerURL: URL, session: URLSession) async throws -> T {
6172

6273
let requestData = try JSONEncoder().encode(request)
@@ -66,7 +77,7 @@ public class Web3HttpProvider: Web3Provider {
6677
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")
6778
urlRequest.httpBody = requestData
6879

69-
let (data, _) = try await session.data(for: urlRequest)
80+
let data = try await dataFrom(session: session, request: urlRequest)
7081

7182
let parsedResponse = try JSONDecoder().decode(T.self, from: data)
7283

@@ -89,3 +100,38 @@ public class Web3HttpProvider: Web3Provider {
89100
return try await Web3HttpProvider.post(requests, providerURL: self.url, session: self.session)
90101
}
91102
}
103+
104+
@available(iOS, deprecated: 15.0, message: "Use the built-in API instead")
105+
extension URLSession {
106+
func data(fromUrl url: URL) async throws -> (Data, URLResponse) {
107+
try await withCheckedThrowingContinuation { continuation in
108+
let task = self.dataTask(with: url) { data, response, error in
109+
guard let data = data, let response = response else {
110+
let error = error ?? URLError(.badServerResponse)
111+
return continuation.resume(throwing: error)
112+
}
113+
114+
continuation.resume(returning: (data, response))
115+
}
116+
117+
task.resume()
118+
}
119+
}
120+
121+
func data(forRequest request: URLRequest) async throws -> (Data, URLResponse) {
122+
var dataTask: URLSessionDataTask?
123+
124+
return try await withCheckedThrowingContinuation { continuation in
125+
dataTask = self.dataTask(with: request) { data, response, error in
126+
guard let data = data, let response = response else {
127+
let error = error ?? URLError(.badServerResponse)
128+
return continuation.resume(throwing: error)
129+
}
130+
131+
continuation.resume(returning: (data, response))
132+
}
133+
134+
dataTask?.resume()
135+
}
136+
}
137+
}

0 commit comments

Comments
 (0)