Получите доступ к CoreTelephony.framework

Я использую заголовки iOS Runtime от nst, чтобы получить доступ к 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"]);

person Can    schedule 26.10.2015    source источник
comment
Не могли бы вы опубликовать свою собственную попытку кода? К какому классу в CoreTelephony вы пытаетесь получить доступ?   -  person Flying_Banana    schedule 26.10.2015
comment
@Flying_Banana Пожалуйста, смотрите правку.   -  person Can    schedule 26.10.2015
comment
Почему вы пытаетесь получить к нему такой доступ? CoreTelephony — общедоступный фреймворк.   -  person dan    schedule 26.10.2015
comment
@dan Я знаю об этом, но мне нужен доступ к приватным вещам в этой публичной структуре для исследовательских целей. Я на неправильном пути?   -  person Can    schedule 26.10.2015
comment
Да, вы можете просто создать объект CTTelephonyNetworkInfo в обычном режиме, а затем получить доступ к нужному частному свойству, используя valueForKey:, как в последней строке вашего фрагмента.   -  person dan    schedule 26.10.2015
comment
@dan Да, это сработало. Спасибо. Но как я могу получить доступ к методам экземпляра. Они не определены в общедоступных заголовках.   -  person Can    schedule 26.10.2015


Ответы (1)


Проблема в том, что CTTelephonyNetworkInfo фактически не имеет свойства sharedInstance. Направлено из здесь, CTTelephonyNetworkInfo — это структура данных, предназначенная для размещения соответствующей информации, и к ней можно получить доступ (создать) напрямую через стандартный [[CTTelephonyNetworkInfo alloc] init] (см. здесь).

Итак, для вашего случая:

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.

person Flying_Banana    schedule 26.10.2015
comment
Пример использования работает и для меня. Просто я не могу модифицировать его для работы с CoreTelephony. - person Can; 26.10.2015
comment
Отредактировано. Извините за первоначальный ответ, думал, что это ваша собственная попытка! :) - person Flying_Banana; 26.10.2015
comment
Не могли бы вы также поделиться фрагментом, пожалуйста? - person Can; 26.10.2015
comment
Попробовал ваш фрагмент на реальном устройстве, но вернул null. Также как я могу вызывать методы? - person Can; 26.10.2015
comment
Очевидно, что CTTelephonyNetworkInfo дает вам доступ только к информации оператора, как указано в описание Apple. Я обновил ответ для методов вызова. - person Flying_Banana; 26.10.2015
comment
Возможно, для работы CoreTelephony требуется разрешение. В любом случае, очень признателен! - person Can; 27.10.2015