SwiftUI中AppDelegate无法每次打开App都正常运行如何解决
问题原因
application(_:didFinishLaunchingWithOptions:)方法本身的设计就是仅在App冷启动时触发:也就是App进程完全被杀死(用户手动上滑关闭、系统自动回收内存)后重新打开才会调用。如果App只是退到后台没有被杀死,点击桌面图标唤醒App时不会触发该方法,和模拟器运行无关。
修复方案
如果需要每次App从后台回到前台(也就是每次点击桌面图标打开,不管是冷启动还是热唤醒)都执行代码,有两种实现方式:
方案1:使用SwiftUI原生场景生命周期回调(适配SwiftUI项目,推荐)
直接在主App结构里添加onChange监听场景的phase状态即可,无需修改原有AppDelegate代码:
@main struct CouponDeckApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate // 监听当前App的场景状态 @Environment(\.scenePhase) private var scenePhase var body: some Scene { WindowGroup { AppContentView() } .onChange(of: scenePhase) { newPhase in if newPhase == .active { // 此处写入每次App进入前台活跃状态要执行的代码 print("App每次打开都会执行这段代码") } } } }
方案2:在AppDelegate中新增前台唤醒回调方法
如果习惯使用UIKit的AppDelegate生命周期,可以在AppDelegate类里添加applicationDidBecomeActive:方法:
class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { print("仅冷启动执行的代码") return true } // 新增该方法 func applicationDidBecomeActive(_ application: UIApplication) { // 此处写入每次App进入前台活跃状态要执行的代码 print("App每次打开都会执行这段代码") } }
注意事项
- 两个方案的触发时机存在差异:冷启动场景下两个方法都会触发,热唤醒场景下只有监听活跃状态的代码会触发,可根据业务需求拆分逻辑。
- 如果需要App从后台进入前台、但未到活跃状态的执行时机,可以监听
scenePhase从.background到.inactive的切换,或者使用AppDelegate的applicationWillEnterForeground:方法。
内容的提问来源于stack exchange,提问作者Kunal Katiyar
相关产品推荐
相关产品推荐

