2012-10-10 31 views
44

我有一个使用地址簿的应用程序。在iOS 6中运行时,它会在用户做某些需要通讯录访问的内容时运行此代码。当用户更改时,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(); 
} 

这完美的作品:我能够读取联系人信息,并在用户拒绝访问,应用程序相应地做出反应。

然而,如果用户:

  1. 允许在应用中的联系人访问,
  2. 退出该应用,
  3. 转到设置 - >与隐私>通讯录和禁用该应用联系人访问,
  4. 当应用程序在后台运行,运行的应用程序,
  5. 去设置并启用了应用程序联系访问,

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

即使应用程序在启动期间没有运行上述代码,也可以复制崩溃。

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

+0

根据rmaddy的回答,这不是崩溃,它是iOS终止应用程序。 –

+0

对我来说也是同样的问题,但它是为我的应用程序的位置权限:( –

回答

72

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

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

+2

认证这种方式也发生了与iOS 7.0.3上的照片安全设置似乎代表苹果公司的逻辑,没有投诉在这里!有没有人知道一种方式来运行后台代码来保存一些数据之前,应用程序崩溃,由于安全更新? –

+2

验证,这也发生在iOS 7.0.3中的麦克风安全设置 – Pavan

+1

与iOS 7日历相关的应用程序的工作方式相同如果您在设备上运行应用程序,而不是通过Xcode调试或模拟器,则会看到应用程序重新启动,用户看不到所以,正如rmaddy所说的那样,只要确保你的应用在完全重新启动时恢复应用状态就能很好地工作......“ – leanne

-1

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

+0

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

相关问题