zoukankan      html  css  js  c++  java
  • IOS 开发之 -- 获取本机通讯录里面所有的联系人,并传到后台

    项目中遇到一个需求,就是需要在入口的时候,获取通讯录的权限,并把所有的联系人,以接口参数的形式传到后台,通过网上查资料,历时3个小时,终于完成,

    话不多,直接上代码:

    1,导入系统库

    #import <Contacts/Contacts.h>
    #import <AddressBook/AddressBookDefines.h>
    #import <AddressBook/ABRecord.h>
    #import "AddressBook.h"

    2,info.plist文件里面添加权限:

    key: Privacy - Contacts Usage Description

    value: App需要您的同意才能访问通讯录

    3,添加获取权限的方法

    - (void)requestAuthorizationForAddressBook {
        
        if ([[UIDevice currentDevice].systemVersion floatValue]>=9.0){
        
            CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
            if (authorizationStatus == CNAuthorizationStatusNotDetermined) {
                CNContactStore *contactStore = [[CNContactStore alloc] init];
                [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
                    if (granted) {
                        
                    } else {
                        NSLog(@"授权失败, error=%@", error);
                    }
                }];
            }
            
        }else
        {
            [HTools showTextOnlyHud:@"请升级系统" delay:1.0];
        }
        
        
    }

    当然了,过低的系统,获取权限方法也不一样,可以在else方法里面自己做处理,这里我没有做处理!

    4,用户点击允许后,获取通讯录所有的联系人信息:

    - (void)getmyAddressbook {
        CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
        if (authorizationStatus == CNAuthorizationStatusAuthorized) {
            NSLog(@"没有授权...");
        }
        
        self.myDict = [[NSMutableDictionary alloc]init];
        
        // 获取指定的字段,并不是要获取所有字段,需要指定具体的字段
        NSArray *keysToFetch = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
        CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];
        CNContactStore *contactStore = [[CNContactStore alloc] init];
        
        [contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
            NSLog(@"-------------------------------------------------------");
            
            NSString *givenName = contact.givenName;
            NSString *familyName = contact.familyName;
            NSLog(@"givenName=%@, familyName=%@", givenName, familyName);
            
            NSString *nameStr = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName];
            
            NSArray *phoneNumbers = contact.phoneNumbers;
            
            for (CNLabeledValue *labelValue in phoneNumbers) {
                NSString *label = labelValue.label;
                phoneNumber = labelValue.value;
                
                NSLog(@"label=%@, phone=%@", label, phoneNumber.stringValue);
                
                
            }
            
            [_myDict setObject:phoneNumber.stringValue forKey:nameStr];
            
            
            //    *stop = YES; // 停止循环,相当于break;
            
        }];
        
        
        NSLog(@"mydict is ==== %@",_myDict);
    
    }

    放到字典里面,然后把字典转化成json字符串,去除非法字符,通过接口,传到后台就可以了!转json字符串的方法,可以参考我写的上一篇博客:过滤掉非法字符。

    控制台输出如下:

  • 相关阅读:
    QT4.7.1 + VS2008 + QT Designer开发流程心得
    SharePoint 2010 托管元数据Bug (跟邮件提醒功能相关.小bug,大问题)
    SharePoint 2010 技巧系列: 控制Ribbon菜单权限(SiteActions的例子)
    发布一个SharePoint 2010 工具(复制,移动文件和文件夹)
    SHarePoint 2010 技巧 列验证 (column Validation)
    SharePoint 2010系列: 教你如何创建Internet 站点一 (设计母版页)
    SharePoint2010 技巧系列:快速开发Ribbon
    SharePoint 2010 技巧: 限制People Picker搜索非站点集内的用户
    SharePoint 2010 技巧系列 启用文档库接收邮件功能
    SharePoint 2010 技巧系列: 文档管理的自动分发功能
  • 原文地址:https://www.cnblogs.com/hero11223/p/6742189.html
Copyright © 2011-2022 走看看