Đó là mẹo hoàn hảo cho tôi!
Trên iOS6, apple giới thiệu tính năng kiểm soát quyền riêng tư mới, người dùng có thể kiểm soát việc truy cập danh bạ và lịch của từng ứng dụng. Vì vậy, trong phần mã, bạn cần thêm một số cách để yêu cầu quyền. Trong iOS5 trở về trước, chúng tôi luôn có thể gọi
ABAddressBookRef addressBook = ABAddressBookCreate();
để lấy sổ địa chỉ mà không gặp bất kỳ vấn đề gì, nhưng trong iOS6, nếu bạn không có quyền, cuộc gọi này sẽ chỉ trả về con trỏ trống. Đó là lý do tại sao chúng ta cần thay đổi phương thức để lấy ABAddressBookRef.
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
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 { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted) {
// Do whatever you want here.
}
Trong mã, semaphore được sử dụng để chặn cho đến khi phản hồi, trong khi ABAddressBookRequestAccessWithCompletion sẽ yêu cầu quyền nếu ứng dụng không yêu cầu trước đó. Nếu không, nó sẽ chỉ tuân theo cài đặt trong Cài đặt-Quyền riêng tư-Liên hệ.
NGUỒN: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html