You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在主应用与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:14:13