嗨,我会注意到如果我在应用程序后台添加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和App生命周期之间的关系?
另外,如果我让应用程序输入背景足够的时间,应用程序将退出,而不是再次打开应用程序,一切都很好。
******更新******
这是我使用的最终代码,它可以正常运行,没有崩溃但不确定是因为我是否修改了项目设置...这是很久以前的问题
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)
}
}
}
xpc是使用运行循环实现的,因此篡改运行环会中断您的XPC连接也就不足为奇了。