可以hook + 但调用%orig给出“无法识别的select器”

这让我感到困惑。 我在NSURLConnection上挂钩了类方法,没有任何问题,但是我坚持使用+[NSURLSession sessionWithConfiguration:delegate:delegateQueue:]

我甚至尝试用class_copyMethodList (object_getClass([NSURLSession class]), &count);logging所有的类方法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

试试这个代码…

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

delegateQueue指定NSOperationQueue。 如果你的代码需要delegateQueue而不是零,你应该声明队列。

这里的问题与NSURLSession是一个类集群有关 。 OP中的代码成功地挂钩了类方法, %orig需要调用真正的类名。 所以为了使它工作,这个钩子必须放在%hook __NSCFURLSession 。 真实的课程名称可能会因您的情况而有所不同。

Interesting Posts