首页 > 解决方案 > Swift / SwiftUI - 在设备锁定/置于后台之前执行功能?

问题描述

我正在开发一个记录视频片段的应用程序(请参阅 Instagram 的卷轴以供参考),并且我目前正在处理应用程序移动到背景/屏幕被锁定时的状态。

我目前遇到的问题是,如果我将应用程序移到后台/在正在进行的视频录制期间锁定屏幕,则 AVCaptureFileOutputRecordingDelegate 的 fileOutput 方法无法保存视频。我尝试在 .plist 中添加“必需的背景模式”,我还偶然发现了以下线程,现在我不确定当应用程序移动到时是否可以实际保存正在进行的视频录制背景,以及如果您想遵守隐私准则,这样做是否是个好主意。

我想知道是否有一种方法可以延迟将应用程序移至后台,以便我可以执行通常用于在设备最终进入后台之前停止和保存视频录制的方法(最终失败为我保存视频的过程)。

注意:将我保存/停止正在进行的视频录制的方法放在以下观察中不起作用,它会如上所述失败:

.onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
                print("Moving to the background!")
            toggleRecording() <--- this normally stops and saves the recording but it fails here.
            }

感谢您提供的任何输入!

标签: iosswiftiphoneswiftuinotificationcenter

解决方案


研究场景协议。

我引用...

Scene 协议提供了场景修改器,定义为具有默认实现的协议方法,您可以使用它们来配置场景。例如,您可以使用 onChange(of:perform:) 修饰符在值更改时触发操作。当窗口组中的所有场景都移到后台时,以下代码会清空缓存:

并且要清楚这是Apple提供的示例......

struct MyScene: Scene {
    @Environment(\.scenePhase) private var scenePhase
    @StateObject private var cache = DataCache()

    var body: some Scene {
        WindowGroup {
            MyRootView()
        }
        .onChange(of: scenePhase) { newScenePhase in
            if newScenePhase == .background {
                cache.empty()
            }
        }
    }
}

对于您的情况,您可以将cache.empty命令替换为toggleRecording().


推荐阅读