未接收场景相位变化

2023-11-29

我正在尝试执行一些我之前放入应用程序委托中的代码,例如在进入后台时保存我的托管对象上下文。我把电话放在.onChange对于 scenePhase,但我什么也没得到。这是一个示例项目:

import SwiftUI

@main
struct PhaseApp: App {
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            Text("Hello, world.")
        }
        .onChange(of: scenePhase) { phase in
            switch phase {
            case .active:
                print("Active")
            case .background:
                print("Background")
            case .inactive:
                print("Inactive")
            @unknown default: break
            }
        }
    }
}

我希望每当我按 Home 或点击应用程序时,模拟器或我的测试设备上都会收到打印命令,但什么也没有发生。


我承认这个问题具体是关于schenePhase但是,在 macOS 上我无法收到任何更改.background当用户切换到不同的应用程序时发出通知。年龄较大的NotificationCenter策略在两个平台上都按我的预期运作。我会将其添加到任何只是尝试执行某些代码的人的组合中,onForeground / onBackground on iOS and macOS.

在任何视图上,您​​都可以附加:

.onReceive(NotificationCenter.default.publisher(for: .willResignActiveNotification)) { _ in
    doBackgroundThing()
}

您可能关心的事件有:

  • iOS: willResignActiveNotification & willEnterForegroundNotification
  • macOS: willResignActiveNotification & willBecomeActiveNotification

你都可以找到NotificationCenter Names here.

I use will*背景的变体,因为我假设它们会在过程的早期被调用,并且我使用did*前台的变体,因为无论应用程序是首次启动还是从后台启动,都会调用它们。

我使用这个扩展,所以我不必考虑平台差异:

extension View {
    #if os(iOS)
    func onBackground(_ f: @escaping () -> Void) -> some View {
        self.onReceive(
            NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification),
            perform: { _ in f() }
        )
    }
    
    func onForeground(_ f: @escaping () -> Void) -> some View {
        self.onReceive(
            NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification),
            perform: { _ in f() }
        )
    }
    #else
    func onBackground(_ f: @escaping () -> Void) -> some View {
        self.onReceive(
            NotificationCenter.default.publisher(for: NSApplication.willResignActiveNotification),
            perform: { _ in f() }
        )
    }
    
    func onForeground(_ f: @escaping () -> Void) -> some View {
        self.onReceive(
            NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification),
            perform: { _ in f() }
        )
    }
    #endif
}

正如预期的那样,我这样使用它:

AppView()
   .onBackground {
       print("my background")
   }
   .onForeground {
       print("my foreground")
   }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未接收场景相位变化 的相关文章

随机推荐

  • 为什么预处理器在 #include 指令中的行为与在 [Files] 部分 Inno Setup 脚本中的行为不同

    在使用宏搜索和查找文件时 试图了解 Inno Setup 脚本中包含另一个脚本文件和源文件的语法之间的区别 我尝试过使用FindFolder函数来自在 Inno Setup 中使用通配符查找目录 define FindFolder Path
  • 为什么两次调用 setState 会导致一次状态更新?

    这可能是初学者的 React 错误 但我想使用 add2Messages 调用 addMessage 两次 但它只注册一次 我猜这与 React 中的 hooks 工作方式有关 我该如何使其工作 export default functio
  • 根据另一个选择显示一个选择的下拉值

    我有一个 项目 表 如下所示 Project ID Client ID P1 C1 P2 C1 P3 C2 P4 C2 P5 C3 P6 C3 我有一个选择id 1 显示所有客户端 ID 我正在展示另一个选择id 2 显示分配给客户端 ID
  • 为任意数量的变量生成真值表的方法[重复]

    这个问题在这里已经有答案了 如何为这样的输入生成所有可能的真 假组合的真值表 a b c 我发现递归地思考它真的很难 例如 输入 a b 输出 a True b True a True b False a False b True a Fa
  • 使用 Count 查找出现的次数

    假设我有一个包含以下值的表 Ford Ford Ford Honda Chevy Honda Honda Chevy 所以我想构建以下输出 Ford 3 Honda 3 Chevy 2 它只需要列中每个元素的计数 我在列出唯一列时遇到问题
  • 使用 LIKE 进行 PDO 分页

    以下 PHP SQL 代码显示错误 可恢复的致命错误 类 PDOStatement 的对象无法转换为 home customer xxxx fetch data php 第 28 行中的字符串 我试图显示表格中的产品信息filter那里有两
  • igraph 对象下降时边或节点属性的累积值

    我有一个igraph object g由数据框制成df df lt data frame c 0 1 2 2 4 c 1 2 3 4 5 c 0 01 0 03 0 05 0 01 0 02 colnames df lt c parent
  • 从 Windows 8 应用商店应用程序中的驱动器/文件夹读取目录?

    有没有办法读取 Windows 8 应用商店应用程序中驱动器 文件夹中的所有目录 文件 我用谷歌搜索了一下 除了阅读已知的文件夹 文档 图片等 之外什么也没有 也许你们可以帮助我 Thanks 在 WinStore 应用程序中 对文件 文件
  • 如何更改节点console.log打印的宽度?

    我正在将二维数组打印到节点终端窗口 但宽度导致它们跨越多行 如何更改节点打印区域的宽度 这不能通过更改终端窗口的列或行来解决 https i stack imgur com XCWTT png 更新 问题是打印带有节点的数组 如果我打印一个
  • 如何在JavaScript中分块读取本地文件?

    假设我的本地硬盘上有一个大小为 500 字节的文件 我想从中读取前 100 字节 而不将整个文件加载到内存中 如何在 JavaScript 的帮助下实现这一点UniversalXPConnect 当然 仅限 Firefox 假设要读取 AS
  • 检查 List> 是否包含 List

    检查是否存在的最佳方法是什么List
  • 如何在 jQuery 中按值对子项进行排序

    我有一些带有我想要排序的跨度值的链接 http jsfiddle net rF7LR 在此示例中 我想按金额排序 HTML a class sort span amount span a div a class entrylink href
  • data.table中使用字符串以列表方式命名列

    我有一个无法在 data table 中正确解决的问题 我有以下数据 plouf lt data table ID rep LETTERS 1 10 each 10 plouf c paste0 X 1 10 lapply 1 10 fun
  • Retrofit 返回 LinkedTreeMap 而不是 JSON

    我正在使用 Retrofit 2 0 从返回 json 文本的 Web 服务读取数据 但在以下代码中响应是 LinkedTreeMap 我无法将其转换为 json 我的界面 public interface GeoAPIInterface
  • Ruby:将文本附加到文件的第二行

    我正在编写的 Ruby 脚本将每天早上运行 并将提取有关备份文件的信息并将其写入 csv 文件 该文件的第一行有列名称 我已经通过附加到文件末尾来使其工作 open curDir Backup Times csv a do f end 我想
  • 获取属性字符串中的链接范围

    我想找到属性文本中的链接范围 因此我可以仅将自定义下划线应用于相关单词 目前 下划线位于所有文本下方 我希望它仅位于链接下 代码有点复杂 因为请求的下划线是超级定制的 import UIKit class ViewController UI
  • Rails 3 中列名“type”的问题

    我的一个表中有一个名为 type 的列 当我尝试像 group type 一样访问它时 出现以下错误 super no superclass method type for
  • C# 和 SendMessage(键)不起作用

    我尝试向应用程序发送密钥 为了方便测试 我只使用记事本 代码如下所示 DllImport USER32 DLL EntryPoint SendMessageW SetLastError true CharSet CharSet Unicod
  • 如何查明Android设备是否有蜂窝无线电模块?

    我如何确定该设备确实具有 gsm cdma 或其他蜂窝网络设备 不仅仅是 WiFi 我不想检查当前连接的网络状态 因为设备此时可能处于离线状态 我不想通过 TelephonyManager act getSystemService Cont
  • 未接收场景相位变化

    我正在尝试执行一些我之前放入应用程序委托中的代码 例如在进入后台时保存我的托管对象上下文 我把电话放在 onChange对于 scenePhase 但我什么也没得到 这是一个示例项目 import SwiftUI main struct P