Swift开发跳转默认浏览器后App后台退出,为何浏览器也被关闭?
问题修复方案
问题根源
- 跳转逻辑执行时机过早:你在
viewDidLoad阶段就调用了打开URL的方法,此时App还未完成完整的启动激活流程,UI层级未完全加载,系统无法正确完成跨App的上下文切换,会临时将你触发打开的浏览器页面和当前App的生命周期绑定,所以当你的App退出时浏览器页面会被连带关闭。 - 若你跳转后主动调用了
exit(0)这类直接杀死进程的方法,也会触发该问题:跨App跳转的上下文还未完成系统同步就被强制中断,系统会判定本次跳转无效,自动关闭对应浏览器页面。
修复步骤
- 调整跳转逻辑的执行时机,延后到App完全激活的生命周期节点执行,比如ViewController的
viewDidAppear:方法,或者UIApplicationDelegate的applicationDidBecomeActive:方法,确保App启动完成后再触发跳转。 - 不要在跳转后直接杀死App,而是调用系统公开方法主动将App退至后台,留待系统自行管理进程生命周期。
- 给
open方法增加完成回调,确认跳转成功后再执行退后台逻辑,避免跳转失败的异常情况。
修复后代码示例
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let app = UIApplication.shared guard let targetUrl = URL(string: "https://www.google.de") else { return } if app.canOpenURL(targetUrl) { app.open(targetUrl, options: [:]) { success in guard success else { return } // 跳转成功后主动退后台,不要用exit(0)杀进程 app.perform(#selector(NSXPCConnection.suspend)) } } }
上架注意
如果要上架App Store,不要让App只有空白页直接跳转的逻辑,建议增加简单的配置页、引导说明等内容,否则很容易因功能过于简单被苹果审核拒绝。
内容的提问来源于stack exchange,提问作者user7174483
相关产品推荐
相关产品推荐

