可以挂钩+ [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]但是调用%orig会给出"无法识别的选择器"

时间:2014-10-28 06:40:41

标签: ios iphone jailbreak theos

令我感到困惑。我已经在NSURLConnection上隐藏了类方法而没有任何问题,但我仍然坚持使用+[NSURLSession sessionWithConfiguration:delegate:delegateQueue:]

我甚至尝试使用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

2 个答案:

答案 0 :(得分:0)

试试这段代码......

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

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

答案 1 :(得分:0)

此处的问题与NSURLSession being a class cluster有关。虽然OP中的代码成功地挂接了类方法,但%orig需要调用实际的类名。所以为了使它工作,这个钩子必须放在%hook __NSCFURLSession下面。对于您的案例,真实的班级名称可能会有所不同。