SwiftUI项目中如何正确关联Sparkle UpdaterDelegate?
解决Sparkle SPUUpdaterDelegate无法触发的问题
你的问题核心是代理实例被提前释放了。你在初始化SPUStandardUpdaterController时直接传入UpdaterDelegate()临时对象,这个对象没有被强引用,会被ARC自动销毁,导致后续更新状态变化时找不到代理对象来调用方法。
正确的实现步骤:
为更新控制器和代理创建强引用属性
在你的类(比如AppDelegate或者SwiftUI的App结构体)中,声明两个强引用属性,确保它们的生命周期和应用一致:private var updaterController: SPUStandardUpdaterController? private var updaterDelegate: UpdaterDelegate?先初始化代理并强引用,再关联到更新控制器
不要直接传临时实例,先创建代理对象并保存到属性,再传入更新控制器:// 初始化代理并强引用 updaterDelegate = UpdaterDelegate() // 初始化更新控制器,传入已保存的代理实例 updaterController = SPUStandardUpdaterController( startingUpdater: true, updaterDelegate: updaterDelegate, userDriverDelegate: nil )确保代理方法正确实现
检查你的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
相关产品推荐
相关产品推荐

