最近重新看iOS的开发,确实有一些新的发现:
1、短时间常驻(3分钟):
比较简单,在AppDelegate里进行后台任务申请
var backgroundTask:UIBackgroundTaskIdentifier! = nil
申请一个任务ID
func applicationDidEnterBackground(_ application: UIApplication) {}
该方法在进入后台时响应
//如果已存在后台任务,先将其设为完成
if self.backgroundTask != nil {
application.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskInvalid
}
//注册后台任务
self.backgroundTask = application.beginBackgroundTask(expirationHandler: {
() -> Void in
//如果没有调用endBackgroundTask,时间耗尽时应用程序将被终止
application.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskInvalid
})
runBackgroundTask() //要进行的后台任务
缺陷是只能运行180秒
2、后台常驻的时间
一般有刷新定位和播放音乐两种方式,这里试验了播放音乐方式
tips:不需要1中的注册任务方法
var audioPlayer:AVAudioPlayer!
声明player
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// 注册后台播放
let session = AVAudioSession.sharedInstance()
do {
try session.setActive(true)
try session.setCategory(AVAudioSessionCategoryPlayback)
} catch {
print(error)
}
return true
}
func applicationDidEnterBackground(_ application: UIApplication) {
playMusic()
//定时任务主要是打印剩余时间
var timer:Timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true, block: {
(timer) in
let timeRemaining = UIApplication.shared.backgroundTimeRemaining
print("time left: \(timeRemaining)")
})
}
func playMusic(){
print("play music")
do{
try self.audioPlayer = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: Bundle.main.path(forResource: "MAMI", ofType: "mp3")!) as URL)
}catch let error as NSError{
print(error.localizedDescription)
}
//audioPlayer.volume = 0
//-1无限循环播放
//audioPlayer.numberOfLoops = -1
audioPlayer.play()
}
说明: playMusic() 执行后,进入后台不会中止定时器,因此可以在APP启动的时候就 playMusic(),那么定时器无论处于前台还是后台,都会正常执行!
----------------------
在APP启动时播放音乐和启动定时器,长时间运行后存在这样的问题:定时器的网络请求代码会被暂停,直到转入前台后才执行,也就是造成延迟