iOS 使用新的隐私设置强制重启应用程序
App is forced to restart by iOS with new privacy settings
如果用户更改相机权限,应用程序会在后台崩溃并显示来自调试器的消息:由于信号 9 而终止。
他们现在可以打开应用程序并且权限是正确的,但他们需要从头开始。有谁知道如何解决这个问题?
我需要提示用户通过 UIAlertController 更改我的应用程序的相机权限。警报具有以下操作:
alert.addAction(UIAlertAction(title: "Open Settings", style: .default, handler: { (action) -> Void in
guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
DispatchQueue.main.async(execute: {
UIApplication.shared.openURL(settingsUrl)
})
}
}))
这不是您的应用程序的问题。这正是苹果设计的方式 iOS。 iOS 当用户更改某些权限时将终止应用程序。
实际上,在切换设置时您会收到一条 SIGKILL 消息,但不会收到崩溃日志。在这种情况下甚至 applicationWillTerminate
都没有被调用!
所以答案是你无法修复它。
查看第 24 页 this slide
根据 Apple 隐私政策 iOS 6 之后的数据隔离:
- 建立在沙盒之上
- iOS
收集的用户权限
- 未经用户许可禁止访问数据
- 如果权限发生变化,应用将退出
- 调用后台任务过期处理程序,如果已注册
- iOS 然后终止应用程序
如果用户更改相机权限,应用程序会在后台崩溃并显示来自调试器的消息:由于信号 9 而终止。
他们现在可以打开应用程序并且权限是正确的,但他们需要从头开始。有谁知道如何解决这个问题?
我需要提示用户通过 UIAlertController 更改我的应用程序的相机权限。警报具有以下操作:
alert.addAction(UIAlertAction(title: "Open Settings", style: .default, handler: { (action) -> Void in
guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
DispatchQueue.main.async(execute: {
UIApplication.shared.openURL(settingsUrl)
})
}
}))
这不是您的应用程序的问题。这正是苹果设计的方式 iOS。 iOS 当用户更改某些权限时将终止应用程序。
实际上,在切换设置时您会收到一条 SIGKILL 消息,但不会收到崩溃日志。在这种情况下甚至 applicationWillTerminate
都没有被调用!
所以答案是你无法修复它。
查看第 24 页 this slide
根据 Apple 隐私政策 iOS 6 之后的数据隔离:
- 建立在沙盒之上
- iOS 收集的用户权限
- 未经用户许可禁止访问数据
- 如果权限发生变化,应用将退出
- 调用后台任务过期处理程序,如果已注册
- iOS 然后终止应用程序