2014-11-05 112 views
0

我使用rpetrich's theos创建了一个调整项目,并且想要挂钩NSURLSession方法,但挂钩似乎没有被调用?为什么?这是我的Tweak.xm代码:如何将NSURLSession方法与theos挂钩?

%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?

+0

这个调整的过滤器是什么?另外:你用于钩子的语法是Logos,而不是Theos,所以你应该用问题来代替Theos。 – Aehmlo 2014-11-05 13:14:39

+0

@AehmloLxaitn我用'{Filter = {Bundles =(“com.ravi.NSURLSessionExample”); }; }'这是测试应用程序的包ID。 'NSMutableRequest'钩子工作,所以我想我的过滤器是正确的?我添加了'logos'标签。因为'logos'是'theos'的一个子组件,所以我放了'theos'。 – radj 2014-11-05 14:10:37

回答

1

NSURLSession是一个类集群,并且您正在钩住不包含(或稀少的)代码的顶级类。

您应该调查NSURLSession的子类 - 可能是原位记录NSURLSession对象的实际类别。在我有限的测试中,我收到了一个真正命名为__NSURLSessionLocal的对象。

+0

谢谢!这工作!我将对我遇到的下一个课程进行实地考察,这是我无法接受的。在我的结尾是'__NSCFURLSession'。试图猜测所有可能的子类名称会很棘手。 – radj 2014-11-14 10:32:01

+0

我还有与此相关的另一个问题。该钩子在类集群上成功,但在调用'%orig'时失败了,但是在将钩子放入真正的类名后,它完美无缺地工作。 http://stackoverflow.com/questions/26602286/can-hook-nsurlsession-sessionwithconfigurationdelegatedelegatequeue-but-ca – radj 2014-11-14 10:57:30