【发布时间】:2016-04-17 03:13:21
【问题描述】:
我正在开发一款用 Swift 编码的 iOS 游戏。我试图找到一种方法来检测应用程序何时进入后台模式或因其他原因被中断,例如打电话但找不到任何东西。我该怎么做?
【问题讨论】:
-
尝试查看您的应用程序委托。
-
查看
UIApplicationDelegate的文档。
我正在开发一款用 Swift 编码的 iOS 游戏。我试图找到一种方法来检测应用程序何时进入后台模式或因其他原因被中断,例如打电话但找不到任何东西。我该怎么做?
【问题讨论】:
UIApplicationDelegate的文档。
要检测应用是否进入后台,可以在 appDelegate.m 中检查 找到应用程序委托方法
applicationDidEnterBackground
一旦应用进入后台,就会调用此方法。
【讨论】:
查看UIApplicationDeletegate 实例中定义的委托方法(默认称为AppDelegate.m)。具体来说,以下内容会很有用:
- (void)applicationWillResignActive:(UIApplication *)application
调用此方法是为了让您的应用知道它即将从活动状态变为非活动状态。这可能发生在某些类型的临时中断(例如来电或短信)或当用户退出应用程序并开始转换到后台状态时。处于非活动状态的应用会继续运行,但不会将传入事件分派给响应者。
取自 Apple 文档 - here
【讨论】:
您可以在视图控制器中添加观察者:
编辑/更新:Xcode 11 • Swift 5
iOS13 或更高版本
UIScene.willDeactivateNotification
iOS12 或更早版本
UIApplication.willResignActiveNotification
if #available(iOS 13.0, *) {
NotificationCenter.default.addObserver(self, selector: #selector(willResignActive), name: UIScene.willDeactivateNotification, object: nil)
} else {
NotificationCenter.default.addObserver(self, selector: #selector(willResignActive), name: UIApplication.willResignActiveNotification, object: nil)
}
并为您的视图控制器添加一个选择器方法,当您的应用收到该通知时将执行该方法:
@objc func willResignActive(_ notification: Notification) {
// code to execute
}
【讨论】:
func 之前添加 @objc。
name: UIApplication.willResignActiveNotification。
Swift3
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil)
func appMovedToBackground() {
print("App moved to background!")
}
【讨论】:
在 swift 5.x 中:要观察应用进入 background 事件,请将此代码添加到您的 viewDidLoad() 方法中。
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
@objc func appMovedToBackground() {
// do whatever event you want
}
你必须使用UIApplication.didEnterBackgroundNotification。
如果你想观察应用是否来到了前台事件,使用UIApplication.willEnterForegroundNotification
所以,完整的代码是:
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
notificationCenter.addObserver(self, selector: #selector(appCameToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
// Do any additional setup after loading the view.
}
@objc func appMovedToBackground() {
print("app enters background")
}
@objc func appCameToForeground() {
print("app enters foreground")
}
【讨论】:
SwiftUI
从后台
Text("Hello, World!")
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
print("To the foreground!")
}
到后台
Text("Hello, World!")
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
print("To the background!")
}
【讨论】:
UIApplication.willResignActiveNotification 不适合应用进入后台。接电话也能触发。
对于 SwiftUI,您可以使用:
YourView()
.onReceive(NotificationCenter.default.publisher(for: UIScene.willDeactivateNotification)) { _ in
//...
}
【讨论】: