iOS-Swift UI应用程序.shared.isIdleTimerDisabled =真在AppStore审查后不工作

qlfbtfca  于 2023-01-16  发布在  Swift
关注(0)|答案(4)|浏览(253)

尝试实现阻止屏幕在某些View Controller上进入睡眠状态
我做了什么我用以下代码在运行iOS 12.1.12的实体iPhone 6上测试了我的应用。我将手机Dislpay & Brigthness > Auto-Lock设置为30秒。我运行了应用,并在运行UIApplication.shared.isIdleTimerDisabled = true的特定VC上运行,屏幕甚至在30秒后仍然打开。当我切换到不运行UIApplication.shared.isIdleTimerDisabled = true的其他VC时,屏幕将在30秒后关闭。

我分发到AppStore,我敢肯定,我已经上传了正确的版本,并从AppStore下载了一个新的副本,屏幕总是在东西根本不工作,屏幕将始终关闭以下Auto-Lock设置.
我读过一些文章https://docs.kioskproapp.com/article/899-ios-12-with-guided-access-causing-kiosk-pro-to-sleepisIdleTimerDisabled not working in iOS 12
我试了Guided Access,打开了Guided AccessMirror Display Auto-Lock > ON,仍然不能用于AppStore的应用程序,请帮助。

代码

override func viewDidLoad() {

    super.viewDidLoad()
    //==== For the screen to remains on
    UIApplication.shared.isIdleTimerDisabled = true
}

override func viewDidDisappear(_ animated: Bool) {

    //=== Switch off the screen always on, back to the phone settings. 
    UIApplication.shared.isIdleTimerDisabled = false
}
ljo96ir5

ljo96ir51#

我在iOS 13上也遇到了同样的问题。我发现这个great article解释了为什么.isIdleTimerDiabled看起来不起作用。
总之,由于iOS 13引入了SceneDelegate,仅仅在AppDelegate中将.isIdleTimerDisabled设置为false是不够的,还需要在SceneDelegate中设置

class SceneDelegate: NSObject, UIWindowSceneDelegate {
    var window: UIWindow?
    
    @available(iOS 13.0, *)
    func sceneDidBecomeActive(_ scene: UIScene) {
        UIApplication.shared.isIdleTimerDisabled = true
    }
}

上面的代码使我的应用程序免疫自动锁定,但这只是一个快速肮脏的解决方案,一个更好的方法是切换isIdleTimerDisabled打开和关闭的基础上ViewController用户正在使用,下面是苹果的文档关于这个属性。
您应该设置此属性(isIdleTimerDisabled),并应确保在不再需要时将其重置为false。大多数应用应允许系统在空闲计时器超时时关闭屏幕。这包括音频应用。通过正确使用音频会话服务,当屏幕关闭时,播放和录制不间断地进行。唯一应该禁用空闲计时器的应用程序是Map应用程序,游戏,或者当用户交互最少时应用程序需要继续显示内容的程序。

oxf4rvwz

oxf4rvwz2#

我还想分享一下丹尼尔Hu提供的答案很棒,但是我有一个问题,为什么它在Xcode中运行时不工作。
测试提示:通过Xcode在调试器下运行应用程序会自动禁用空闲计时器。构建或测试应用程序时,请确保安装应用程序,然后在测试设备上“手动”启动。如果“自动锁定”设置为30秒,效果会最明显。

xu3bshqb

xu3bshqb3#

您必须从当前视图控制器打开另一个视图控制器。这会在viewDidDisappere调用时将isIdleTimerDisabled的值设置为false。因此,您应该在viewDidAppear中设置UIApplication.shared.isIdleTimerDisabled = true。希望这将解决您的问题。

xqnpmsa8

xqnpmsa84#

以下是如何从场景代理为iOS 13+上的SwiftUI应用程序设置isIdleTimerDisabled

import SwiftUI

@main
struct MyApp: App {
    @Environment(\.scenePhase) var scenePhase

    var body: some Scene {
        WindowGroup {
            MainView()
        }
        .onChange(of: scenePhase) { (phase) in
            switch phase {
            case .active:
                // In iOS 13+, idle timer needs to be set in scene to override default
                UIApplication.shared.isIdleTimerDisabled = true
            case .inactive: break
            case .background: break
            @unknown default: print("ScenePhase: unexpected state")
            }
        }
    }
}

相关问题