当用户更改联系人访问权限时,应用程序在 iOS 6 中崩溃

Posted

技术标签:

【中文标题】当用户更改联系人访问权限时,应用程序在 iOS 6 中崩溃【英文标题】:App crashed in iOS 6 when user changes Contacts access permissions 【发布时间】:2012-10-10 01:17:03 【问题描述】:

我有一个使用通讯录的应用程序。在 ios 6 中运行时,它会在用户执行需要访问地址簿的操作时运行此代码。

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)

    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error)
    
        if (granted)
        
            showContactChooser();
        
    );

    CFRelease(addressBookRef);

else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)

    showContactChooser();

else

    showAccessDeniedAlert();

这非常有效:我能够读取联系人信息,并且当用户拒绝访问时,应用程序会做出相应反应。

但是,如果用户:

    允许联系人在应用中访问, 退出应用, 转到设置->隐私->联系人并禁用应用程序的联系人访问权限, 运行应用, 当应用在后台运行时,转到设置并启用应用的联系人访问权限,

应用程序立即在 main() 内崩溃,没有异常信息或有意义的堆栈跟踪。我尝试打开“所有异常”和[NSException raise] 断点,但这并没有给我更多信息。

即使应用在启动过程中没有运行上述代码,也可以重现崩溃。

这里发生了什么?是否有我应该订阅的回调?

【问题讨论】:

根据 rmaddy 在下面的回答,这不是崩溃,而是 iOS 终止了应用程序。 对我来说也是同样的问题,但它是针对我的应用的位置权限的:( 【参考方案1】:

我在自己的应用中看到了这一点。我也看到其他人也报告了这一点。我很确定这是故意的行为。操作系统会杀死任何对隐私权限更改做出反应的后台应用程序。苹果似乎对此采取了大锤的方法。这不是崩溃(尽管在调试器中运行时可能会出现这种情况)。应用程序因各种其他原因而终止。将此添加到原因列表中。这让我们有更多理由在完全重启应用时做好恢复应用状态的工作。

请注意,此行为适用于所有各种隐私设置,例如联系人、照片、麦克风、日历和相机。

【讨论】:

已验证 iOS 7.0.3 上的照片安全设置也会发生这种情况。代表苹果似乎是合乎逻辑的,这里没有抱怨!有谁知道在应用程序因安全更新而崩溃之前运行后台代码以保存一些数据的方法? 已验证,iOS 7.0.3 中的麦克风安全设置也会出现这种情况。 在 iOS 7 日历相关应用程序中的工作方式相同。如果您在设备上运行应用程序,而不是通过 Xcode 调试或模拟器,您将看到应用程序重新启动,用户看不到。因此,正如 rmaddy 所说,只要确保您的应用“在完全重启时恢复应用状态良好......” 这是故意的行为。如果您在应用程序运行时更改应用程序权限,它将被杀死。【参考方案2】:

通常,当应用程序从暂停状态恢复时,它应该从您的 AppDelegate 调用 application:didEnterForeground。在我看来,这将是您重新调整通讯录权限的好地方。

【讨论】:

在我看来,最佳做法是在应用需要使用这些数据时(例如,进入某个屏幕时)请求权限。

以上是关于当用户更改联系人访问权限时,应用程序在 iOS 6 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中请求和检查权限

iOS14 隐私适配及部分解决方案

iOS UIAlertView 权限 Alpha 阴影

如何在 ios Swift 的单个警报中访问推送通知、联系人和照片?

Android 6.0 运行时权限处理

什么条件使 iOS 13 要求用户授予“始终”位置访问权限?