首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》24.9 深入学习:设置快照

关灯直达底部

本章之前介绍过,当应用进入后台运行时,系统会生成当前界面的快照。但是,在某些情况下,系统生成的快照并不符合需求。用户在多任务界面以及下一次启动应用时都可以看到快照,如果应用展示了用户敏感数据(例如一个银行客户端,展示了用户的银行卡号和财务信息),就不能使用展示敏感数据的界面作为快照,否则,非机主本人进入多任务界面或启动应用时,也可以看到敏感数据。

除数据安全性外,还可以通过快照提示用户应用已经进入后台运行状态。例如系统自带的相机(Camera)应用,当应用进入后台运行状态时,应用会“冻结”镜头,并添加毛玻璃效果,避免用户认为应用仍然在等待拍摄。

为了手动设置快照,需要在系统生成快照之前修改界面内容,也就是应用进入未激活状态之前。第18章是通过实现UIApplicationDelegate协议方法观察应用生命周期变化的,而在视图控制器中,可以注册对应的通知,并在收到通知后的回调方法中修改界面内容。

例如,可以观察UIApplicationWillResignActiveNotification通知,生成需要的快照;同时观察UIApplicationDidBecomeActiveNotification通知,当用户返回应用时执行相应的操作(例如,要求用户重新登录,或者“解冻”镜头,让用户继续拍摄)。

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

[nc addObserver:self

selector:@selector(applicationResigningActive:)

name:UIApplicationWillResignActiveNotification

object:nil];

[nc addObserver:self

selector:@selector(applicationBecameActive:)

name:UIApplicationDidBecomeActiveNotification

object:nil];

- (void)applicationResigningActive:(NSNotification *)note

{

// 修改界面内容,生成需要的快照

}

- (void)applicationBecameActive:(NSNotification *)note

{

// 返回应用时执行的操作

}

最后,如果不需要让用户在下一次启动应用时看到快照,可以向UIApplication单例发送ignoreSnapshotOnNextApplicationLaunch消息,忽略快照。例如,当应用无法连接网络,向用户提示错误信息时,就应该忽略快照,因为用户在返回应用时可能已经连接了网络。这时应用会使用启动图代替快照。

// 在保存应用状态的代码中添加下行代码

[[UIApplication mainApplication] ignoreSnapshotOnNextApplicationLaunch];