ios - puntos - Medición de la intensidad de la señal celular
puntos de señal iphone (6)
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;
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.
No es muy difícil.
- Enlace CoreTelephony.framework en su proyecto Xcode
- 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.
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 commit .
Tenga en cuenta que esto aún no está documentado. Entonces, si su aplicación entrará en la App Store, tome sus precauciones.
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);
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.