Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何判断我的应用程序是否已暂停?_Ios_Objective C - Fatal编程技术网

Ios 如何判断我的应用程序是否已暂停?

Ios 如何判断我的应用程序是否已暂停?,ios,objective-c,Ios,Objective C,我对iOS状态管理的理解是,当用户点击home(主页)按钮时,应用程序变为非活动状态,然后进入后台,几秒钟后暂停。如果系统需要释放内存,或者用户将应用程序从最近列表中刷走,则暂停的应用程序将被终止 我的问题是,有没有办法告诉我我的应用程序已离开后台状态并进入挂起状态?我知道应用程序委托方法,如applicationIdentinterbackground等,但有没有办法告诉我应用程序已挂起?我认为被停职与被终止是不同的,对吗 我问这个问题的背景是,我正在创建一个音频播放器应用程序。我已经在Inf

我对iOS状态管理的理解是,当用户点击home(主页)按钮时,应用程序变为非活动状态,然后进入后台,几秒钟后暂停。如果系统需要释放内存,或者用户将应用程序从最近列表中刷走,则暂停的应用程序将被终止

我的问题是,有没有办法告诉我我的应用程序已离开后台状态并进入挂起状态?我知道应用程序委托方法,如
applicationIdentinterbackground
等,但有没有办法告诉我应用程序已挂起?我认为被停职与被终止是不同的,对吗

我问这个问题的背景是,我正在创建一个音频播放器应用程序。我已经在
Info.plist
中启用了后台音频,因此当播放音频时,我按下home按钮,我可以看到应用程序无限期地保留在后台(这很好)。然而,当音频未播放时,没有必要将应用程序保留在后台,据我所知,应用程序应该挂起。我希望能够检查这是否正在发生


非常感谢-请纠正我的任何误解。

您没有收到关于暂停的通知:

“挂起:应用程序处于后台,但未执行代码。系统会自动将应用程序移动到此状态,并且不会在执行此操作之前通知它们。挂起时,应用程序保留在内存中,但不会执行任何代码。”


当内存不足时,系统可能会在不通知的情况下清除挂起的应用程序,以便为前台应用程序腾出更多空间。”

iOS不会报告应用程序何时挂起(从后台进入非处理状态),也不会在应用程序恢复后发出通知。关于这一点存在一些混淆,因为当应用程序变为“活动”或将退出“活动”状态时会发出通知,但这并不总是所需的正确值。iOS应用程序有许多状态:

  • 处于活动状态:应用程序位于前台(最前面),没有任何通知或菜单。下拉菜单或收到外部通知或文本消息将导致应用程序“退出”活动,并在处理警报后恢复活动
  • 背景:应用程序不在前台,但仍在处理中。如果没有后台任务正在运行,则在挂起之前会短暂发生这种情况;如果后台模式(音频、位置等)正在长时间运行,则这种情况可能是永久状态
  • 挂起:应用程序在内存中,但运行循环和处理暂停
  • 终止:应用程序未运行或内存不足,已被用户(强制退出)或操作系统(释放内存)退出,或从未启动
为了捕获应用程序何时被挂起,您必须捕获应用程序何时被放入后台,并使用
backgroundTimeRemaining
等值来估计何时会发生挂起。实际暂停只能作为运行循环处理中的“间隙”进行计算,这可以通过计划的循环计时器和减法来完成。我已为此创建了一个帮助器类:

导入UIKit
进口基金会
内部扩展通知。名称{
静态let applicationWillSuspend=Notification.Name(“应用程序将暂停”)
///此通知在事件发生后调用,但'object'参数设置为挂起发生时的'Date'
静态let applicationDidSuspend=Notification.Name(“应用程序已挂起”)
静态let applicationdidunspend=Notification.Name(“应用程序未暂停”)
静态let suspendStatusRecorderFailed=Notification.Name(“挂起状态记录器失败”)
}
内部类SuspendStatusRecorder{
私有变量计时器:计时器?
专用var任务:UIBackgroundTaskIdentifier=UIBackgroundTaskIdentifier.invalid
///开始监视挂起
///-参数stallThreshold:报告暂停事件前未处理的秒数
内部函数开始(){
停止()//如果已经开始。
startTask()
设timer=timer(timeInterval:1,repeats:true){[weak self](u)in
self?.checkStatus()
}
RunLoop.main.add(计时器,forMode:.common)
}
内部函数停止(){
如果let timer=timer{
timer.invalidate()
self.timer=nil
}
结束任务()
}
私有变量lastPing:Int=0
私有函数将过期(){
endTask()//允许应用程序挂起
NotificationCenter.default.post(名称:.applicationWillSuspend,对象:nil)
expectingSuspend=true
}
///设置一个正常运行时间值,用于根据BackgroundTimeRequireming将应用程序挂起的时间
私有变量expectingSuspend=false
私有函数检查状态(){
让ping=正常运行时间()
如果期待暂停{
如果ping-lastPing>3||
UIApplication.shared.applicationState==.active
{
//计时器暂停,CPU故障或我们被挂起。
NotificationCenter.default.post(名称:.ApplicationIDSuspend,对象:日期(timeIntervalSinceNow:TimeInterval(lastPing-ping)))
NotificationCenter.default.post(名称:.ApplicationIDUnPend,对象:nil)
expectingSuspend=false
startTask()//新的后台任务,这样我们可以确保捕获下一个事件
}
}
lastPing=正常运行时间()
//在后台,时间即将到期(导致挂起)、报告和结束任务
如果UIApplication.shared.applicationState==.background&&
UIApplication.shared.backgroundTimeRemaining!=Double.greatestfinitemagnity&&
助教