2014-11-05 113 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