Estoy subiendo datos de mi aplicación Swift a Amazon S3 y agota la batería como nada más. ¿Cómo puede esto ser evitado?

En mi aplicación 'Swift' tengo una function de upload fotos a mi cubo de Amazon S3 . Cuando el usuario está conectado a WiFi o LTE , no hay ningún problema, pero cuando la connection es un poco más lenta (por ejemplo, 3G ), la carga demora mucho time (hasta un minuto) y el iPhone puede perder un 15-20% de ¡batería! Cambie el tamaño de las fotos a alnetworkingedor de 200-300 kb, por lo que no debería ser un problema. El código que uso para eso es:

 func awsS3PhotoUploader(_ ext: String, pathToFile: String, contentType: String, automaticUpload: Bool){ let cnetworkingentialsProvider = AWSCognitoCnetworkingentialsProvider(regionType:CognitoRegionType, identityPoolId:CognitoIdentityPoolId) let configuration = AWSServiceConfiguration(region:CognitoRegionType, cnetworkingentialsProvider:cnetworkingentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = configuration let uploadRequest = AWSS3TransferManagerUploadRequest() uploadRequest?.body = URL(string: "file://"+pathToFile) uploadRequest?.key = ProcessInfo.processInfo.globallyUniqueString + "." + ext uploadRequest?.bucket = S3BucketName uploadRequest?.contentType = contentType + ext uploadRequest?.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in DispatchQueue.main.async(execute: { () -> Void in if totalBytesExpectedToSend > 1 { print(totalBytesSent) print(totalBytesExpectedToSend) } }) } let transferManager = AWSS3TransferManager.default() transferManager?.upload(uploadRequest).continue({ (task) -> AnyObject! in if (task.isCompleted) { print("task completed") } if let error = task.error { print("Upload failed ❌ (\(error))") } if let exception = task.exception { print("Upload failed ❌ (\(exception))") } if task.result != nil { let s3URL: String = "https://myAlias.cloudfront.net/\((uploadRequest?.key!)!)" print("Uploaded to:\n\(s3URL)") } else { print("Unexpected empty result.") } return nil } ) } 

¿Hay algo que se te ocurra de qué estoy haciendo mal aquí y cómo se puede evitar este enorme consumo de batería?

La siguiente respuesta se inspiró en https://stackoverflow.com/a/20690088/3549695

Creí que lo que tienes que hacer es la capacidad de detectar el Tipo de la Red de Radio. Ya sea Wi-Fi, LTE, 3G, 2G o sin networking. Luego, la aplicación deberá tomar la decisión, según el resultado.

Creé un proyecto de testing Xcode para probar este concepto en mi iPhone 6. Parece que funciona, pero solo pude probar 'Modo avión', WiFi y LTE. No puedo meterme en la networking 2G o 3G.

En caso de WiFi o LTE, obtendré el valor: 'CTRadioAccessTechnologyLTE'

Mientras se encuentre en 'Modo Avión de avión', el valor opcional será nulo. Entonces, depende de mí con qué text lo reemplace. Y elijo mostrar 'No capaz de detectar'

A continuación, se muestra el aspecto de mi ViewController.swift:

 import UIKit import CoreTelephony class ViewController: UIViewController { @IBOutlet weak var currentRAN: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } @IBAction func detect(_ sender: UIButton) { if case let telephonyInfo = CTTelephonyNetworkInfo(), let currentRadioAccessTech = telephonyInfo.currentRadioAccessTechnology { currentRAN.text = currentRadioAccessTech print("Current Radio Access Technology: \(currentRadioAccessTech)") } else { currentRAN.text = "Not able to detect" print("Not able to detect") } } } 

Donde los valores posibles para .currentRadioAccessTechnology son:

 /* * Radio Access Technology values */ @available(iOS 7.0, *) public let CTRadioAccessTechnologyGPRS: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyEdge: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyWCDMA: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyHSDPA: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyHSUPA: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyCDMA1x: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyCDMAEVDORev0: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyCDMAEVDORevA: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyCDMAEVDORevB: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyeHRPD: String @available(iOS 7.0, *) public let CTRadioAccessTechnologyLTE: String