訪問通訊錄 適配iOS7

RecherJ發表於2017-12-27

昨天學習iOS中訪問使用者通訊錄的一個框架AddressBookUI.framework,這是個自帶UI介面的系統框架,第一次訪問要獲得使用者的授權. 因為是已經封裝好的所以,用起來也比較方便

  1. 匯入框架#import <AddressBookUI/AddressBookUI.h>
  2. 建立控制器
ABPeoplePickerNavigationController *Vc = [[ABPeoplePickerNavigationController alloc] init];
複製程式碼
  1. 設定控制器為代理,監聽通訊錄控制器彈出後使用者的點選操作
Vc.peoplePickerDelegate = self;
複製程式碼
  1. 彈出
[self presentViewController:Vc animated:YES completion:nil];
複製程式碼

ABPeoplePickerNavigationControllerDelegate代理協議中,有兩個方法可以監聽使用者點選操作的方法

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
複製程式碼

這兩個方法的區別在於:第一個方法是監聽到使用者點選了某個聯絡人時就會呼叫,並自動關閉頁面;第二個在於點選了某個具體聯絡人後會自動跳轉到對應聯絡人的詳情頁面,在點選具體屬性時便會呼叫,這個方法會把這個property值傳遞過來,拿到這個值就可以具體獲取一些具體資訊了. 點選右上角的 Cancel按鈕後會將 modal出來的介面關閉,同時呼叫cancel方法

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
複製程式碼

以上效果均是在iOS9.2模擬器上測試的結果

為了測試真機,我將部署版本改成了 iOS7.1之後執行在我的4S老爺機上之後,發現這兩個方法不呼叫,而且 modal 出來的控制器也關閉不了 =.=

google了一下,發現原來- (void)peoplePickerNavigationController:peoplePicker didSelectPerson:- (void)peoplePickerNavigationController:peoplePicker didSelectPerson: property: identifier:這兩個方法,是從 iOS8之後才有用的,而 iOS7及以前都是要用- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:這兩個方法,和iOS8之後的兩個方法類似,只是iOS8之後過期了. 所以如果要適配更低的版本時,這兩個過期的方法還是非常必要的.同時在 iOS7中- (void)peoplePickerNavigationControllerDidCancel:方法也是要自己手動彈出控制器.iOS8之後會自動彈出,所以為了適配,保證iOS7-iOS9均有效,手動 dismiss 掉.

###參考 iOS訪問通訊錄開發讀取聯絡人資訊

相關文章