iOS perform action after period of inactivity (no user interaction)

前端 未结 6 1999
慢半拍i
慢半拍i 2020-11-28 01:46

How can I add a timer to my iOS app that is based on user interaction (or lack thereof)? In other words, if there is no user interaction for 2 minutes, I want to have the ap

6条回答
  •  清酒与你
    2020-11-28 02:11

    Swift 3 example here

    1. create a class like .

       import Foundation
       import UIKit
      
       extension NSNotification.Name {
           public static let TimeOutUserInteraction: NSNotification.Name = NSNotification.Name(rawValue: "TimeOutUserInteraction")
         }
      
      
        class InterractionUIApplication: UIApplication {
      
        static let ApplicationDidTimoutNotification = "AppTimout"
      
        // The timeout in seconds for when to fire the idle timer.
         let timeoutInSeconds: TimeInterval = 15//15 * 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)
         // print("3")
        if idleTimer != nil {
           self.resetIdleTimer()
       }
      
          if let touches = event.allTouches {
             for touch in touches {
                if touch.phase == UITouchPhase.began {
                  self.resetIdleTimer()
               }
           }
        }
      }
       // Resent the timer because there was user interaction.
      func resetIdleTimer() {
        if let idleTimer = idleTimer {
          // print("1")
           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.
         func idleTimerExceeded() {
            print("Time Out")
      
         NotificationCenter.default.post(name:Notification.Name.TimeOutUserInteraction, object: nil)
      
           //Go Main page after 15 second
      
          let appDelegate = UIApplication.shared.delegate as! AppDelegate
         appDelegate.window = UIWindow(frame: UIScreen.main.bounds)
          let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
         let yourVC = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        appDelegate.window?.rootViewController = yourVC
        appDelegate.window?.makeKeyAndVisible()
      
      
         }
      }
      
    2. create another class named main.swift paste bellow code

      import Foundation
         import UIKit
      
         CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer.self, capacity: Int(CommandLine.argc))
          {    argv in
                  _ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(InterractionUIApplication.self), NSStringFromClass(AppDelegate.self))
              }
      
    3. don't forget to Remove @UIApplicationMain from AppDelegate

    4. Swift 3 complete source code is given to GitHub. GitHub link:https://github.com/enamul95/UserInactivity

提交回复
热议问题