在iOS系统应用时钟中,当我启动计时器或秒表,退出应用程序,终止并重新打开它时,计时器或秒表仍在运行。
如何在后台运行timer
?
Apple是如何做到的?
答案 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)
}