Medición de la intensidad de la señal celular

Estoy desarrollando una aplicación que no es una tienda de aplicaciones para iOS. Quiero leer la fuerza de la señal celular en mi código.

Sé que Apple no proporciona ninguna API por la cual podamos lograr esto.

¿Hay alguna API privada que pueda usarse para lograr esto? He revisado los distintos temas relacionados con este tema, pero no he podido encontrar ninguna información relevante.

Es completamente posible porque hay una aplicación en la tienda de aplicaciones para detectar la intensidad de la señal del operador.

Miré brevemente el proyecto VAFieldTest ubicado en Github .

Parece que hay getSignalStrength() y register_notification() en Classes / VAFieldTestViewController.m que pueden ser interesantes para usted cuando llaman a CoreTelephony.framework .

Estoy bastante seguro de que algunas de las llamadas usadas no están documentadas en la documentación del marco de trabajo de CoreTelephony de Apple y, por lo tanto, son privadas: cualquier aplicación de la AppStore debe haber pasado por la inspección.

Obtener signalStreght IOS9:

 UIApplication *app = [UIApplication sharedApplication]; NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; NSString *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) { dataNetworkItemView = subview; break; } } int signalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue]; NSLog(@"signal %d", signalStrength); 

No es muy difícil.

  1. Enlace CoreTelephony.framework en su proyecto Xcode
  2. Agregue las siguientes líneas donde lo necesite

Código:

 int CTGetSignalStrength(); // private method (not in the header) of Core Telephony - (void)aScanMethod { NSLog(@"%d", CTGetSignalStrength()); // or do what you want } 

Y has terminado.

Actualización de mayo de 2016

Apple eliminó esta oportunidad.

Para obtener la intensidad de la señal en iOS 9 o superior en Swift 3, sin utilizar la API privada de CoreTelephony – CTGetSignalStrength() . Simplemente recorriendo la vista de la barra de estado.

 func getSignalStrength() -> Int { let application = UIApplication.shared let statusBarView = application.value(forKey: "statusBar") as! UIView let foregroundView = statusBarView.value(forKey: "foregroundView") as! UIView let foregroundViewSubviews = foregroundView.subviews var dataNetworkItemView:UIView! for subview in foregroundViewSubviews { if subview.isKind(of: NSClassFromString("UIStatusBarSignalStrengthItemView")!) { dataNetworkItemView = subview break } else { return 0 //NO SERVICE } } return dataNetworkItemView.value(forKey: "signalStrengthBars") as! Int } 

Atención : si la barra de estado está oculta, la tecla “barra de estado” devolverá nulo.

No lo he probado, pero aparentemente este es ahora un método de CTTelephonyNetworkInfo lugar de una función global / estática.

El tipo de retorno es id , así que creo que obtienes un NSDictionary (como lo implica _cachedSignalStrength ivar) o un NSNumber (como lo implica la función anterior).

 id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength]; 

Esto cambió en iOS 8.3, como se puede ver en la confirmación .

Tenga en cuenta que esto aún no está documentado. Entonces, si su aplicación entrará en la App Store, tome sus precauciones.

Aquí está la respuesta de Lucas convertida a Xamarin, y probado en iOS 10.2.1:

 var application = UIApplication.SharedApplication; var statusBarView = application.ValueForKey(new NSString("statusBar")) as UIView; var foregroundView = statusBarView.ValueForKey(new NSString("foregroundView")) as UIView; UIView dataNetworkItemView = null; foreach (UIView subview in foregroundView.Subviews) { if ("UIStatusBarSignalStrengthItemView" == subview.Class.Name) { dataNetworkItemView = subview; break; } } if (null == dataNetworkItemView) return false; //NO SERVICE int bars = ((NSNumber)dataNetworkItemView.ValueForKey(new NSString("signalStrengthBars"))).Int32Value;