SwiftUI:获取应用进入后台的通知
SwiftUI可以检测您的应用何时移至后台(即用户何时返回主屏幕),何时回到前台,用户何时截取屏幕截图等等。这些全部由 Notification Center 提供支持,Notification Center 是 Apple 内部消息系统的API名称,该API使系统可以在事件发生时通知我们,还可以使我们在代码的不同部分之间发布消息。
Notification Center 是来自 Apple 的 Foundation 框架的另一个功能,在 SwiftUI 中,我们可以使用 Combine 监视其事件,因此,实际上这是 Apple的三个框架共同协作,为我们提供了出色的功能。
例如,当您的应用开始移至后台时,通知中心会发布一条名为UIApplication.willResignActiveNotification
的消息,这使我们有机会暂停任何不重要的工作,保存数据等等。要使用它,我们需要让 Notification Center 为该通知创建一个发布者,然后附加我们想要的任何工作。我们会收到作为闭包参数的实际消息,但是大多数时候您可以忽略此消息。
因此,请尝试以下操作在用户离开您的应用程序时打印出一条消息:
Text("Hello, World!")
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
print("Moving to the background!")
}
我们可以收听很多此类通知,它们的工作方式完全相同。例如,willResignActiveNotification
的反义是willEnterForegroundNotification
,当用户重新激活您的应用程序并有机会继续进行任何重要工作时会调用该方法:
Text("Hello, World!")
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
print("Moving back to the foreground!")
}
您甚至可以使用userDidTakeScreenshotNotification
检测用户何时拍摄了屏幕截图:
Text("Hello, World!")
.onReceive(NotificationCenter.default.publisher(for: UIApplication.userDidTakeScreenshotNotification)) { _ in
print("User took a screenshot!")
}
这些内容太多了,因此我无法在此处列出所有内容,因此可以再尝试一下以下列出两种方法:
- 当用户更改时钟或夏时制更改时,将调用
UIApplication.significantTimeChangeNotification
。 - 显示键盘时,将调用
UIResponder.keyboardDidShowNotification
。
这些通知中的每一个都以完全相同的方式工作:使用onReceive()
捕获来自发布者的通知,然后执行所需的任何操作。
也可以自己发送通知:
NotificationCenter.default.post(
name: NSNotification.Name(rawValue: "your post name"),
object: nil,
userInfo: ["data":"data1"]
)
然后自己监听:
Text("Hello, World!")
.onReceive(NotificationCenter.default.publisher(for: NSNotification.Name(rawValue: "your post name"))) { noti in
print("Get myself notification!")
}
译自 How to be notified when your SwiftUI app moves to the background