根据实验,可以实现后台3分钟时间或一直后台运行
// 三分钟版本
先在Info.plist里添加
Required background modes 的key,对应的值为location(其余的值查看上面的文档),经过试验,其实不添加这个也是可以后台运行的,但不知道Apple Store审核的时候会不会有问题...
private var bgTask = UIBackgroundTaskInvalid
func applicationDidEnterBackground(application:UIApplication) {
guard UIDevice.currentDevice().multitaskingSupportedelse {
return
}
bgTask = application.beginBackgroundTaskWithExpirationHandler({ () ->Void in
application.endBackgroundTask(self.bgTask)
self.bgTask =UIBackgroundTaskInvalid
})
}
当三分钟到了的时候系统就会回调下面这个闭包,闭包里的代码就是停掉后台
{ () -> Void in
application.endBackgroundTask(self.bgTask)
self.bgTask = UIBackgroundTaskInvalid
}
在这三分钟内就可以放心的做你想做的事,我们添加一个定时器试试。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool
在上面的函数里面添加:
NSTimer.scheduledTimerWithTimeInterval(0.3, target:self, selector: "testBg", userInfo:nil, repeats: true)
在它外面添加:
func testBg() {
print("re:\(UIApplication.sharedApplication().backgroundTimeRemaining)")
}
这样就能打印后台的剩余时间了...
//时间自控制版本,定时器还是写在didFinishLaunchingWithOptions里,不同的是当三分钟时间到了的时候我们啥也不干(给闭包传入nil),这样玩的结果是定时器仍然还在打印,也就是说程序在后台还在运行。直到程序重新激活(进入前台)的时候再停掉后台面,这样就能实现自己控制后台时长了。
func testBg() {
print("re:\(UIApplication.sharedApplication().backgroundTimeRemaining)")
}
private var bgTask = UIBackgroundTaskInvalid
func applicationDidEnterBackground(application:UIApplication) {
guard UIDevice.currentDevice().multitaskingSupportedelse {
return
}
bgTask = application.beginBackgroundTaskWithExpirationHandler(nil)
}
func applicationWillEnterForeground(application:UIApplication) {
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
}