在iphone中获取运营商名称和信号强度返回错误值

时间:2011-11-24 08:54:23

标签: iphone objective-c iphone-privateapi signal-strength

我很好奇为什么我得到错误的价值来获得运营商名称和信号强度。 这里的代码。

CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *car = [netinfo subscriberCellularProvider];
NSLog(@"Carrier Name: %@", car.carrierName);
[netinfo release];

为什么我获得了价值“载体”而不是我使用的载体?

这是获得信号强度的代码

void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
int (*CTGetSignalStrength)();
CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");  
int result = CTGetSignalStrength();
NSLog(@"Signal strength: %d", result);
dlclose(libHandle);

因为我知道,信号强度是以dBm值(负数),但为什么上面的值显示正值并且现在显示信号强度? 是否存在任何值映射以在dBm上显示信号强度

P.S我在真正的iphone设备上运行该程序仍然得到错误的价值。

任何帮助都会受到赞赏。

感谢。

2 个答案:

答案 0 :(得分:3)

关于运营商:在模拟器上运行代码会让我nil正确地在设备上运行2011-11-24 10:49:05.182 testapp[12579:707] Carrier Name: Vodafone.de,因此代码绝对正确(使用Xcode 4.2在iOS 5.0.1上运行) 。也许你的运营商没有正确填写某些字段?在任何情况下,我都会考虑在其他设备或其他SIM卡上进行测试。

关于信号强度:由于CTGetSignalStrength似乎是一个相当未记载的API,因此Apple可以任意定义这些值(并重新定义)。在任何情况下,这似乎是RSSI值(接收信号强度指示),其或多或少是正数,其中1是最差信号强度而上限是更好。因此,没有预定义(记录且因此稳定)可用的dBm值映射,可能必须通过实验创建映射。

答案 1 :(得分:2)

信号强度值作为整数返回是很常见的。棘手的一点是映射到相应的dBm值。通常,int值提供0.5,1或2 dBm的分辨率。手机/调制解调器报告的dBm值对于2G(GSM / EDGE)通常在-115到-51dBm之间,对于3G(UMTS / HSxPA)通常在-120到-25dBm之间,并且代表RSSI(接收信号强度指示符)。

E.g。 Android API使用默认的3GPP映射(see Android reference).

请注意iPhone 4S(Qualcomm)和使用英飞凌金牌的早期型号的基带调制解调器不同。