美文网首页
iOS 关于iPhone通讯录信息获取

iOS 关于iPhone通讯录信息获取

作者: F_Hongpeng | 来源:发表于2019-12-18 16:41 被阅读0次

    注意事项:

    • 添加头文件 【#import <Contacts/Contacts.h>
    • 在Xcode添加【info.plist 的Privacy - Contacts Usage Description
    • 若APP功能没必要用到通讯录,但代码上却又添加了,上架会被拒绝,值得注意。

    代码如下:

    /**
     *  keys: @[CNContactPhoneNumbersKey,   手机号
     *          CNContactFamilyNameKey,     姓氏
     *          CNContactGivenNameKey       名字
     *          ...,nil ];  @see <Contacts/Contacts.h> 内有详情。
     *  选择需要的信息。
     *
     *  contacts:返回NSArray<CNContact>。
     *  flag:0=成功,-1=用户拒绝,-2=需在设置界面开启通讯录,-3=参数有误;
     */
    +(void)scanContactsWithKeys:(NSArray*)keys
                         Result:(void(^)(NSArray*contacts,
                                         int flag))result;
    
    /**
     *  简单解析 contacts
     *  {@"FamilyName":@"...",
     *   @"GivenName":@"...",
     *   @"Phones":@[@"iphone":@"110",@"home":@"456",...]}
     */
    +(NSDictionary*)openContact:(CNContact*)contact;
    
    //实现代码:
    static CNContactStore *store;
    +(void)scanContactsWithKeys:(NSArray*)keys
                         Result:(void(^)(NSArray*contacts,
                                         int flag))result
    {
        if (keys.count == 0) {
            NSLog(@"Error: DFContacts keys is nil.");
            if (result) result(nil,-3);
            return;
        }
        NSMutableArray *mArr = [NSMutableArray new];
    
        CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];
        CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
        if (status == CNAuthorizationStatusNotDetermined) {
            NSLog(@"DFContacts is applying for authorization...");
            store = [CNContactStore new];
            [store requestAccessForEntityType:CNEntityTypeContacts
                            completionHandler:^(BOOL granted,
                                                NSError * _Nullable error)
             {
                 if (granted){
                     // 获取通讯录中所有的联系人
                     [store enumerateContactsWithFetchRequest:request error:nil
                                                   usingBlock:^(CNContact * _Nonnull contact,
                                                                BOOL * _Nonnull stop)
                      {
                          [mArr addObject:contact];
                      }];
                     if (result) result(mArr,0);
                 }else{
                     NSLog(@"Error: User refusal to authorize.");
                     if (result) result(nil,-1);
                 }
             }];
        }
        if (status == CNAuthorizationStatusRestricted) {
            NSLog(@"Error: You need to open the address book at the settings interface.");
            if (result) result(nil,-2);
        }
        if (status == CNAuthorizationStatusDenied) {
            NSLog(@"Error: User refusal to authorize.");
            if (result) result(nil,-1);
        }
        if (status == CNAuthorizationStatusAuthorized) {
            store = [CNContactStore new];
            [store enumerateContactsWithFetchRequest:request
                                               error:nil
                                          usingBlock:^(CNContact * _Nonnull contact,
                                                       BOOL * _Nonnull stop)
             {
                 [mArr addObject:contact];
             }];
            if (result) result(mArr,0);
        }
    }
    
    
    
    +(NSDictionary*)openContact:(CNContact*)contact{
        NSString *familyName = contact.familyName;  // 姓氏
        NSString *givenName = contact.givenName;    // 名字
    
        // 获取电话号码
        NSMutableArray *mPhones = [NSMutableArray new];
        for (CNLabeledValue *labeledValue in contact.phoneNumbers)
        {
            CNPhoneNumber *phoneValue = labeledValue.value;
            NSString *phoneNumber = phoneValue.stringValue;
            NSString *label = [CNLabeledValue localizedStringForLabel:labeledValue.label];
            NSLog(@"%@--%@",label,phoneNumber);
            NSDictionary *phoneDic =@{label?:@"unknow":phoneNumber?:@""};
            [mPhones addObject:phoneDic];
        }
        NSDictionary *info = @{@"FamilyName":familyName,@"GivenName":givenName,@"Phones":mPhones};
        return info;
    }
    

    相关文章

      网友评论

          本文标题:iOS 关于iPhone通讯录信息获取

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