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

SwiftUI项目中如何正确关联Sparkle UpdaterDelegate?

解决Sparkle SPUUpdaterDelegate无法触发的问题

你的问题核心是代理实例被提前释放了。你在初始化SPUStandardUpdaterController时直接传入UpdaterDelegate()临时对象,这个对象没有被强引用,会被ARC自动销毁,导致后续更新状态变化时找不到代理对象来调用方法。

正确的实现步骤:

  1. 为更新控制器和代理创建强引用属性
    在你的类(比如AppDelegate或者SwiftUI的App结构体)中,声明两个强引用属性,确保它们的生命周期和应用一致:

    private var updaterController: SPUStandardUpdaterController?
    private var updaterDelegate: UpdaterDelegate?
    
  2. 先初始化代理并强引用,再关联到更新控制器
    不要直接传临时实例,先创建代理对象并保存到属性,再传入更新控制器:

    // 初始化代理并强引用
    updaterDelegate = UpdaterDelegate()
    // 初始化更新控制器,传入已保存的代理实例
    updaterController = SPUStandardUpdaterController(
        startingUpdater: true,
        updaterDelegate: updaterDelegate,
        userDriverDelegate: nil
    )
    
  3. 确保代理方法正确实现
    检查你的UpdaterDelegate类是否正确实现了所需的代理方法,比如:

    class UpdaterDelegate: NSObject, SPUUpdaterDelegate {
        func updaterDidFindValidUpdate(_ updater: SPUUpdater) {
            print("检测到可用更新")
        }
        
        func updaterDidNotFindUpdate(_ updater: SPUUpdater) {
            print("当前已是最新版本")
        }
        
        // 根据需求实现其他代理方法...
    }
    

额外注意事项:

  • 必须让UpdaterDelegate继承自NSObject,因为Sparkle的代理系统基于Objective-C运行时,需要NSObject的动态派发支持。
  • 如果是在SwiftUI环境中使用,建议将updaterController放在@StateObject或@ObservedObject中,确保其生命周期与视图/应用同步。

内容的提问来源于stack exchange,提问作者Akivili Collindort

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:19:55