Hook NSURLSession dataTaskWithRequest:completionHandler 中替换block 导致崩溃


#1

代码如下 hook dataTaskWithRequest:completionHandler:
当 block 为nil时 如果传入自己的block 会导致程序崩溃。
后来找到了这个帖子
https://juejin.im/post/5a9e20b3f265da239866c4c9
hook了safari的WKNetworkSessionDelegate
拦截了 dataTaskWithRequest:completionHandler:block 为nil时 返回的数据

查找了论坛里类似的帖子 都没有解释原因 很想知道为什么会这样
崩溃日志也没找到什么
请大哥们赐教 不胜感激

%hook NSURLSession

  • (id)dataTaskWithRequest:(id)arg1 completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))arg2{

NSLog(@“hook===dataTaskWithRequest==%@==%@”,arg1,arg2);

void (^b1)(NSData*,NSURLResponse*,NSError*) = ^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSLog(@"hook==%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
  //执行原来的block
if(arg2){
    arg2(data,response,error);

}
};
if(arg2){
%orig(arg1,b1);
}else{
//这里如果吧自己的block 传入会崩溃
%orig(arg1,nil);
}

}

%end


#2

为什么你外层知道判断nil,到了里面就不知道了


#3

感谢回复 我只是不明白 当block 是nil时 我传入自己构造的block 为啥会崩溃呢?


#4

帖子上的代码改正了 里外 都判断了是否为nil的


#5

判断了nil还是崩?


#6

非常抱歉 没有让您明白我的问题 我的问题 帖子中的代码是不会崩的 因为在自己定义的block里层、外层 都判断了 arg2是否为nil
我的问题是 在外层 注释处 %orig(arg1,nil)这里 如果吧nil 换成自己定义的block 为什么会崩溃呢?


#7

难道不是因为你里面没有判断arg2是不是nil


#8

不是的哥哥, 真的不是 我重新测试了一下 你看我下面的注释

  • (id)dataTaskWithRequest:(id)arg1 completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))arg2{
    NSLog(@“hook===dataTaskWithRequest==%@==%@”,arg1,arg2);

void (^demo2)(NSData*,NSURLResponse*,NSError*) = ^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSLog(@"hook=2222=%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

if(arg2){
    //执行原来的block
    arg2(data,response,error);
}

};
if(arg2){

return %orig(arg1,demo2);
}else{
//当原函数的block 是nil时 传入 自己构造的block 直接挂了 你可以在浏览器里访问百度 然后搜索关键字 return* %orig(arg1,demo2);**
}
}


#9

老哥,有空的时候帮忙看一下


#10

你有这时间, 自己调试器上去跟一下早就知道原因了