關(guān)于通訊錄聯(lián)系人以及短信的處理

關(guān)于通訊錄和短信的運(yùn)用附鸽,需要先向工程中導(dǎo)入以下類庫(kù):

1.第一步:首先選擇工程的Build Phases->Link Binary With Libraries,點(diǎn)擊+添加類庫(kù)

圖1

2.第二步:下載pinyin.c和pinyin.h文件脱拼。下載地址


3.第三步:封裝單例對(duì)象ZCAddressBook


ZCAddressBook.h文件中導(dǎo)入以下類庫(kù)Foundation、MessageUI拒炎、AddressBookUI

圖2

復(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中

圖3

復(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)容

圖4

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;

}

}

好了鸿摇,這樣就大功告成了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末石景,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拙吉,更是在濱河造成了極大的恐慌潮孽,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筷黔,死亡現(xiàn)場(chǎng)離奇詭異往史,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)佛舱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門椎例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人请祖,你說(shuō)我怎么就攤上這事订歪。” “怎么了肆捕?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵刷晋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我慎陵,道長(zhǎng)掏秩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任荆姆,我火速辦了婚禮蒙幻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胆筒。我一直安慰自己邮破,他們只是感情好诈豌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抒和,像睡著了一般矫渔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摧莽,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天庙洼,我揣著相機(jī)與錄音,去河邊找鬼镊辕。 笑死油够,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的征懈。 我是一名探鬼主播石咬,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卖哎!你這毒婦竟也來(lái)了鬼悠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亏娜,失蹤者是張志新(化名)和其女友劉穎焕窝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體维贺,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡它掂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幸缕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晰韵,死狀恐怖发乔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雪猪,我是刑警寧澤栏尚,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站只恨,受9級(jí)特大地震影響译仗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜官觅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一纵菌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧休涤,春花似錦咱圆、人聲如沸笛辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)手幢。三九已至,卻和暖如春忱详,著一層夾襖步出監(jiān)牢的瞬間围来,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工匈睁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留监透,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓软舌,卻偏偏與公主長(zhǎng)得像才漆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佛点,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容