2014-10-28 2 views
0

Это меня озадачивает. Я использовал методы класса на NSURLConnection без проблем, но я застрял с +[NSURLSession sessionWithConfiguration:delegate:delegateQueue:].Can hook + [NSURLSession sessionWithConfiguration: delegate: delegateQueue:], но вызов% orig дает «непризнанный селектор»

Я даже пытался войти все методы класса с class_copyMethodList (object_getClass([NSURLSession class]), &count); и методами класса на самом деле есть: sessionWithConfiguration:delegate:delegateQueue: initialize

И странная вещь крюк делает дозвонился, так что я думаю, что мы получили это право. Вызов %orig() и просто передавая параметры вниз выходов:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSURLSession sessionWithConfiguration:delegate:delegateQueue:]: unrecognized selector sent to class 0x1919932b8'

Вот крюк:

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration 
            delegate:(id<NSURLSessionDelegate>)delegate 
          delegateQueue:(NSOperationQueue *)queue 
{ 

    NSURLSession *origResult = %orig(configuration, delegate, queue); 

    return origResult; 
} 

Могу ли я что-нибудь не хватает?

Детали установки: rpetrich's Theos Mac OS X 10.9.5 IPad Air 1 IOS 7.1.2

ответ

0

Проблема здесь связана с NSURLSession being a class cluster. Хотя код в OP успешно подключил метод класса, %orig необходимо вызвать имя реального класса. Чтобы заставить его работать, этот крюк должен быть помещен под %hook __NSCFURLSession. Имя реального класса может отличаться для вашего случая.

0

Попробуйте этот код ...

+ (NSURLSession *) sessionWithConfiguration: (NSURLSessionConfiguration *) configuration delegate: (id) delegate delegateQueue: (NSOperationQueue *) queue 
{ 
    NSURLSession * session = [ NSURLSession SessionWithConfiguration : Configuraion 
          delegate : self 
         DelegateQueue : nil ]; 
} 

delegateQueue Определяет NSOperationQueue. если ваш код требует делегироватьQueue вместо nil, вы должны объявить очередь.

+0

Проблемы: 1. В случае использования 'SessionWithConfiguration'' DelegateQueue' это не скомпилируется, потому что этот метод не находится нигде или он должен находиться в другом заголовке? 2. Если вы имели в виду 'sessionWithConfiguration'' delegateQueue'. Это будет вызвано вызовом, который навсегда рекурсивно, потому что он просто называет себя. 3. Самостоятельно не может использоваться в методе класса, только в методе экземпляра. – radj

+0

просто перейдите по этой ссылке http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec – vishnu