Как представить UIViewController через некоторое время в фоновом режиме в Swift?

У меня есть это приложение, которое будет отображать экран пароля, когда приложение вернется из фонового режима или будет запущено во второй раз, а также все остальные, которые последуют за ним.

Но мне нужно быть представленным только в том случае, если приложение было в фоновом режиме не менее 30 секунд и не меньше.

Как я могу это сделать?

Код, который мне нужно загрузить, на экране кода доступа находится в AppDelegate.swift:

func applicationDidBecomeActive(application: UIApplication) {
    //Load lock screen
    let topController = self.topViewControllerWithRootViewController(UIApplication.sharedApplication().delegate?.window??.rootViewController)

    let userDefaults = NSUserDefaults.standardUserDefaults()
    let displayedWalkthrough = userDefaults.boolForKey("Walk")

    if displayedWalkthrough {
        let main : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let lockVC = main.instantiateViewControllerWithIdentifier("LockVC") as! LockVC
        topController.presentViewController(lockVC, animated: true, completion: nil)

    } else {
    }
} 

person Marco Almeida    schedule 29.04.2016    source источник


Ответы (1)


Лучше всего создать фоновую задачу и через 30 секунд установить флаг, который вы прочитали в applicationDidBecomeActive(). Вам нужно будет использовать beginBackgroundTaskWithExpirationHandler, здесь. Например (сделайте task глобальным):

При входе в фон:

func applicationDidEnterBackground(application: UIApplication) {
    task = application.beginBackgroundTaskWithExpirationHandler({})
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(30 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
        NSUserDefaults.standardUserDefaults.setBool(true, forKey: "lock")
    }
    application.endBackgroundTask(task)
}

При запуске:

func applicationDidBecomeActive(application: UIApplication) {
    if NSNSUserDefaults.standardUserDefaults.boolForKey("lock") {
        // show lock
    }
    application.endBackgroundTask(task)
    NSUserDefaults.standardUserDefaults.setBool(true, forKey: "lock")
    // rest of your code
}
person saagarjha    schedule 06.06.2016