访问CoreTelephony.framework

时间:2015-10-26 18:36:21

标签: ios iphone-privateapi

我使用nst's iOS Runtime Headers访问CoreTelephony.framework。

以下是他的示例代码:

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/FTServices.framework"];
BOOL success = [b load];

Class FTDeviceSupport = NSClassFromString(@"FTDeviceSupport");
id si = [FTDeviceSupport valueForKey:@"sharedInstance"];

NSLog(@"-- %@", [si valueForKey:@"deviceColor"]);

他的示例使用代码使我能够访问FTServices.framework,但是当我应用相同的逻辑时,它会失败,因为CoreTelephony没有包含名为sharedInstance()的类方法。

我应该自己声明和实施,还是有其他方式?

感谢。

修改

我的尝试:

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/Frameworks/CoreTelephony.framework"];
BOOL success = [b load];

Class CTTelephonyNetworkInfo = NSClassFromString(@"CTTelephonyNetworkInfo");
id si = [CTTelephonyNetworkInfo valueForKey:@"sharedInstance"]; // fails here

NSLog(@"-- %@", [si valueForKey:@"cachedSignalStrength"]);

1 个答案:

答案 0 :(得分:2)

问题是CTTelephonyNetworkInfo 实际上没有属性sharedInstance。从here引用,CTTelephonyNetworkInfo是一个用于存放相关信息的数据结构,可以通过标准[[CTTelephonyNetworkInfo alloc] init](引自here)直接访问(构建)。

所以对你的情况来说:

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/Frameworks/CoreTelephony.framework"];
BOOL success = [b load];

Class CTTelephonyNetworkInfo = NSClassFromString(@"CTTelephonyNetworkInfo");
id si = [[CTTelephonyNetworkInfo alloc] init];

NSLog(@"-- %@", [si valueForKey:@"cachedSignalStrength"]);

确保您在实际手机上进行测试!模拟器没有存储此类信息。

编辑: 如果要在生成的类上调用方法,请使用performSelector:NSInvocation类。