在后台运行计时器

时间:2017-05-30 14:31:57

标签: ios swift nstimer

在iOS系统应用时钟中,当我启动计时器或秒表,退出应用程序,终止并重新打开它时,计时器或秒表仍在运行。

如何在后台运行timer? Apple是如何做到的?

3 个答案:

答案 0 :(得分:6)

可以通过令牌识别在后台运行的请求 像这样:var bgTask = UIBackgroundTaskIdentifier()

以下是如何使用它:

var bgTask = UIBackgroundTaskIdentifier()
    bgTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        UIApplication.shared.endBackgroundTask(bgTask)
    })
    let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(notificationReceived), userInfo: nil, repeats: true)
    RunLoop.current.add(timer, forMode: RunLoopMode.defaultRunLoopMode)

我希望它会有用!

答案 1 :(得分:0)

将此代码添加到appdelagate.swift中

var backgroundUpdateTask:UIBackgroundTaskIdentifier = 0

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    return true
}

func applicationWillResignActive(application: UIApplication) {
    self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
        self.endBackgroundUpdateTask()
    })
}

func endBackgroundUpdateTask() {
    UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

func applicationWillEnterForeground(application: UIApplication) {
    self.endBackgroundUpdateTask()
}

答案 2 :(得分:-1)

当您关闭应用程序时,将当前计时器和时钟值存储在UserDefault内的long属性中,以秒或毫秒为单位。我使用的是我可以分享的通用版本:

static let userDefaults = UserDefaults.standard

    public static func set<T: Hashable> (withValue value: T, andKey key: String) {
        userDefaults.set(value, forKey: key)
        userDefaults.synchronize()
    }
    public static func get(forKey key: String) -> Any? {
        if((userDefaults.object(forKey: key)) != nil){
            let data = userDefaults.object(forKey: key) as? Any
            return data
        }
        return nil
    }

再次启动应用程序时,请使用&#34; get&#34;得到的方法;让我们说秒和存储时间。然后,您可以将当前时间与存储的时间进行比较,并计算两者之间的秒数,并将时间差与存储的秒数相加,您只需将计时器设置为显示的值并保持运行。

以下是关闭应用程序时的设置方法:

NotificationCenter.default.addObserver(self, selector: #selector(storeTime), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)

func storeTime() {
     "UserDefaultClassName".set(withValue: "preferably dictionary", andKey: String)
}