Как подключить методы NSURLSession с помощью theos?

Я создал проект настройки, используя теос rpetrich, и хотел перехватить методы NSURLSession, но перехватчики, похоже, не получают вызывается? Почему? Это мой код Tweak.xm:

%hook NSURLSession

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
                            completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler
{
    NSLog(@"testhook dataTaskWithRequest:completionHandler:");
    return %orig(request, completionHandler);
}

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
{
    NSLog(@"testhook dataTaskWithRequest");
    return %orig(request);
}

%end

%hook NSMutableURLRequest

+ (id)requestWithURL:(NSURL *)URL
{
    NSLog(@"testhook NSMutableURLRequest");
    return %orig(URL);
}

%end

Я добавил хук NSMutableURLRequest, чтобы убедиться, что файл и весь твик загружаются. Я могу убедиться, что он перехватывает requestWithURL:, но не любой из методов NSURLSession. Я тестирую код из NSURLSessionExample.

Чего здесь не хватает? Кто-нибудь успешно подключил NSURLSession?


person radj    schedule 05.11.2014    source источник
comment
Какой фильтр для этого твика? Кроме того: синтаксис, который вы используете для ловушек, — это Логос, а не Теос, поэтому вы должны маркировать вопросы этим, а не Теосом.   -  person Aehmlo    schedule 05.11.2014
comment
@AehmloLxaitn Я использовал { Filter = { Bundles = ( "com.ravi.NSURLSessionExample" ); }; }, который является идентификатором пакета тестового приложения. Хук NSMutableRequest сработал, так что я правильно понял фильтр? Я добавил тег logos. Я все равно поставил theos, так как logos является подкомпонентом theos.   -  person radj    schedule 05.11.2014


Ответы (1)


NSURLSession — это кластер классов, и вы перехватываете класс верхнего уровня, который не содержит (или имеет очень мало) кода.

Вы должны исследовать подклассы NSURLSession — возможно, регистрируя реальный класс объекта NSURLSession на месте. В моем ограниченном тестировании я получил объект, класс которого действительно назывался __NSURLSessionLocal.

person Dustin Howett    schedule 14.11.2014
comment
Спасибо! Это сработало! Я буду применять эту проверку на месте к следующим классам, с которыми я сталкиваюсь, которые я не могу зацепить. С моей стороны это __NSCFURLSession. Будет непросто попытаться угадать все возможные имена подклассов. - person radj; 14.11.2014
comment
У меня есть другой вопрос, связанный с этим. Ловушка была успешной в кластере классов, но не смогла вызвать %orig, но после помещения ловушки в реальное имя класса она работала безупречно. stackoverflow.com/questions/26602286/ - person radj; 14.11.2014