Post

Replies

Boosts

Views

Activity

Reply to Force Mobile Data usage on some API calls and other to be through wifi or the available network
@eskimo If the user is connected over wifi and we are consuming the cellular data of the user using NWConnection, could it create an issue for the developer in terms of app store guidelines or the app getting rejected, etc? Do we need to inform the user that we will consume the mobile data irrespective of wifi connection status as part of any TnC?
Topic: App & System Services SubTopic: General Tags:
Nov ’23
Reply to Force Mobile Data usage on some API calls and other to be through wifi or the available network
Try this out: import Foundation import Network class CellularRequest { static func execute(url: URL, httpMethod: String, postBody: String? = nil, completion: @escaping (_ error: NWError?, _ httpBody: String?, _ httpHeaders: String?) -> Void) { guard let urlHost = url.host else { return } let host = NWEndpoint.Host(urlHost) let tlsOptions = NWProtocolTLS.Options() let tcpOptions = NWProtocolTCP.Options() let parameters = NWParameters(tls: tlsOptions, tcp: tcpOptions) parameters.prohibitExpensivePaths = false #if targetEnvironment(simulator) parameters.requiredInterfaceType = .loopback #else parameters.requiredInterfaceType = .cellular #endif let connection = NWConnection(host: host, port: .https, using: parameters) connection.stateUpdateHandler = { newState in switch newState { case .ready: // The connection is ready; you can now send an HTTP request var httpRequest = "\(httpMethod) \(url.path) HTTP/1.1\r\nHost: \(urlHost)\r\n" if let postBody = postBody { httpRequest += "Content-Type: application/json\r\n" httpRequest += "Content-Length: \(postBody.utf8.count)\r\n\r\n" httpRequest += postBody } else { httpRequest += "\r\n" } let requestData = httpRequest.data(using: .utf8) connection.send(content: requestData, completion: .contentProcessed { error in if let error = error { completion(error, nil, nil) } else { connection.receive(minimumIncompleteLength: 1, maximumLength: .max) { data, _, _, error in if let data = data { if let response = String(data: data, encoding: .utf8), response.contains("\r\n\r\n") { // The headers are complete, and we have the full response let headersAndBody = response.components(separatedBy: "\r\n\r\n") completion(nil, headersAndBody.first, headersAndBody.last) } } else if let error = error { completion(error, nil, nil) } } } }) case let .failed(error), let .waiting(error): completion(error, nil, nil) default: break } } // Start the connection connection.start(queue: DispatchQueue.global()) } }
Topic: App & System Services SubTopic: General Tags:
Oct ’23