• 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字符串的方法,可以参考我写的上一篇博客:过滤掉非法字符。

    控制台输出如下:

  • 相关阅读:
    TSQL
    NET 中的对象序列化
    我常用的WebConfigSet类
    Asp.Net 2.0中的客户端脚本
    DataTable.Select()使用
    Change SharePoint 2013 Search Topology
    3 ways to localize SharePoint XSLT
    线程编程托管C++ Thread类
    SQL字符串操作函数小结
    通过数据的判断使Gridview中数据变色
  • 原文地址:https://www.cnblogs.com/hero11223/p/6742189.html
Copyright © 2020-2023  润新知