[SwiftUI 100 天] 应用处于后台时如何获得通知

1,323 阅读2分钟

译自 www.hackingwithswift.com/books/ios-s…

更多内容,欢迎关注公众号 「Swift花园」

喜欢文章?不如来个 🔺💛➕三连?关注专栏,关注我 🚀🚀🚀

SwiftUI 应用处于后台时如何获得通知

SwiftUI 可以检测到你的应用进入后台的时刻(比如,用户回到主屏),应用回到前台的时刻,用户截屏的时刻,等等。这些都是由 Notification Center 驱动的,它是 Apple 的内部消息系统 —— 一组让系统在事件发生时通知我们的 API,同时也允许我们在代码的不同部分之间传递消息。

Notification Center 也来自 Apple 的 Foundation 框架,在 SwiftUI 中我们可以使用 Combine 来监听来自它的事件。所以说,实际上三个框架协同工作,为我们提供了强大的功能。

例如,Notification Center 会在你的应用进入后台时发送 UIApplication.willResignActiveNotification 消息,这使得我们有机会暂停任何非关键的工作,保存数据,等等。为了使用它,我们需要让 Notification Center 为通知创建一个发布者,然后添加我们要执行的工作。当消息产生时,它会被作为实际的参数传给我们的闭包,不过多数情况下你可以忽略它。

尝试下面的代码,在用户离开应用时打开消息:

Text("Hello, World!")
    .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
        print("进入后台!")
    }

有许多可以监听的消息,工作方式都一样。例如,跟 willResignActiveNotification 相反的是 willEnterForegroundNotification,它会在用户重新激活你的应用时被发送。在这里你可以继续重要的工作:

Text("Hello, World!")
    .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
        print("进入前台!")
    }

你还可以用 userDidTakeScreenshotNotification 来监听用户做了截屏动作:

Text("Hello, World!")
    .onReceive(NotificationCenter.default.publisher(for: UIApplication.userDidTakeScreenshotNotification)) { _ in
        print("用户截屏!")
    }

由于数量众多,恕我不一一列举,这里再举两个例子就好:

  • 当用户修改时钟或者夏时令变更时,UIApplication.significantTimeChangeNotification 消息会被发送
  • 键盘显示时会发送 UIResponder.keyboardDidShowNotification

所有这些通知的工作方式都是相同的:用 onReceive() 从发布者那里捕获消息,然后执行任何你想要做的动作。


我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~

Swift花园微信公众号