iOS使用NSURLSession时WiFi下载正常 移动蜂窝网络无法下载文件
问题产生原因
故障由NSURLSessionConfiguration的网络权限配置直接导致:
代码中创建Session配置时显式设置了config.allowsCellularAccess = NO;,该属性为系统提供的网络类型管控开关,值为NO时会禁止当前NSURLSession实例在移动蜂窝网络下发起任何网络请求。
- 设备接入WiFi时,网络链路不属于蜂窝网络,不受该配置拦截,因此文件下载功能正常
- 切换到蜂窝网络后,所有通过该
defaultSession发起的下载请求会被系统直接拦截,而应用内不依赖该Session的其他功能不受配置影响,因此表现为应用本身运行正常,但文件下载操作无法完成
额外注意:由于代码中对_defaultSession做了懒加载单例处理,Session一旦创建,后续修改config属性不会对已生成的Session实例生效,这也是修改配置后功能不生效的常见原因。
修复方案
根据业务需求选择对应处理方式即可:
方案1:默认允许蜂窝网络下载
如果业务无蜂窝网络下载限制,直接修改配置项为允许状态,修正后的代码如下:
- (NSURLSession *)defaultSession { if (_defaultSession == nil) { NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // 开启蜂窝网络访问权限 config.allowsCellularAccess = YES; _defaultSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; } return _defaultSession; }
如果修改配置前已经在WiFi环境下生成过_defaultSession实例,需要先调用[_defaultSession invalidateAndCancel]后将_defaultSession置为nil,确保下次调用时会用新配置重建Session。
方案2:按需控制蜂窝下载权限
如果业务需要提供「仅WiFi环境下载文件」的用户设置项,可以保留该配置逻辑,但需要在以下场景触发时重建Session实例:
- 用户切换蜂窝下载权限开关时
- 监听到网络类型从WiFi切换为蜂窝/蜂窝切换为WiFi时
重建时同步更新allowsCellularAccess的取值,即可实现权限管控逻辑。
内容的提问来源于stack exchange,提问作者STARK
相关产品推荐
相关产品推荐

