天天看點

iOS讀取通訊錄功能

别的不說。先導入AddressBook.framework先

然後引用  #import <AddressBook/AddressBook.h>

1、先授權,如果沒有授權提示到設定裡打開授權,如果已成功,讀取通訊錄資料到數組裡

addressBook = ABAddressBookCreate();
        
        //注冊通訊錄更新回調
        ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge void *)(self));
           
// iOS 6
-(bool)checkAddressBookAuthorizationStatus:(UITableView*)tableView;
{
    //取得授權狀态
    ABAuthorizationStatus authStatus =
        ABAddressBookGetAuthorizationStatus();

    if (authStatus != kABAuthorizationStatusAuthorized)
    {
        ABAddressBookRequestAccessWithCompletion
            (addressBook, ^(bool granted, CFErrorRef error)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (error)
                    NSLog(@"Error: %@", (__bridge NSError *)error);
                else if (!granted) {
                    UIAlertView *av = [[UIAlertView alloc]
                       initWithTitle:@"Authorization Denied"
                       message:@"Set permissions in Settings>General>Privacy."
                       delegate:nil
                       cancelButtonTitle:nil
                       otherButtonTitles:@"OK", nil];
                    [av show];
                }
                else
                {
                    //還原 ABAddressBookRef
                    ABAddressBookRevert(addressBook);
                    myContacts = [NSArray arrayWithArray:
                          (__bridge_transfer NSArray*)
                          ABAddressBookCopyArrayOfAllPeople(addressBook)];
                    [tableView reloadData];
                }
            });
        });
    }
    
    return authStatus == kABAuthorizationStatusAuthorized;
}
           

2、如果通訊錄有更新,可能及時調用回調方法,請看上面第一段代碼 ABAddressBookRegisterExternalChangeCallback 方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
	if (nil == myContacts)
	{
        addressBook = ABAddressBookCreate();
        
        //注冊通訊錄更新回調
        ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge void *)(self));
        
        if ([self checkAddressBookAuthorizationStatus:tableView])
            myContacts = [NSArray arrayWithArray:(__bridge_transfer NSArray*)
                          ABAddressBookCopyArrayOfAllPeople(addressBook)];
	}
    return 1;
}

void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context)
{
    NSLog(@"Address Book Changed");
    //__bridge               arc顯式轉換。 與__unsafe_unretained 關鍵字一樣 隻是引用。被代入對象的所有者需要明确對象生命周期的管理,不要出現異常通路的問題
    //__bridge_retained      類型被轉換時,其對象的所有權也将被變換後變量所持有
    //__bridge_transfer      本來擁有對象所有權的變量,在類型轉換後,讓其釋放原先所有權 就相當于__bridge_retained後,原對像執行了release操作
    RootViewController *viewController = objc_unretainedObject(context);
    //更新通訊錄
    [viewController updateAddressBook];
    
    //登出通訊錄更新回調
//    ABAddressBookUnregisterExternalChangeCallback(addressBook, addressBookChanged, context);
}
           

上面這段代碼主要功能是通訊錄有更新時。及時的重新整理資料

3、拿出數組中的聯系人資料

NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
//使用者頭像
NSData *d = (__bridge_transfer NSData*)ABPersonCopyImageData(objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]));
//取電話資料
-(void)handleRowSelection:(int)rowIndex
{
	ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:rowIndex]);
	ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,
													 kABPersonPhoneProperty);

	if (ABMultiValueGetCount(phoneNumbers) == 1)
		[self callThisNumber:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0)];
	else if (ABMultiValueGetCount(phoneNumbers) > 1)
	{
		UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Pick A Number" 
													  message:@"Which number would you like to call?" 
													 delegate:self 
											cancelButtonTitle:@"Cancel" 
											otherButtonTitles:nil];

		for (int i=0; i < ABMultiValueGetCount(phoneNumbers); i++)
			[av addButtonWithTitle:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, i)];

		[av show];
	}
	
	if (phoneNumbers)
		CFRelease(phoneNumbers);	
}
           

4、删除通訊錄資料

<span style="white-space:pre">	</span>ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]);
		CFErrorRef *error;
		ABAddressBookRemoveRecord(addressBook, person, error);
		ABAddressBookSave(addressBook, error);
		myContacts = nil;
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
           

以上隻是我粗略的學習了一下相關的功能代碼片段