關(guān)于通訊錄和短信的運(yùn)用附鸽,需要先向工程中導(dǎo)入以下類庫(kù):
1.第一步:首先選擇工程的Build Phases->Link Binary With Libraries,點(diǎn)擊+添加類庫(kù)
2.第二步:下載pinyin.c和pinyin.h文件脱拼。下載地址
3.第三步:封裝單例對(duì)象ZCAddressBook
ZCAddressBook.h文件中導(dǎo)入以下類庫(kù)Foundation、MessageUI拒炎、AddressBookUI
復(fù)制以下代碼到ZCAddressBook.h中
enum{
ABHelperCanNotConncetToAddressBook,ABHelperExistSpecificContact,ABHelperNotExistSpecificContact
};typedefNSUIntegerABHelperCheckExistResultType;
@interfaceZCAddressBook :NSObject <MFMessageComposeViewControllerDelegate,ABPeoplePickerNavigationControllerDelegate>
{
}
//保存排序好的數(shù)組index
@property(nonatomic,retain)NSMutableArray*dataArray;
//數(shù)組里面保存每個(gè)獲取Vcard(名片)
@property(nonatomic,retain)NSMutableArray*dataArrayDic;
#pragma mark獲得單例
+ (ZCAddressBook*)shareControl;
#pragmamark添加聯(lián)系人
- (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label;
- (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum;
-(NSMutableDictionary*)getPersonInfo;
-(NSArray*)sortMethod;
@property(nonatomic,assign)idtarget;
@property(nonatomic,copy)void(^MessageBlock)(int);
@property(nonatomic,copy)void(^PhoneBlock)(BOOL,NSDictionary*);
#pragma mark發(fā)送短信界面調(diào)用系統(tǒng)控件需要真機(jī)才能顯示
-(id)initWithTarget:(id)target MessageNameArray:(NSArray*)array Message:(NSString*)str Block:(void(^)(int))a;
+(void)sendMessage:(NSString*)phoneNum;
-(id)initWithTarget:(id)target PhoneView:(void(^)(BOOL,NSDictionary*))a;
導(dǎo)入類庫(kù)到ZCAddressBook.m中
復(fù)制以下代碼到ZCAddressBook.m中
staticZCAddressBook*instance;
@implementationZCAddressBook
-(id)init
{
if(self=[superinit]) {
}
returnself;
}
//單列模式
+ (ZCAddressBook*)shareControl{
@synchronized(self) {
if(!instance) {
instance= [[ZCAddressBookalloc]init];
}
}
returninstance;
}
//添加聯(lián)系人(聯(lián)系人名稱挪拟、號(hào)碼、號(hào)碼備注標(biāo)簽)
- (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label{
//創(chuàng)建一條空的聯(lián)系人
ABRecordRefrecord =ABPersonCreate();CFErrorReferror;
//設(shè)置聯(lián)系人的名字
ABRecordSetValue(record,kABPersonFirstNameProperty, (__bridgeCFTypeRef)name, &error);
//添加聯(lián)系人電話號(hào)碼以及該號(hào)碼對(duì)應(yīng)的標(biāo)簽名
ABMutableMultiValueRefmulti =ABMultiValueCreateMutable(kABPersonPhoneProperty);ABMultiValueAddValueAndLabel(multi, (__bridgeCFTypeRef)num, (__bridgeCFTypeRef)label,NULL);ABRecordSetValue(record,kABPersonPhoneProperty, multi, &error);
ABAddressBookRefaddressBook =nil;
//如果為iOS6以上系統(tǒng)击你,需要等待用戶確認(rèn)是否允許訪問通訊錄玉组。
if([[UIDevicecurrentDevice].systemVersionfloatValue] >=6.0){addressBook =ABAddressBookCreateWithOptions(NULL,NULL);
//等待同意后向下執(zhí)行
dispatch_semaphore_tsema =dispatch_semaphore_create(0);ABAddressBookRequestAccessWithCompletion(addressBook, ^(boolgranted,CFErrorReferror){dispatch_semaphore_signal(sema);});
dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);dispatch_release(sema);
}else{
addressBook =ABAddressBookCreate();}
//將新建聯(lián)系人記錄添加如通訊錄中
BOOLsuccess =ABAddressBookAddRecord(addressBook, record, &error);
if(!success) {
returnNO;
}else{
//如果添加記錄成功,保存更新到通訊錄數(shù)據(jù)庫(kù)中
success =ABAddressBookSave(addressBook, &error);returnsuccess ?YES:NO;
}
}
#pragmamark指定號(hào)碼是否已經(jīng)存在
- (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum{
ABAddressBookRefaddressBook =nil;
if([[UIDevicecurrentDevice].systemVersionfloatValue] >=6.0){
addressBook =ABAddressBookCreateWithOptions(NULL,NULL);
//等待同意后向下執(zhí)行
dispatch_semaphore_tsema =dispatch_semaphore_create(0);ABAddressBookRequestAccessWithCompletion(addressBook, ^(boolgranted,CFErrorReferror){dispatch_semaphore_signal(sema);});
dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);dispatch_release(sema);
}else{
addressBook =ABAddressBookCreate();
}
CFArrayRefrecords;
if(addressBook) {
//獲取通訊錄中全部聯(lián)系人
records =ABAddressBookCopyArrayOfAllPeople(addressBook);
}else{
#ifdef DEBUGNSLog(@"can not connect to address book");
#endif
returnABHelperCanNotConncetToAddressBook;
}
//遍歷全部聯(lián)系人丁侄,檢查是否存在指定號(hào)碼
for(inti=0; i<CFArrayGetCount(records);i++) {
ABRecordRefrecord =CFArrayGetValueAtIndex(records, i);
CFTypeRefitems
=ABRecordCopyValue(record,kABPersonPhoneProperty);
CFArrayRefphoneNums
=ABMultiValueCopyArrayOfAllValues(items);
if(phoneNums) {
for(intj=0; j<CFArrayGetCount(phoneNums); j++) {
NSString*phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
if([phoneisEqualToString:phoneNum]) {
returnABHelperNotExistSpecificContact;
}
}
}
}CFRelease(addressBook);
}
#pragma mark獲取通訊錄內(nèi)容
-(NSMutableDictionary*)getPersonInfo{
self.dataArray= [NSMutableArrayarrayWithCapacity:0];
self.dataArrayDic= [NSMutableArrayarrayWithCapacity:0];
//取得本地通信錄名柄
ABAddressBookRefaddressBook ;
if([[UIDevicecurrentDevice].systemVersionfloatValue] >=6.0){
addressBook =ABAddressBookCreateWithOptions(NULL,NULL);
dispatch_semaphore_tsema =dispatch_semaphore_create(0);ABAddressBookRequestAccessWithCompletion(addressBook, ^(boolgranted,CFErrorReferror){dispatch_semaphore_signal(sema);});
dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);dispatch_release(sema);
}else{
addressBook =ABAddressBookCreate();
}
CFArrayRefresults =ABAddressBookCopyArrayOfAllPeople(addressBook);
for(inti =0;i<CFArrayGetCount(results); i++){
NSMutableDictionary*dicInfoLocal = [NSMutableDictionarydictionaryWithCapacity:0];
ABRecordRefperson =CFArrayGetValueAtIndex(results, i);
NSString*first = (NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty);
if(first==nil) {
first =@" ";
}
[dicInfoLocalsetObject:firstforKey:@"first"];
NSString*last = (NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty);
if(last ==nil) {
last =@" ";
}
[dicInfoLocalsetObject:lastforKey:@"last"];
ABMultiValueReftmlphone =ABRecordCopyValue(person,kABPersonPhoneProperty);
NSString* telphone = (NSString*)ABMultiValueCopyValueAtIndex(tmlphone,0);
if(telphone ==nil) {
telphone =@" ";
}
[dicInfoLocalsetObject:telphoneforKey:@"telphone"];
CFRelease(tmlphone);
ABMultiValueRef tmpEmails = ABRecordCopyValue(person, kABPersonEmailProperty);
NSString *email = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, 0);
[dicInfoLocal setObject:email forKey:@"email"];
CFRelease(tmpEmails);
if (email) {
email = @"";
}
[dicInfoLocal setObject:email forKey:@"email"];
if (first&&![first isEqualToString:@""]) {
[self.dataArraydic addObject:dicInfoLocal];
}
if([firstisEqualToString:@" "] ==NO|| [lastisEqualToString:@" "]) {
[self.dataArrayDicaddObject:dicInfoLocal];
}
}
CFRelease(results);//new
CFRelease(addressBook);//new
for(NSDictionary*dicinself.dataArrayDic) {
NSString* str=[dicobjectForKey:@"first"];
NSString*strFirLetter = [NSStringstringWithFormat:@"%c",pinyinFirstLetter([strcharacterAtIndex:0])];
if([strFirLetterisEqualToString:@"#"]) {
strFirLetter= [selfupperStr:[strsubstringToIndex:1]];
}
if([[indexallKeys]containsObject:strFirLetter]) {
[[indexobjectForKey:strFirLetter]addObject:dic];
}else{
NSMutableArray*tempArray=[NSMutableArrayarrayWithCapacity:0];
[tempArrayaddObject:dic];
[indexsetObject:tempArrayforKey:strFirLetter];
}
}
[self.dataArrayaddObjectsFromArray:[indexallKeys]];
returnindex;
}
-(NSString*)upperStr:(NSString*)str{
[NSLocale currentLocale]];
NSString*lowerStr = [strlowercaseStringWithLocale:[NSLocalecurrentLocale]];
returnlowerStr;
}
-(NSArray*)sortMethod
{
NSArray*array=[self.dataArraysortedArrayUsingFunction:cmpcontext:NULL];
returnarray;
}
NSIntegercmp(NSString* a,NSString* b,void* p)
{
if([acompare:b] ==1){
returnNSOrderedDescending;//(1)
}else
returnNSOrderedAscending;//(-1)
}
+(void)sendMessage:(NSString*)phoneNum{
[[UIApplicationsharedApplication]openURL:
[NSURLURLWithString:[NSStringstringWithFormat:@"sms:%@",phoneNum]]];
}
-(id)initWithTarget:(id)target MessageNameArray:(NSArray*)array Message:(NSString*)str Block:(void(^)(int))a
{
if(self=[superinit]) {
self.target=target;
self.MessageBlock=a;
[selfshowViewMessageNameArray:arrayMessage:str];
}
returnself;
}
-(void)showViewMessageNameArray:(NSArray*)array Message:(NSString*)str{
if([MFMessageComposeViewControllercanSendText]) {
MFMessageComposeViewController*messageViewController = [[MFMessageComposeViewControlleralloc]init];
messageViewController.messageComposeDelegate=self;
messageViewController.recipients= array;
messageViewController.body=str;
[self.targetpresentViewController:messageViewControlleranimated:YEScompletion:nil];
[messageViewControllerrelease];
}
}
- (void)messageComposeViewController:(MFMessageComposeViewController*)controller didFinishWithResult:(MessageComposeResult)result
{
self.MessageBlock(result);
[controllerdismissViewControllerAnimated:YEScompletion:nil];
}
-(id)initWithTarget:(id)target PhoneView:(void(^)(BOOL,NSDictionary*))a
{
if(self=[superinit]) {
self.target=target;
self.PhoneBlock=a;
ABPeoplePickerNavigationController*peoplePicker = [[ABPeoplePickerNavigationControlleralloc]init];
peoplePicker.peoplePickerDelegate=self;
[self.targetpresentViewController:peoplePickeranimated:YEScompletion:nil];
[peoplePickerrelease];
}
returnself;
}
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
ABMutableMultiValueRefphoneMulti =ABRecordCopyValue(person,kABPersonPhoneProperty);
NSString* firstName=(NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty);
if(firstName==nil) {
firstName =@" ";
}
NSString* lastName=(NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty);
if(lastName==nil) {
lastName =@" ";
}
NSMutableArray*phones = [NSMutableArrayarrayWithCapacity:0];
for(inti =0; i<ABMultiValueGetCount(phoneMulti); i++) {
NSString*aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i)autorelease];
[phonesaddObject:aPhone];
}
NSDictionary*dic=@{@"firstName": firstName,@"lastName":lastName,@"phones":phones};
self.PhoneBlock(YES,dic);
[self.targetdismissViewControllerAnimated:YEScompletion:nil];
returnNO;
}
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
self.PhoneBlock(NO,nil);
[self.targetdismissViewControllerAnimated:YEScompletion:nil];
returnNO;
}
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController*)peoplePicker
{
self.PhoneBlock(NO,nil);
[self.targetdismissViewControllerAnimated:YEScompletion:nil];
}
4.第四步:在viewcontroller.h中導(dǎo)入以下內(nèi)容
viewcontroller.m中導(dǎo)入ZCAddressBook.h
- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
self= [superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];
if(self) {
}
returnself;
}
- (void)viewDidLoad
{
[superviewDidLoad];
NSArray*array=@[@"添加聯(lián)系人",@"獲得Vcard",@"短信群發(fā)",@"獲得指定聯(lián)系人信息",@"跳出程序發(fā)短信"];
for(inti=0; i<5; i++) {
UIButton*button=[UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(100, i*100,200,50);
[buttonsetTitle:array[i]forState:UIControlStateNormal];
[buttonsetTitleColor:[UIColorblackColor]forState:UIControlStateNormal];
button.tag=1000+i;
[buttonaddTarget:selfaction:@selector(buttonClick:)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
}
-(void)buttonClick:(UIButton*)button{
BOOLisSucceed;
NSMutableDictionary*dic;
NSArray*array;
switch(button.tag-1000) {
case0:
isSucceed=[[ZCAddressBookshareControl]addContactName:@"張三"phoneNum:@"34456789"withLabel:@"dfghjklvbn"];
NSLog(@"添加是否成功%d",isSucceed);
break;
case1:
//獲得Vcard
dic= [[ZCAddressBookshareControl]getPersonInfo];
//獲得序列索引
array=[[ZCAddressBookshareControl]sortMethod];
NSLog(@"Vcard%@~~~序列%@",dic,array);
break;
case2:
//撥打網(wǎng)絡(luò)電話
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8008808888"]];
//發(fā)送短信,群發(fā)惯雳,可以有指定內(nèi)容
[[ZCAddressBookalloc]initWithTarget:selfMessageNameArray:@[@"13811928431"]Message:@"發(fā)送消息的內(nèi)容"Block:^(inttype) {
NSLog(@"發(fā)送短信后的狀態(tài)");
}];
break;
case3:
//調(diào)用系統(tǒng)控件,選中后獲得指定人信息
[[ZCAddressBookalloc]initWithTarget:selfPhoneView:^(BOOLisSucceed,NSDictionary*dic) {
NSLog(@"從系統(tǒng)中獲得指定聯(lián)系人的信息%@",dic);
}];
break;
case4:
//跳出程序進(jìn)行發(fā)送短信
[ZCAddressBooksendMessage:@"13811928431"];
break;
default:
break;
}
}
好了鸿摇,這樣就大功告成了