专栏首页韦弦的偶尔分享SwiftUI:获取应用进入后台的通知

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SwiftUI:创建表单

    许多应用程序都要求用户输入某种内容——可能是要求他们设置一些偏好,可能是要求他们确认他们想要车去哪里接他们,可能是从菜单上订购食物,或是其他类似的东西。

    韦弦zhy
  • Hacking with iOS: SwiftUI Edition - 纸杯蛋糕项目——挑战

    希望该项目向您展示了如何利用您所了解的技能,SwiftUI的表单,选择器,步进器和导航,并将其构建到一个应用程序中,该应用程序将所有用户数据发送到服务器并处理响...

    韦弦zhy
  • SwiftUI:创建自定义绑定

    由于SwiftUI将绑定更新发送到属性包装器的方式,分配与属性包装器一起使用的属性观察器将无法正常工作,这意味着即使模糊半径发生变化,此类代码也不会打印任何内容...

    韦弦zhy
  • OpenStack报错:Host is not mapped to any cell

    新建实例dt01报错:Host 'openstack-computer' is not mapped to any cell

    loong576
  • 180815-Spring之RestTemplate中级使用篇

    前面一篇介绍了如何使用RestTemplate发起post和get请求,然而也只能满足一些基本的场景,对于一些特殊的如需要设置请求头,添加认证信息等场景,却没有...

    一灰灰blog
  • 使用JDBC操作SAP云平台上的HANA数据库

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog....

    Jerry Wang
  • jbpm5.1介绍(5)

    看几个jbpm5中带的示例程序吧,包括了很多我们在日常生活中的场景 循环示例 本示例是一个在外部传入的变量,通过传入的变量来判断循环次数的演示程序,看一下流程定...

    cloudskyme
  • Spring之RestTemplate中级使用篇

    前面一篇介绍了如何使用RestTemplate发起post和get请求,然而也只能满足一些基本的场景,对于一些特殊的如需要设置请求头,添加认证信息等场景,却没有...

    一灰灰blog
  • Java开发小技巧

    平时开发中有一些小技巧,都不算很有技术含量,但在工作中运用这些技巧确实可以提高工作效率,这里把这些小技分享出来。

    jeremyxu
  • tuned-adm

    为了最大化服务器上的服务,应用程序和数据库的端到端性能,系统管理员通常使用各种工具(通用操作系统工具以及第三方工具)执行自定义性能调整。在CentOS / RH...

    胡齐

扫码关注云+社区

领取腾讯云代金券