您的位置:首页 > 移动开发 > IOS开发

IOS开发笔记(12)IOS如何访问通讯录

2014-05-27 13:46 375 查看


引言:最近一个项目要求app能读取手机的通讯录。

其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的。幸好ios6.0 以后给了个权限控制。当打开app的时候你可以选择拒绝。


实现方法:

[plain] view
plaincopy

//读取所有联系人

-(void)ReadAllPeoples

{

//取得本地通信录名柄

ABAddressBookRef tmpAddressBook = nil;

if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {

tmpAddressBook=ABAddressBookCreateWithOptions(NULL, NULL);

dispatch_semaphore_t sema=dispatch_semaphore_create(0);

ABAddressBookRequestAccessWithCompletion(tmpAddressBook, ^(bool greanted, CFErrorRef error){

dispatch_semaphore_signal(sema);

});

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

dispatch_release(sema);

}

else

{

tmpAddressBook =ABAddressBookCreate();

}

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

if (tmpAddressBook==nil) {

return ;

};

NSArray* tmpPeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(tmpAddressBook);

for(id tmpPerson in tmpPeoples)

{

//获取的联系人单一属性:First name

NSString* tmpFirstName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonFirstNameProperty);

NSLog(@"First name:%@", tmpFirstName);

[tmpFirstName release];

//获取的联系人单一属性:Last name

NSString* tmpLastName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonLastNameProperty);

NSLog(@"Last name:%@", tmpLastName);

[tmpLastName release];

//获取的联系人单一属性:Nickname

NSString* tmpNickname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNicknameProperty);

NSLog(@"Nickname:%@", tmpNickname);

[tmpNickname release];

//获取的联系人单一属性:Company name

NSString* tmpCompanyname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonOrganizationProperty);

NSLog(@"Company name:%@", tmpCompanyname);

[tmpCompanyname release];

//获取的联系人单一属性:Job Title

NSString* tmpJobTitle= (NSString*)ABRecordCopyValue(tmpPerson, kABPersonJobTitleProperty);

NSLog(@"Job Title:%@", tmpJobTitle);

[tmpJobTitle release];

//获取的联系人单一属性:Department name

NSString* tmpDepartmentName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonDepartmentProperty);

NSLog(@"Department name:%@", tmpDepartmentName);

[tmpDepartmentName release];

//获取的联系人单一属性:Email(s)

ABMultiValueRef tmpEmails = ABRecordCopyValue(tmpPerson, kABPersonEmailProperty);

for(NSInteger j = 0; ABMultiValueGetCount(tmpEmails); j++)

{

NSString* tmpEmailIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);

NSLog(@"Emails%d:%@", j, tmpEmailIndex);

[tmpEmailIndex release];

}

CFRelease(tmpEmails);

//获取的联系人单一属性:Birthday

NSDate* tmpBirthday = (NSDate*)ABRecordCopyValue(tmpPerson, kABPersonBirthdayProperty);

NSLog(@"Birthday:%@", tmpBirthday);

[tmpBirthday release];

//获取的联系人单一属性:Note

NSString* tmpNote = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNoteProperty);

NSLog(@"Note:%@", tmpNote);

[tmpNote release];

//获取的联系人单一属性:Generic phone number

ABMultiValueRef tmpPhones = ABRecordCopyValue(tmpPerson, kABPersonPhoneProperty);

for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)

{

NSString* tmpPhoneIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);

NSLog(@"tmpPhoneIndex%d:%@", j, tmpPhoneIndex);

[tmpPhoneIndex release];

}

CFRelease(tmpPhones);

}

//释放内存

[tmpPeoples release];

CFRelease(tmpAddressBook);

}

解释下代码:由于ios6.0系统的升级,对客户隐私有了一个较大的提示。

以前

[plain] view
plaincopy

tmpAddressBook =ABAddressBookCreate();这样就可以读取了,但是现在要做一个判断了。可以具体看看代码。

[plain] view
plaincopy

把通讯录取出来放在一个array里面。这样你就可以对数组进行你的要求了。

[plain] view
plaincopy

备注:

苹果中文语言貌似有点问题。ios6.0 会提示你的app访问日历。。。。
然后网上查了下资料。可以参照微信访问通讯录的形式,给客户一个提示
他是在plist中 添加一项在XCode里显示的是Privacy - Contacts Usage Description。后面的string就是你要想提示的文字内容
“Privacy - Location Usage Description”。这个是定位位置提示。其他类似。



备注二:

分享一个测试经验,也是从网上看到的。
一把苹果的app访问位置或者通讯录,第一次都会有一个提示让你选择。
但是第二次及以后,即时删掉,也不会再出现了。
如果想再次出现,可以 设置-通用-还原-还原位置与隐私
这样你再次点击你的app就会再次出现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: