AddressBookUI Framework in iOS9 beta4

来源:互联网 发布:disabled js移除 编辑:程序博客网 时间:2024/05/22 09:02


在以前的iOS版本中,当我们需要读取系统的通讯录时,我们只需要简单调用AddressBookUI framework中的ABPeoplePickerNavigationController,代码如下:

ABPeoplePickerNavigationController *abNavCtrl = [[ABPeoplePickerNavigationController alloc] init];                abNavCtrl.peoplePickerDelegate = self;                abNavCtrl.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:FALSE];                [self presentViewController:abNavCtrl animated:YES completion:nil];

然后实现ABPeoplePickerNavigationController的代理就行了。(在iOS8之后,需要用新的代理方法)



但是在iOS9 beta4 (写这篇文章时,最新的iOSbeta版本),打开Contacts后,选择某个phone number,App会直接黑屏或者白屏,整个应用会挂起。ABPeoplePickerNavigationController的代理方法也不能执行到 (除了Cancel的代理方法外)。

(另外,如果没记错,在iOS9 beta4中,打开Contacts时,没有授权提示框出现。)

不确定这是不是iOS9 beta4的bug,测试过Xcode7 beta2/beta3的模拟器都能正常运行。


所以我找到了另外一种方法来解决这个问题,先判断AddressBook的状态,拿到授权再打开Contacts页面。代码如下:

ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();        if (status == kABAuthorizationStatusNotDetermined) {                ABAddressBookRef abRef = ABAddressBookCreateWithOptions(nil, nil);                ABAddressBookRequestAccessWithCompletion(abRef, ^(bool granted, CFErrorRef error) {                        if (nil == error && granted) {                                ABPeoplePickerNavigationController *abNavCtrl = [[ABPeoplePickerNavigationController alloc] init];                                abNavCtrl.peoplePickerDelegate = self;                                abNavCtrl.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:FALSE];                                [self presentViewController:abNavCtrl animated:YES completion:nil];                            }            else {                            }        });    }    else if (status == kABAuthorizationStatusRestricted) {                // Show the error prompt pls    }    else if (status == kABAuthorizationStatusDenied) {                // Show the error prompt pls    }    else if (status == kABAuthorizationStatusAuthorized) {                ABPeoplePickerNavigationController *abNavCtrl = [[ABPeoplePickerNavigationController alloc] init];                abNavCtrl.peoplePickerDelegate = self;                abNavCtrl.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:FALSE];                [self presentViewController:abNavCtrl animated:YES completion:nil];            }

在iOS7,8中都能正常运行。感觉这个才应该是正确的调用AddressBookUI的流程。

0 0