今天写个小 demo,在模拟器上( iPhoneX )调试请求 ok,但是在真机上死活不执行网络请求的代码,直接跳过,控制台也不报错,打断点仔细看了一下发现 AFHTTPSessionManager 没有被实例化( AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]是成功执行的,但是没有生成对象),这是什么操作,求解答(第一次发帖,不知道在 V2EX 上怎么插图)
1
dorentus 2020-03-23 11:44:20 +08:00
原则上讲,你需要提供:
- AFNetworking 的版本 - 你的项目的 Deployment target 、真机和模拟器的系统版本 - 一个可以重现问题的最小版本的示例代码 - 其他细节,如模拟器上如何调试请求 OK 的;真机上如何调试发现 AFHTTPSessionManager 没有实例化的 ---- 不过我猜,可能是你创建的 AFHTTPSessionManager 没有自己 retain,在请求完成、触发回调之前被 release 了。 |
2
pikoqian98 OP 你好,Xcode 版本是 11.3.1 (11C504),真机 iOS 版本是 13.3.1,模拟器版本是 13.3,AFNetworking 版本是 3.2.1,deploymentTareget 为 9.0
测试代码: AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]; NSLog(@"manager------:%p",manager); manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"res%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }]; 真机上直接打印地址为 0x0,但是模拟器打印内存地址是存在的 |
3
dorentus 2020-03-23 16:26:29 +08:00
我上面那个猜测是错的。
AFHTTPSessionManager 创建的 session 的 delegate 就是 manager 自己,而 session retain 了这个 delegate 。 ---- 我本地试了一下上面的代码,没能重现🤦🏻 ---- 那么不管上面打印出来的 manager 的地址的问题,先排除一下: 1. 把地址改成 https 的,排除 ATS 的影响 2. 在 failure block 里面也加上 NSLog,看看是不是报错了 |
4
pikoqian98 OP @dorentus
感谢您的回复,这些原因之前也排查了一下,似乎确实是没有生成 manager 这个实例,不清楚是为什么,我在模拟器上测试网络请求也是正常执行的。 刚刚把 cocoapods 导入的 AFNetworking 移除,更换成手动导入项目里,真机调试上正常运行了,我 cocoapods 安装应该是正常的,可能是 AFNetworking.framework 导进 build phases 的过程我有不对的地方。 |