在我的应用程序中,我正在获取联系信息直接购买这样做...
ABAddressBookRef m_addressbook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(m_addressbook);
CFIndex nPeople = ABAddressBookGetPersonCount(m_addressbook);
for (int i=0;i < nPeople;i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople,i);
CFStringRef company,firstName,lastName;
firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
lastName = ABRecordCopyValue(ref, kABPersonLastNameProperty);
company = ABRecordCopyValue(ref, kABPersonOrganizationProperty);
}
所以,我需要先检查这是否是开/关设置 - &gt;隐私 - &gt;我的应用程序的联系人ON / OFF。
为此,我这样做:
__block BOOL accessGranted = NO;
float sysver = [[[UIDevice currentDevice]systemVersion]floatValue];
if(sysver>=6) {
ABAddressBookRef addressBook = ABAddressBookCreate();
if (ABAddressBookRequestAccessWithCompletion != NULL) {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
} else {
accessGranted = YES;
}
} else {
accessGranted = YES;
}
if(accessGranted)
{
// doing my stuff and moving on
} else {
// please make Settings --> Privacy --> Contacts my app. ON for accessing contacts.
}
我的问题是,在设备上安装应用程序后第一次,应用程序要求我提供“不允许”/“确定”联系人授予访问权限的警报。我点击确定但设置 - &gt;隐私 - &gt;我的应用程序的联系人已关闭,所以再次提醒它打开,“设置”“确定”所以选择设置,然后我打开它,一旦我打开应用程序就让SIGKILL无需控制台。
以后每当我将隐私设置更改为OFF到ON应用程序在后台崩溃时。我没有把SIGKILL给控制台。
提前致谢。
答案 0 :(得分:4)
还有另一篇帖子发现here类似问题。
当隐私设置更改时,每个应用程序都会终止,这是一种操作系统功能。这是为了确保每个应用程序都遵守用户隐私,并且在更改隐私设置后不会继续使用任何缓存数据。
另请注意您建议的代码
float sysver = [[[UIDevice currentDevice]systemVersion]floatValue];
if(sysver>=6) {
Apple不建议使用更好的,更官方的方法,例如使用Foundation #define值,即
BOOL isiOS6OrMoreRecent = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_6_0 ? YES : NO;
然而,使用iOS版本来确定可用功能是非常糟糕的做法,而是独立于操作系统版本(通讯簿代码here)检查功能本身,例如:
if (ABAddressBookRequestAccessWithCompletion) { // if in iOS 6
// Request authorization to Address Book
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);