Cómo detectar en time real el aumento / disminución de la potencia de la señal celular en iOS

Mi aplicación (es una aplicación de tienda de aplicaciones) puede conectarse a través de 3G / 4G / LTE / Edge, etc … sin embargo, no puede detectar en time real (a través de una callback) que la potencia de la señal se ha modificado. Por ejemplo: si estoy conectado con 4G y estoy en la "esquina" donde la señal es EDGE o 2G, desearía deshabilitar alguna funcionalidad. También me gustaría volver a activar la funcionalidad con la señal se vuelve 4G nuevamente.

He visto la class CTTelephonyNetworkInfo y también esos valores se ofrecen en el SDK

 CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 

pero ¿cómo puede recibir la aplicación una notificación si uno de esos valores está activo? Tengo un código que lee de CTTelephoneNetworkInfo y los valores que estoy devolviendo son correctos, pero esto se hace cuando estoy llamando a los methods manualmente.

Para detectar la potencia de la señal celular, uso CTRadioAccessTechnologyDidChangeNotification .

Puedes probar este código:

 import CoreTelephony private var info: CTTelephonyNetworkInfo! func createObserver() { self.info = CTTelephonyNetworkInfo(); NSNotificationCenter.defaultCenter().addObserver(self, selector: "currentAccessTechnologyDidChange", name: CTRadioAccessTechnologyDidChangeNotification, object: self.observerObject) } func currentAccessTechnologyDidChange() { if let currentAccess = self.info.currentRadioAccessTechnology { switch currentAccess { case CTRadioAccessTechnologyGPRS: print("GPRS") case CTRadioAccessTechnologyEdge: print("EDGE") case CTRadioAccessTechnologyWCDMA: print("WCDMA") case CTRadioAccessTechnologyHSDPA: print("HSDPA") case CTRadioAccessTechnologyHSUPA: print("HSUPA") case CTRadioAccessTechnologyCDMA1x: print("CDMA1x") case CTRadioAccessTechnologyCDMAEVDORev0: print("CDMAEVDORev0") case CTRadioAccessTechnologyCDMAEVDORevA: print("CDMAEVDORevA") case CTRadioAccessTechnologyCDMAEVDORevB: print("CDMAEVDORevB") case CTRadioAccessTechnologyeHRPD: print("HRPD") case CTRadioAccessTechnologyLTE: print("LTE") default: print("DEF") } } else { print("Current Access technology is NIL") } } 

Lo he probado en mi iPhone activando / desactivando el modo avión y me he dado count de que a veces tengo que esperar un poco más de time para recibir notifications. Entonces tal vez la mejor manera en su caso se llame simplemente info.currentRadioAccessTechnology y obtenga el resultado cuando lo necesite. Por supuesto, restring eliminar el observador cuando ya no lo necesites.

La documentation de Apple sobre esto:

currentRadioAccessTechnology Discusión: La tecnología de acceso de radio actual con la que está registrado el dispositivo. Puede ser NULL si el dispositivo no está registrado en ninguna networking.

Además, hago algunas investigaciones y encontré una respuesta interesante que podría ayudarte.

Versión simple de Obj-C:

 #import <CoreTelephony/CTTelephonyNetworkInfo.h> CTTelephonyNetworkInfo *ctInfo = [CTTelephonyNetworkInfo new]; [[NSNotificationCenter defaultCenter] addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) { NSLog(@"current access radio access did change to : %@", ctInfo.currentRadioAccessTechnology); }];