关于 applicationDidBecomeActive 和 applicationWillEnterForeground 的混淆
Posted
技术标签:
【中文标题】关于 applicationDidBecomeActive 和 applicationWillEnterForeground 的混淆【英文标题】:Confusion about applicationDidBecomeActive and applicationWillEnterForeground 【发布时间】:2015-02-09 02:11:03 【问题描述】:我对上述两种应用程序委托方法有些困惑:我读过这个link,它表明 applicationWillEnterForeground 将在 applicationDIdBecomeActive 被调用之前被调用。我不确定之前的方法。
如果我有一个社交应用程序:在我的 applicationWillEnterForeground 函数中,我将检查是否存在当前用户会话;在我的应用程序DIIdBecomeActive 中,我将重新加载timelineViewController 上的内容:因此,如果没有当前用户会话,则无法显示时间线。假设用户在没有当前用户会话的情况下从后台进入应用程序,applicationWillEnterForeground 将显示一个登录页面以指示没有用户,但是,下一个调用的 applicationDIdBecomeActive 会返回到不应该显示的时间线吗?
如果我不想修改其他视图控制器中的代码,或者在 applicationDIdBecomeActive 中检查用户会话。我可以在 applicationWillEnterForeground 函数中添加任何代码来防止 applicationDIdBecomeActive 函数运行吗?
另一个问题:我注意到对于像 Facebook 这样的应用程序,如果我按下主页按钮,将其转为背景,但立即将其转回屏幕,该应用程序不会显示很多变化;但是,如果我让它在后台停留一个小时,当我把它转回前台时,它会“冻结”一段时间(看起来很清爽)。委托方法如何设计来实现这一点?系统是否根据应用在后台停留的时间来决定调用哪个委托方法(以上两种)?
顺便说一句,我使用 swift 作为 ios 的主要编程语言
【问题讨论】:
【参考方案1】:您无法阻止applicationDidBecomeActive
被调用。
您可以在applicationWillEnterForeground
中设置一个实例变量,稍后读取该变量以确定您的应用程序使用的流程。
【讨论】:
另一个问题:我注意到对于像 Facebook 这样的应用程序,如果我按下主页按钮,将其转为背景,但立即将其转回屏幕,该应用程序不会显示很多变化;但是,如果我让它在背景中停留一个小时,当我将其转回前景时,它会“冻结”一段时间(看起来很清爽)。委托方法如何设计来实现这一点?系统是否根据应用在后台停留的时间来决定调用哪个委托方法?【参考方案2】:要在 Facebook 等特定时间间隔后刷新或启动 VC 您的应用,您可以执行以下操作:
在 applicationDidEnterBackground 中
let app = UserDefaults.standard
let date = Date()
app.set(date, forKey: "activeDate")
在应用程序WillEnterForeground中
let user = UserDefaults.standard
var interval = 0
if let date = user.object(forKey: "activeDate") as? Date
interval = Int(Date().timeIntervalSince(date)); print ( "AppDeligate: Inactive interval: \(interval)")
if interval > 7200 // 2hr
// Initiate VC OR Refresh data here
如果您检查 applicationDidBecomeActive 中的时间间隔,则当您通过向下滑动或向上滑动查看控制中心通知时,应用程序会启动或刷新数据。所以 applicationWillEnterForeground 是最好的地方。
【讨论】:
以上是关于关于 applicationDidBecomeActive 和 applicationWillEnterForeground 的混淆的主要内容,如果未能解决你的问题,请参考以下文章