ios 关于手机通讯录

来源:互联网 发布:淘宝美工笨的人难学吗 编辑:程序博客网 时间:2024/05/18 03:16
在SDK中,apple提供了两个框架AddressBook和AddressBookUI两个框架,不同的框架也做不同的处理,
1,AddressBook框架
在我们的App中需要使用获取手机通讯录的了联系人信息时,就需要使用这个框架,这个框架基于C语言开发的,因此里面的许多变量类型都是C中的。文档中也定义了很多方法,在这里我只说一下获取联系人
与绘图类似,首先创建一个类似上下文的实例,

ABAddressBookCreateWithOptions是6.0以后的方法,ABAddressBookCreate是6.0之前的方法,所以这里需要单独判断一下,

 

-(NSArray *)getAddressBook

{

   @autoreleasepool {

    //获得本地通讯录句柄--上下文

   ABAddressBookRef ref=nil;

   int systemVersion=[[[UIDevicecurrentDevice]systemVersion]intValue];

   if(systemVersion>=6.0){//6.0以上的

      ref=ABAddressBookCreateWithOptions(NULL,NULL);

       //请求用户是否可以使用通讯录

       dispatch_semaphore_tsem=dispatch_semaphore_create(0);

      ABAddressBookRequestAccessWithCompletion(ref, ^(bool granted, CFErrorRef error) {

          dispatch_semaphore_signal(sem);

      });

      dispatch_semaphore_wait(sem,DISPATCH_TIME_FOREVER);

      dispatch_release(sem);

   }

   else{

      ref=ABAddressBookCreate();

   }

    //获取本地所有联系人记录

   if(ref==nil) return nil;

   

   NSArray *arry=(__bridge  NSArray *)ABAddressBookCopyArrayOfAllPeople(ref);

   NSMutableArray *persons=[[NSMutableArray alloc]init];

   for(id tmpPerson in arry) {

       //__bridge关键词表示在ARC模式下不需要管理c中的内存释放

      ABRecordRefrecord=(__bridge ABRecordRef)tmpPerson;

       NSMutableDictionary*dict=[[NSMutableDictionaryalloc]init];

       NSString *name=(__bridge NSString *)(ABRecordCopyCompositeName(record));

       [dictsetObject:name forKey:@"name"];

       ABMultiValueRefphonevalues=ABRecordCopyValue(record, kABPersonPhoneProperty);

      CFIndex count=ABMultiValueGetCount(phonevalues);

      for (int i=0;i

          NSString *phonenumber=(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phonevalues,i));

          [dict setObject:phonenumber forKey:[NSString stringWithFormat:@"phone%i",i]];

      }

       [personsaddObject:dict];

   }

      return [persons copy];

   }

}

关于dispatch_semaphore_t变量GCD中用于控制线程并发的,这里不再详细介绍了,

 

ABRecordCopyCompositeName是直接可以获取联系人姓名的方法,返回值为String,

 

CFTypeRef ABRecordCopyValue(ABRecordRef record,ABPropertyIDproperty)这个方法这里解释一下,第二个参数为属性ID,在ABPerson.h文件中可以获取到所有的联系人属性值,包含email,电话,qq等详细信息,返回值为通用指针类型(Void*),这里转化为我们需要的就OK了。

(2)AddressBookUI框架

这个框架是Apple为我们提供的调用通讯录页面和联系人页面的框架,与调用本机照相机类似的实现,

 

ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息

ABPersonViewController:显示一个具体联系人的信息

ABNewPersonViewController:增加一个新的联系人

ABUnknownPersonViewController:完善一个联系人的信息

大概已经清楚这个框架的作用了,每个页面都可以调用相应的委托实现回调,这个就不说了

打开通讯录页面代码:

 

 ABNewPersonViewController*VC=[[ABNewPersonViewControlleralloc]init];

          VC.newPersonViewDelegate=self;

          [selfpresentModalViewController:VCanimated:YES];



0 0
原创粉丝点击