美文网首页
iOS获取手机通讯录功能小计

iOS获取手机通讯录功能小计

作者: magicL1 | 来源:发表于2017-09-29 14:37 被阅读0次

    最近开发的项目中有个获取用户手机通讯录部分信息的功能,了解了一下相关知识,这里做一下记录。

    开始前先建一个存储手机通讯录的模型:

    通讯录模型

    //查看是否已经获取通讯录权限

    - (NSString *)loadLinkMan

    {

    __block NSString *resultStr;

    ABAddressBookRef addressBookref = ABAddressBookCreateWithOptions(NULL, NULL);

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {

    ABAddressBookRequestAccessWithCompletion(addressBookref, ^(bool granted, CFErrorRef error) {

    CFErrorRef *error1 = NULL;

    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1);

    resultStr = [self accessAddressBook:addressBook];

    });

    }else if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){

    CFErrorRef *error1 = NULL;

    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1);

    resultStr = [self accessAddressBook:addressBook];

    }else{

    //        UIWindow *window = [UIApplication sharedApplication].keyWindow;

    UIAlertView *alert  = [[UIAlertView alloc] initWithTitle:@"提示" message:@"没有获取通讯录权限" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];

    alert.delegate = self;

    [alert show];

    return nil;

    }

    return resultStr;

    }

    - (NSString *)accessAddressBook:(ABAddressBookRef)addressBook{

    //获取联系人个数

    CFIndex numberOfPeoples = ABAddressBookGetPersonCount(addressBook);

    CFArrayRef peoples = ABAddressBookCopyArrayOfAllPeople(addressBook);

    NSLog(@"有%ld个联系人", numberOfPeoples);

    //循环获取联系人

    for (int i = 0; i < numberOfPeoples; i++) {

    ABRecordRef person = CFArrayGetValueAtIndex(peoples, i);

    ABLinkManModel *linkMan = [[ABLinkManModel alloc] init];

    linkMan.firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

    linkMan.lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));

    linkMan.organization = (__bridge NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty);

    linkMan.name = [NSString stringWithFormat:@"%@%@",linkMan.lastName, linkMan.firstName];

    if ([linkMan.name isEqualToString:@""]) {

    linkMan.name = linkMan.organization; //name为空则取organization,为空返回""

    }

    //读取电话多值,可能有多个电话

    NSMutableArray *phoneArray = [[NSMutableArray alloc] init];

    ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);

    for (int k = 0; k < ABMultiValueGetCount(phone); k++)

    {

    //获取电话别名

    NSString * personPhoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k));

    //获取该别名下的电话值

    NSString * tempstr = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, k);

    NSArray *array = [NSArray arrayWithObjects:personPhoneLabel, tempstr, nil];

    [phoneArray addObject:array];

    }

    linkMan.phones = phoneArray;

    NSDictionary *dic = [linkMan mj_keyValues];

    [self.linkManArray addObject:dic];

    }

    NSArray *arr = [self.linkManArray copy];

    NSString *jsonStr;

    if ([NSJSONSerialization isValidJSONObject:arr]) {

    NSError *error;

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error];

    jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    }

    return jsonStr;     //后台需要通讯录json,返回json。

    }

    相关文章

      网友评论

          本文标题:iOS获取手机通讯录功能小计

          本文链接:https://www.haomeiwen.com/subject/yseiextx.html