嗨我注意到,当app进入后台时会添加runloop会导致XPC连接中断
例如,我的应用程序连接到BLE设备,如果用户让应用程序进入后台一段时间,我将退出应用程序而不是释放连接
这是我的代码
func applicationDidEnterBackground(_ application: UIApplication) {
isInBackground = true
timer = Timer.scheduledTimer(timeInterval: 300 , target: self, selector: #selector(self.quitApp), userInfo: nil, repeats: false)
RunLoop.current.add(timer, forMode: .commonModes)
RunLoop.current.run()
}
func quitApp() {
if isInBackground == true {
print("QUIT APP")
exit(0)
}
}
func applicationWillEnterForeground(_ application: UIApplication) {
timer.invalidate()
isInBackground = false
}
但每次进入前景时,我都会发现是否删除了
中的runloopfunc applicationDidEnterBackground
该应用将运行
func applicationDidBecomeActive
or
func applicationWillEnterForeground
但是如果我添加Runloop,它将导致
XPC连接中断
我不明白Runloop和应用程序生命周期之间的关系???
此外,如果我让应用程序进入后台足够的时间,应用程序将退出,而不是再次打开应用程序一切都很好。
******更新******
这是我使用的最终代码,它工作正常,没有崩溃 但不确定是因为我修改了我的项目设置...... 这是一个很久以前的问题
func applicationDidEnterBackground(_ application: UIApplication) {
//Quit if Enter background 5 min
isInBackground = true
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(quitApp), userInfo: nil, repeats: true)
timer.fire()
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
let app = UIApplication.shared
var bgTask:UIBackgroundTaskIdentifier? = UIBackgroundTaskInvalid
bgTask = app.beginBackgroundTask{ () -> Void in
DispatchQueue.main.async{
if bgTask != UIBackgroundTaskInvalid{
bgTask = UIBackgroundTaskInvalid
}
}
}
}
func applicationDidBecomeActive(_ application: UIApplication) {
timer.invalidate()
isInBackground = false
backgroundCount = 0
}
@objc func quitApp() {
if backgroundCount < 300 {
backgroundCount += 1
}else {
if isInBackground == true {
exit(0)
}
}
}
答案 0 :(得分:0)
XPC是使用运行循环实现的,因此篡改运行循环会中断您的XPC连接并不会太令人惊讶。