如何防止 iOS 应用程序在更改相机权限后重置?

How can I prevent iOS apps from resetting after changing Camera permissions?

目前,当我在“设置”中更改我的应用程序的相机权限,然后导航回我的应用程序时,应用程序将强制刷新,我将失去在应用程序中的位置。我完全遵循这些步骤

  1. 打开一个使用相机权限的应用。
  2. 导航到应用程序中的某个屏幕(以便稍后可以明显看到刷新)
  3. 转到“设置”应用,导航到应用的设置,然后切换 相机权限
  4. 双击主页并返回应用程序。 几秒钟后,它会刷新,带你回到 第一屏

注意:我使用的是 iPhone 6 运行 iOS 8.4

我在所有具有相机权限的应用程序上都注意到了这种行为。我的问题是: 有什么方法可以防止应用程序在更改相机权限后 refreshing/restarting(恢复时)? 当您切换位置服务时似乎不会发生这种情况,例如,从可用性的角度来看,这太可怕了。

用户场景:如果用户深入导航到您的应用,然后需要更改相机权限(因为说他们不小心点击了上次),他们将被迫当他们 return 时导航回该屏幕。这对于试图向您推销东西或为您注册新帐户的应用尤其有害。他们可能会尝试引入一项新功能,您可以使用相机拍摄个人资料照片或扫描信用卡。因为用户不知道这个功能,他们可能之前拒绝了摄像头访问,但现在想启用它。尝试重新启用后,他们回到您的应用程序,发现他们必须再次花费 5 分钟以上的时间注册/购买!之后估计连我都放弃了。

我确定没有其他方法可以防止重新启动应用程序。实际上,在切换设置时您会收到一条 SIGKILL 消息,但不会收到崩溃日志。请参阅以下链接-

防止这种情况的唯一方法是在终止时保存应用程序的先前状态。

  • 在 applicationWillTerminate: 方法和
  • 中将您当前的数据存储到 json/plist/NSUserDefaults/archive 用户模型中
  • 恢复保存在 applicationWillEnterForeground 的数据:

例如- @SignUpViewController 注册 UIApplicationWillTerminateNotification,它将在应用程序即将终止时触发。在那里存储用户信息。

- (void)viewDidLoad
{
 [super viewDidLoad];
 [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(applicationWillTerminate:)
    name: UIApplicationWillTerminateNotification object:nil];
}

- (void)applicationWillTerminate:(NSNotification *)notification
{
 // store your data here
}

希望这对您有所帮助:)

接受的答案是正确的,但是解决方法似乎在 iOS (9.2) 的当前版本中不起作用 - 应用程序似乎在 UIApplicationWillTerminateNotification 被触发之前终止。然而,通过监听 UIApplicationDidEnterBackgroundNotification,同样可以实现。例如在 Swift 中,将其放入 viewDidLoad()

NSNotificationCenter.defaultCenter().addObserver(self, selector: "enteringBackground:", name: UIApplicationDidEnterBackgroundNotification, object: nil)

并具有这样的功能:

func enteringBackground(sender:AnyObject){
    // Save application state here
}