• iOS:访问地址薄


    地址簿的访问

    • 介绍:

      地址簿(Address Book)是一个共享的联系人信息数据库。任何iOS应用程序都可以使用。通过提供常用联系人信息,而不是让每一个应用程序管理独立的联系人列表,可改善用户体验。在拥有共享的地址簿后,无需在不同的应用程序中添加联系人多次,在一个应用程序中更新联系人信息后,其他所有应用程序就立刻能够使用它们。iOS通过两个框架提供了全面的地址簿数据库访问功能,分别是Address Book和Address Book UI。
      Address Book UI框架是一组用户界面类,封装了Address Book框架,并向用户提供了使用联系人信息的标准方式。使用该界面可以让用户在地址簿中浏览、搜索和选择联系人,显示并编辑选定联系人的信息,以及创建新的联系人。

    • 步骤:

    <1>为使用框架Address Book做准备
    要想显示地址簿UI和地址簿数据,必须导入框架Address Book和Address Book UI的头文件,并指出将实现协议ABPersonPickerNavigationControllerDelegate。
    打开文件ViewController.h,在现有编译指令#import后面添加如下代码行:

    #import <AddressBook/AddressBook.h>
    #import <AddressBookUI/AddressBookUI.h>

    接下来,修改代码@interface,在其中添加<ABPersonPickerNavigationControllerDelegate>,功能是指出我们要遵守协议ABPersonPickerNavigationControllerDelegate:

    @interface ViewController:UIViewController<ABPersonPickerNavigationControllerDelegate>

    <2>显示地址薄联系人选择器
    当用户单击"选择一个"按钮时,应用程序需显示联系人选择器这一模态视图,它向用户提供与应用程序“通讯录”类似的界面。在文件ViewController.m的方法newBFF中,分配并初始化一个联系人选择器,将其委托设置为视图控制器(self)然后在显示。这个方法的代码如下:

    //打开地址薄
    - (IBAction)newBFF:(id)sender{
       ABPersonPickerNavigationController *picker;
       picker = [[ABPersonPickerNavigationController alloc]init];
       picker.peoplePickerDelegate = self;
       [self presentViewController:picker animate:YES];
    }

    <3>处理取消和挖掘
    联系人的界面弹出后,既可以选取联系人就取消,也可以继续深究联系人的信息。这里我就只让用户选择朋友后就取消,而不希望用户继续选择或者编辑联系人属性。因此需要将委托方法peoplePickerNavigationController:peoplePicker:shouldContinueAfterSelectingPerson实现为返回NO,这是这个应用程序的核心方法。还需要让委托方法关闭联系人选择器模态视图,并将控制器交给ViewController。
    但是还必须实现联系人选择器委托协议定义如下方法:
    1.处理用户取消选择的情形(peoplePickerNavigationControllerDidCancel)
    2.处理用户深入挖掘联系人属性的情形(peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:idnetifier)。
    在文件ViewController.m中,实现方法peoplePickerNavigationControllerDidCancel,此方法用于处理用户在联系人选择器中取消选择,具体代码如下所示:

    //关闭地址薄
    - (void) peoplePickerNavigationControllerDidCancel:(ABPersonPickerNavigationController *)peoplePicker{
       [self dissmissViewControllerAnimate:YES];
    }

    将方法peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:idnetifier实现返回NO,此方法用于处理用户在联系人选择器中取消选择,具体代码如下所示:

    //设置不继续深挖联系人信息
    -(BOOL)peoplePickerNavigationController:(ABPersonPickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef) person 
    property:(ABPropertyID)property  idntifier:(ABMultiValueIdntifier)idntifier{
      //We won't get to this delegate method
      Return NO;
    }

    <4>选择、访问和显示联系人信息
    如果用户没有取消选择,将调用委托方法peoplePickerNavigationController:peoplePicker:shouldCotinueAfterSelectingPerson,并通过一个ABRecordRef将选定联系人传递给该方法。ABRecordRef是在AddressBook框架中定义的。这里,将分别读取联系人的名字、照片、电子邮件、邮政编码这四项信息,在读取照片前需要检查联系人是否有照片。在此需要注意,返回的联系人名字和照片并非Cocoa对象(即NSString和UIImage),而是Core Foundation中的C语言数据,因此需要使用AddressBook框架中的函数ABRecordCopyValue和UIImage的方法ImageWithData进行转换。
    对于电子邮件地址和邮政编码,必须处理可能返回的多个值的请情形。就这些数据而言,也将使用ABRecordCopyValue获取指向数据集的引用,再使用函数ABMultiValueGetCount来核实联系人至少有一个电子邮件地址(或邮政编码),然后使用ABMultiValueAtIndex复制第一个电子邮件地址或者邮政编码。
    在文件ViewController.m中添加一个委托方法peoplePickerNavigationController:shouldContinueAfterSelectingPerson,此方法能够在用户选择联系人时做出响应,具体代码如下:

    - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNaivgationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
                //Retrieve the friend's name from the address book person record
                NSString *friendName;
                NSString *friendEmail;
                NSString *friendZip;
                
                //获取联系人的姓名
                friendName = (__bridge NSString *)ABRecordCopyValue(person,kABPersonFristNameProperty);
                NSLog("联系人的姓名:%@",friendName);
                
                
                //获取联系人邮政编码
                ABMultiValueRef friendAddressSet;
                NSDictionary *friendFirstAddress;
                friendAddressSet = ABRecordCopyValue(person,kABPersonAddressProperty);
                if(ABMultiValueGetCount(friendAddressSet)>0){
                    friendFirstAddress = (__bridge NSDictionary *)ABRecordCopyValueAtIndex(friendAddressSet,0);
                    friendZip = [friendFirstAddress objectForKey:"ZIP"];
                    NSLog("联系人邮政编码:%@",friendZip);
                }
                
                //获取联系人邮件地址
                ABMultiValueRef friendEmailAddress;
                friendEmailAddress = ABRecordCopyValue(person,kABPersonEmailProperty);
                if(ABMultiValueGetCount(friendEmailAddress)>0){
                    friendEmail = (__bridge NSString *)ABRecordCopyValueAtIndex(friendEmailAddress,0);
                    NSLog("联系人邮件地址:%@",friendEmail);
                }
                
                //获取联系人的图像
                if(ABPersonHasImageData(person)){
                    UIImage *personImage =  [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(person)];
                    NSLog("联系人的图像:%@",personImage);
                }
                
                //关闭地址薄
                [self dissmissViewControllerAnimate:YES];
                
                return NO;
            }
  • 相关阅读:
    runtime 01-类与对象
    iOS 远程推送的实现
    iOS 选取上传图片界面
    NSAssert
    TableView下拉cell
    此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist
    教你如何快速集成第3方
    iPhone应用开发 UITableView学习点滴详解
    苹果Xcode 证书生成、设置、应用完整图文教程
    NSXMLParser解析xml格式
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/6024759.html
Copyright © 2020-2023  润新知