如何在主应用与App Extension共享网络请求类(兼容UIApplication.shared)
解决主应用与App Extension共用网络请求类的指示器兼容问题
这个场景太常见了!完全不用为了一行代码就重复编写整个网络请求类,通过条件可用性判断结合环境检测就能完美搞定,既保留主应用的网络活动指示器功能,又能让类在App Extension中正常运行。
方案一:直接在原类中添加条件判断
你可以直接在设置指示器的代码处,用#available结合ProcessInfo来判断当前是否处于主应用环境:
func startNetworkRequest() { // 这里写你的通用网络请求逻辑(比如创建URLSession、处理参数等) // 仅在主应用中启用网络活动指示器 if #available(iOS 13.0, *), !ProcessInfo.processInfo.isExtension { UIApplication.shared.isNetworkActivityIndicatorVisible = true } } func finishNetworkRequest() { // 这里写你的通用请求收尾逻辑(比如处理响应、清理资源等) // 仅在主应用中关闭网络活动指示器 if #available(iOS 13.0, *), !ProcessInfo.processInfo.isExtension { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
关键说明:
ProcessInfo.processInfo.isExtension:这个属性可以准确判断当前代码是否运行在App Extension环境中,比单纯依赖系统版本更可靠(毕竟Extension和主应用会使用相同的iOS版本)。#available(iOS 13.0, *):如果你的项目需要支持更早的iOS版本(比如iOS 12及以下),可以把版本号调整为对应的最低支持版本,或者直接去掉版本判断(只要确保主应用能访问UIApplication.shared即可)。
方案二:封装指示器管理工具类(更优雅)
如果你的网络请求类中有多处需要操作指示器,建议把这部分逻辑抽成一个独立的工具类,让代码更整洁、易维护:
enum NetworkIndicatorManager { static func setIndicatorVisible(_ visible: Bool) { // 先判断是否在Extension环境,直接跳过后续操作 guard !ProcessInfo.processInfo.isExtension else { return } // 确保能访问UIApplication.shared if #available(iOS 13.0, *) { UIApplication.shared.isNetworkActivityIndicatorVisible = visible } } }
然后在你的网络请求类中直接调用:
func startNetworkRequest() { // 通用请求逻辑... NetworkIndicatorManager.setIndicatorVisible(true) } func finishNetworkRequest() { // 通用收尾逻辑... NetworkIndicatorManager.setIndicatorVisible(false) }
额外提示
如果你的项目需要支持iOS 10及更早版本,ProcessInfo.isExtension是iOS 10才引入的,这时可以用另一种方式判断是否处于Extension环境:
let isExtension = Bundle.main.bundlePath.hasSuffix(".appex")
这样处理后,你的网络请求类就能同时在主应用和App Extension中正常使用,不用重复编写代码,还保留了主应用的网络状态提示功能。
内容的提问来源于stack exchange,提问作者Schuey999
相关产品推荐
相关产品推荐

