【问题标题】:Detect iOS app entering background检测iOS应用进入后台
【发布时间】:2016-04-17 03:13:21
【问题描述】:

我正在开发一款用 Swift 编码的 iOS 游戏。我试图找到一种方法来检测应用程序何时进入后台模式或因其他原因被中断,例如打电话但找不到任何东西。我该怎么做?

【问题讨论】:

标签: ios iphone swift


【解决方案1】:

要检测应用是否进入后台,可以在 appDelegate.m 中检查 找到应用程序委托方法

applicationDidEnterBackground

一旦应用进入后台,就会调用此方法。

【讨论】:

  • 这只会告诉您应用程序何时进入后台 - 在这种情况发生与被调用的方法之间会有一些延迟。
  • 是的,正是 applicationWillResignActive 可能的答案,+1 @AlexBlundell:干得好。
  • 需要注意的是,这不再适用于 iOS 13 下的应用,除非应用选择不使用场景。
【解决方案2】:

查看UIApplicationDeletegate 实例中定义的委托方法(默认称为AppDelegate.m)。具体来说,以下内容会很有用:

- (void)applicationWillResignActive:(UIApplication *)application

调用此方法是为了让您的应用知道它即将从活动状态变为非活动状态。这可能发生在某些类型的临时中断(例如来电或短信)或当用户退出应用程序并开始转换到后台状态时。处于非活动状态的应用会继续运行,但不会将传入事件分派给响应者。

取自 Apple 文档 - here

【讨论】:

  • 需要注意的是,这不再适用于 iOS 13 下的应用,除非应用选择不使用场景。
【解决方案3】:

您可以在视图控制器中添加观察者:

编辑/更新: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
}

【讨论】:

【解决方案4】:

Swift3

let notificationCenter = NotificationCenter.default
    notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil)


func appMovedToBackground() {
    print("App moved to background!")
}

【讨论】:

  • 需要注意的是,这不再适用于 iOS 13 下的应用,除非应用选择不使用场景。
【解决方案5】:

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")
}

【讨论】:

  • 需要注意的是,这不再适用于 iOS 13 下的应用,除非应用选择不使用场景。
【解决方案6】:

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 不适合应用进入后台。接电话也能触发。
【解决方案7】:

对于 SwiftUI,您可以使用:

YourView()
 .onReceive(NotificationCenter.default.publisher(for: UIScene.willDeactivateNotification)) { _ in
     //...
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多