应用程序将终止通知

9
我正在开发SDK,尝试捕获应用程序终止的通知。可以通过 (例如) NSNotification.Name.UIApplicationWillResignActive 的闭包轻松获取此通知。
self.resignActiveNotification = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillResignActive,
                                                                       object: nil,
                                                                       queue: nil) { _ in
//something goes here and it works like a charm.
}

所以我希望在终止时有类似的行为:
self.terminateNotification = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillTerminate,
                                                                    object: nil,
                                                                    queue: nil) { _ in
        NSLog("%@",#function)
    }

“而且这个从未被调用!” “当然,如果我加入AppDelegate:”
func applicationWillTerminate(_ application: UIApplication) {
    //termination
}

它会起作用,但由于我正在构建一个SDK,因此无法使用AppDelegate方法。有一种方法可以获取终止闭包调用吗?或者任何其他了解应用程序即将终止的方法?
苹果文档中,您可以找到以下内容:
引用:

在调用此方法后,该应用程序还会发布UIApplicationWillTerminate通知,以便感兴趣的对象有机会响应转换。

然而,这似乎是错误的。

1
这不是真的。如果应用程序处于前台而不是挂起状态,AppDelegate中的applicationWillTerminate方法将被调用,以通知状态更改。 - Jakub
请注意,您的代码对我有效,当我尝试终止应用程序时,NSLog("%@",#function)已被调用... 此外,NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: NSNotification.Name.UIApplicationWillTerminate, object: nil) 对我来说也很好用。 - Ahmad F
1
根据Apple文档,如果应用程序被用户杀死,此方法将不会被调用:对于支持后台执行的应用程序,在用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,在应用程序在后台运行(未挂起)且系统需要出于某种原因终止它的情况下,可能会调用此方法。 - rckoenes
1
@rckoenes @Martin R - 暂停/后台和活动状态之间有很大的区别。看一下这个:https://vimeo.com/257906400而且,根据你引用的文档@rckoenes,它说:“通常情况下,当用户退出应用程序时不会调用此方法,因为应用程序只是移动到后台”,所以它并不是指用户终止,而是将其放在后台。这是两个不同的操作。 - Jakub
1
@rckoenes请看一下我之前评论中的视频。我已经完全做到了(从应用程序切换器中杀死应用程序),并且确实被调用了。 - Jakub
显示剩余7条评论
1个回答

13

这对我似乎有效:

init() {
  NotificationCenter.default.addObserver(self,
      selector: #selector(applicationWillTerminate(notification:)),
      name: UIApplication.willTerminateNotification,
      object: nil)
}

@objc func applicationWillTerminate(notification: Notification) {
  // Notification received.
}

deinit {
  NotificationCenter.default.removeObserver(self)
}

1
请为你的答案添加更多描述! - Michael Maher
请注意:如果您的应用程序针对iOS 9.0及更高版本或macOS 10.11及更高版本,并且您使用了addObserver(_:selector:name:object:),则无需注销观察者。如果您忘记或无法删除观察者,则系统会在下一次将其发布时进行清理。来源:https://developer.apple.com/documentation/foundation/notificationcenter/1413994-removeobserver - viteinfinite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接