zoukankan      html  css  js  c++  java
  • (九十八)通讯录的访问和修改

    在iOS端可以通过AddressBook或者AddressBookUI两个框架实现,区别是第二个框架带视图,一般使用第一个框架就够了。

    下面介绍AddressBook框架的使用,注意这个是C语言框架,使用起来比较麻烦。

    ①请求授权

    先判断授权状态,如果未授权则进行授权。

    // 1.主动请求授权,先判断授权状态
    NSInteger state = ABAddressBookGetAuthorizationStatus();
    if (state == kABAuthorizationStatusAuthorized) {
        NSLog(@"已经授权");
    }else{
        ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
        ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {
            if (granted) {
                NSLog(@"授权成功");
            }else{
                NSLog(@"授权失败");
            }
        });
    }

    ②获取通讯录的联系人

    C语言没有对象,通过一些以Ref结尾的指针来获取数据。

    注意C语言数组的规模通过函数获取,拿到元素也要通过函数。

    注意一些枚举值以k开头。

    注意电话是一个数组。

    // 先判断授权状态
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
        NSLog(@"未授权");
        return;
    }
    
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book);
    CFIndex count = CFArrayGetCount(persons);
    for (NSInteger i = 0; i < count; i++) {
        ABRecordRef person =  CFArrayGetValueAtIndex(persons, i);
        CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
        CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
        ABMutableMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
        NSLog(@"联系人:%@ %@",lastName,firstName);
        NSInteger cnt = ABMultiValueGetCount(phones);
        for (int j = 0; j < cnt; j++) {
            CFStringRef phone = ABMultiValueCopyValueAtIndex(phones, j);
            NSLog(@"电话:%@ ",phone);
        }
    }
    ③修改通讯录联系人

    首先拿到通讯录中的人,然后调用SetValue方法来修改值。

    最后不要忘记保存。

    // 先判断授权状态
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
        NSLog(@"未授权");
        return;
    }
    
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book);
    ABRecordRef person = CFArrayGetValueAtIndex(persons, 0);
    ABRecordSetValue(person, kABPersonLastNameProperty, @"changed", NULL);
    ABAddressBookSave(book, NULL);
    ④添加一个联系人

    注意添加电话时应创建MultiValue。

    // 先判断授权状态
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
        NSLog(@"未授权");
        return;
    }
    
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book);
    CFIndex count = CFArrayGetCount(persons);
    for (NSInteger i = 0; i < count; i++) {
        ABRecordRef person =  CFArrayGetValueAtIndex(persons, i);
        CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
        CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
        ABMutableMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
        NSLog(@"联系人:%@ %@",lastName,firstName);
        NSInteger cnt = ABMultiValueGetCount(phones);
        for (int j = 0; j < cnt; j++) {
            CFStringRef phone = ABMultiValueCopyValueAtIndex(phones, j);
            NSLog(@"电话:%@ ",phone);
        }
    }

  • 相关阅读:
    【剑指offer】面试题35:第一个只出现一次的字符
    【剑指offer】面试题34:丑数
    【剑指offer】面试题33:把数组排成最小的数
    【剑指offer】面试题32:从1到n整数中1出现的次数
    【剑指offer】面试题31:连续子数组的最大和
    【剑指offer】面试题30:最小的 k 个数
    【剑指offer】面试题29:数组中出现次数超过一半的数字
    【剑指offer】面试题28:字符串的排列
    【剑指offer】面试题27:二叉搜索树与双向链表
    【剑指offer】面试题26:复杂链表的复制
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154094.html
Copyright © 2011-2022 走看看