ios - 在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖

标签 ios iphone swift navigation screensaver

如何在 iOS 应用中检测不活动或没有用户交互。用于显示单独的屏幕,如覆盖或屏幕保护程序。
通过以下链接
link that used to present screen overlay when the app became inactive
我可以在应用程序中显示屏幕保护程序。但是正常的关闭 View Controller 代码无法关闭呈现的 View Controller 。

 we are presenting the custom overlay using

// The callback for when the timeout was fired.
    func applicationDidTimout(notification: NSNotification) {

       let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
              let vc = 
 storyboard.instantiateViewControllerWithIdentifier("myStoryboardIdentifier")
        UIApplication.shared.keyWindow?.rootViewController = vc       
    }

我们在这方面面临的问题是。一旦呈现 View ,我们就无法关闭或删除 View Controller 。

最佳答案

来自@Prabhat Kesara 的评论和@Vanessa Forney 在帮助链接中的回答。我提供了以下解决方案,它工作正常。如果有人提出这样的要求,他们可以使用这个

import UIKit
import Foundation

extension NSNotification.Name {
    public static let TimeOutUserInteraction: NSNotification.Name = NSNotification.Name(rawValue: "TimeOutUserInteraction")
}

class UserInterractionSetup: UIApplication {

    static let ApplicationDidTimoutNotification = "AppTimout"

    // The timeout in seconds for when to fire the idle timer.

    let timeoutInSeconds: TimeInterval = 1 * 60 //5 * 60 //

    var idleTimer: Timer?

    // Listen for any touch. If the screen receives a touch, the timer is reset.

    override func sendEvent(_ event: UIEvent) {

        super.sendEvent(event)


        if idleTimer != nil {

            self.resetIdleTimer()

        }

        if let touches = event.allTouches {

            for touch in touches {

                if touch.phase == UITouch.Phase.began {

                    self.resetIdleTimer()

                }

            }

        }

    }


    // Resent the timer because there was user interaction.

    func resetIdleTimer() {

        if let idleTimer = idleTimer {

            // print("1")

            let root = UIApplication.shared.keyWindow?.rootViewController

            root?.dismiss(animated: true, completion: nil)

            idleTimer.invalidate()

        }


        idleTimer = Timer.scheduledTimer(timeInterval: timeoutInSeconds, target: self, selector: #selector(self.idleTimerExceeded), userInfo: nil, repeats: false)

    }

    // If the timer reaches the limit as defined in timeoutInSeconds, post this notification.

    @objc func idleTimerExceeded() {

        print("Time Out")
         NotificationCenter.default.post(name:Notification.Name.TimeOutUserInteraction, object: nil)

        let screenSaverVC = UIStoryboard(name:"ScreenSaver", bundle:nil).instantiateViewController(withIdentifier:"LandingPageViewController") as! LandingPageViewController

        if let presentVc = TopMostViewController.sharedInstance.topMostViewController(controller: screenSaverVC){


            let root: UINavigationController = UIApplication.shared.keyWindow!.rootViewController as! UINavigationController

            if let topView = root.viewControllers.last?.presentedViewController {

                topView.dismiss(animated: false) {

                    root.viewControllers.last?.navigationController?.present(presentVc, animated: true, completion: nil)

                }

            }else if let topViewNavigation = root.viewControllers.last {

                topViewNavigation.navigationController?.present(presentVc, animated: true, completion: nil)



            }

        }

    }

}

我面临的困难是在已经呈现的 View 上方呈现叠加层或屏幕保护程序。这种情况,我们也在上面的解决方案中处理。
快乐编码:)

关于ios - 在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53389572/

相关文章:

iOS 应用程序具有奇怪的结构

iphone - TableView问题...如何知道行号

iphone - 在iPhone中绘制空心圆

ios - 如何从 tableView 方法中的请求中获取行数?

swift - 无法基于检查挂接到另一个 RxSwift 流

iOS 应用程序 API 调用被应用程序传输安全阻止

ios - [__NSCFArrayremoveObjectAtIndex :]: mutating method sent to immutable object'

ios - 应用内购买我错过了什么? [ swift ]

iphone - Siri 的语音字段

ios - 在 PageViewController 中进行漂亮的过渡