文档章节

ios(包括6、7)应用程序引用系统通讯录的方法 [亲测可行]

Align
 Align
发布于 2016/01/08 15:09
字数 1238
阅读 20
收藏 0

     由于ios系统对用户隐私的控制,第三方应用程序只能通过苹果官方接口调用系统通讯录,不能像android那样直接操作通讯录数据库。
     一般地,使用系统自带通讯录的方法有两种,一种是直接将整个通讯录引入到应用程序,另一种是逐条读取通讯录中的每一条联系人信息。下面我们就一一详解。

1 直接引用整个通讯录

使用的类:ABPeoplePickerNavigationController
方法:

复制代码

在LocalAddressBookController.h文件中 <UIKit/UIKit.h> <AddressBook/AddressBook.h> <AddressBookUI/AddressBookUI.h> LocalAddressBookController : UIViewController<ABPersonViewControllerDelegate,ABPeoplePickerNavigationControllerDelegate,ABNewPersonViewControllerDelegate>
{
    ABPeoplePickerNavigationController *picker;
    ABNewPersonViewController *personViewController;
}在LocalAddressBookController.m文件中   LocalAddressBookController

- ()initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];     (self) {        
    }     self;
}

- ()didReceiveMemoryWarning
{    
    [super didReceiveMemoryWarning];    
    } mark - View lifecycle

- ()viewDidLoad
{
    [super viewDidLoad];
    
    picker = [[ABPeoplePickerNavigationController alloc]init];
    picker.view.frame = CGRectMake(, , Screen_width, Screen_height-);
    picker.peoplePickerDelegate = self;
    picker. = self;                   
    [picker setHidesBottomBarWhenPushed:YES];
    [picker setNavigationBarHidden:NO animated:NO];//显示上方的NavigationBar和搜索框
    [self.view addSubview:picker.view];
} mark UINavigationControllerDelegate methods- ()navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(,,,)];
    UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom];
    [viewController.navigationItem setRightBarButtonItem:btn animated:NO];
    [btn release];
    [custom release];
} mark - peoplePickerDelegate Methods
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    NSLog(, (NSString*)ABRecordCopyCompositeName(person)); 
     YES;
}
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{    
     YES;
}
-(BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{     YES;
} -()peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{    
    [picker dismissModalViewControllerAnimated:YES];
}
//……

复制代码

ios6 运行效果:

ios7 运行效果:

 

经验:

当我们将系统通讯录整个引入的时候,在通讯录的右上角有一个系统自带的“取消”按钮。如何才能将这个取消按钮隐藏呢?

(1)方法1:如果你的应用程序是用企业证书开发,不需要提交到appStore进行审核,那么答案非常简单,为响应的piker增加如下代码即可:

[picker setAllowsCancel:NO];

(2)方法二:上面的方法是非公开方法,是无法通过appStore审核的。如果想通过审核。可以尝试使用如下方法:

复制代码

前提:设置 picker.delegate = self;
然后实现如下委托方法
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f,0.0f,0.0f)]; 
  UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom]; 
  //UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
  [viewController.navigationItem setRightBarButtonItem:btn animated:NO]; 
  [btn release]; 
  [custom release]; 
}

复制代码

或者:(比上面更好)

复制代码

前提:设置 picker.delegate = self;
然后实现如下委托方法,下面实现的效果,要比上面的好。上面实现的效果,当点击“搜索”框时,“取消”按钮还会重新出现。
- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {    
    // Here we want to remove the 'Cancel' button, but only if we're showing    // either of the ABPeoplePickerNavigationController's top two controllers
    if ([navigationController.viewControllers indexOfObject:viewController] <= 1) {
        viewController.navigationItem.rightBarButtonItem = nil;
    }
}

复制代码

 

2、逐条读取通讯录中的每一条联系人信息。

方法:在上述类中,直接添加如下方法即可

复制代码

在LocalAddressBookController.h文件中 <UIKit/UIKit.h> <AddressBook/AddressBook.h> <AddressBookUI/AddressBookUI.h> LocalAddressBookController : 
{
    UITextView *textView;
}在LocalAddressBookController.m文件中   LocalAddressBookController

- ()initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];     (self) {        
    }     self;
}

- ()didReceiveMemoryWarning
{    
    [super didReceiveMemoryWarning];    
    } mark - View lifecycle

- ()viewDidLoad
{
    [super viewDidLoad];    
    textView = [[UITextView alloc]initWithFrame:CGRectMake(, , Screen_width, Screen_height)];
    [self getAddressBook];
    [self.view addSubview:textView];
}-()getAddressBook
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    
    CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addressBook);    
    ( i = ; i < CFArrayGetCount(results); i++)
    {
        ABRecordRef person = CFArrayGetValueAtIndex(results, i);        
        NSString *personName = (NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);        (personName != nil)
            textView.text = [textView.text stringByAppendingFormat:,personName];        
        NSString *lastname = (NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);        (lastname != nil)
            textView.text = [textView.text stringByAppendingFormat:,lastname];        
        NSString *middlename = (NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty);        (middlename != nil)
            textView.text = [textView.text stringByAppendingFormat:,middlename];        
        NSString *prefix = (NSString*)ABRecordCopyValue(person, kABPersonPrefixProperty);        (prefix != nil)
            textView.text = [textView.text stringByAppendingFormat:,prefix];        
        NSString *suffix = (NSString*)ABRecordCopyValue(person, kABPersonSuffixProperty);        (suffix != nil)
            textView.text = [textView.text stringByAppendingFormat:,suffix];        
        NSString *nickname = (NSString*)ABRecordCopyValue(person, kABPersonNicknameProperty);        (nickname != nil)
            textView.text = [textView.text stringByAppendingFormat:,nickname];        
        NSString *firstnamePhonetic = (NSString*)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty);        (firstnamePhonetic != nil)
            textView.text = [textView.text stringByAppendingFormat:,firstnamePhonetic];        
        NSString *lastnamePhonetic = (NSString*)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty);        (lastnamePhonetic != nil)
            textView.text = [textView.text stringByAppendingFormat:,lastnamePhonetic];        
        NSString *middlenamePhonetic = (NSString*)ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty);        (middlenamePhonetic != nil)
            textView.text = [textView.text stringByAppendingFormat:,middlenamePhonetic];        
        NSString *organization = (NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty);        (organization != nil)
            textView.text = [textView.text stringByAppendingFormat:,organization];        
        NSString *jobtitle = (NSString*)ABRecordCopyValue(person, kABPersonJobTitleProperty);        (jobtitle != nil)
            textView.text = [textView.text stringByAppendingFormat:,jobtitle];        
        NSString *department = (NSString*)ABRecordCopyValue(person, kABPersonDepartmentProperty);        (department != nil)
            textView.text = [textView.text stringByAppendingFormat:,department];        
        NSDate *birthday = (NSDate*)ABRecordCopyValue(person, kABPersonBirthdayProperty);        (birthday != nil)
            textView.text = [textView.text stringByAppendingFormat:,birthday];        
        NSString *note = (NSString*)ABRecordCopyValue(person, kABPersonNoteProperty);        (note != nil)
            textView.text = [textView.text stringByAppendingFormat:,note];        
        NSString *firstknow = (NSString*)ABRecordCopyValue(person, kABPersonCreationDateProperty);
        NSLog(,firstknow);        
        NSString *lastknow = (NSString*)ABRecordCopyValue(person, kABPersonModificationDateProperty);
        NSLog(,lastknow);        
        
        ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty);         emailcount = ABMultiValueGetCount(email);         ( x = ; x < emailcount; x++)
        {            
            NSString* emailLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, x));            
            NSString* emailContent = (NSString*)ABMultiValueCopyValueAtIndex(email, x);
            textView.text = [textView.text stringByAppendingFormat:,emailLabel,emailContent];
        }        
        ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);         count = ABMultiValueGetCount(address);        
        ( j = ; j < count; j++)
        {            
            NSString* addressLabel = (NSString*)ABMultiValueCopyLabelAtIndex(address, j);
            textView.text = [textView.text stringByAppendingFormat:,addressLabel];            
            NSDictionary* personaddress =(NSDictionary*) ABMultiValueCopyValueAtIndex(address, j);
            NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];            (country != nil)
                textView.text = [textView.text stringByAppendingFormat:,country];
            NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];            (city != nil)
                textView.text = [textView.text stringByAppendingFormat:,city];
            NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];            (state != nil)
                textView.text = [textView.text stringByAppendingFormat:,state];
            NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];            (street != nil)
                textView.text = [textView.text stringByAppendingFormat:,street];
            NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];            (zip != nil)
                textView.text = [textView.text stringByAppendingFormat:,zip];
            NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];            (coutntrycode != nil)
                textView.text = [textView.text stringByAppendingFormat:,coutntrycode];
        }        
        
        ABMultiValueRef dates = ABRecordCopyValue(person, kABPersonDateProperty);         datescount = ABMultiValueGetCount(dates);         ( y = ; y < datescount; y++)
        {            
            NSString* datesLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, y));            
            NSString* datesContent = (NSString*)ABMultiValueCopyValueAtIndex(dates, y);
            textView.text = [textView.text stringByAppendingFormat:,datesLabel,datesContent];
        }        
        CFNumberRef recordType = ABRecordCopyValue(person, kABPersonKindProperty);         (recordType == kABPersonKindOrganization) {            
            NSLog();
        }  {            
            NSLog();
        }        
        
        
        ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty);         ( l = ; l < ABMultiValueGetCount(instantMessage); l++)
        {            
            NSString* instantMessageLabel = (NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, l);
            textView.text = [textView.text stringByAppendingFormat:,instantMessageLabel];            
            NSDictionary* instantMessageContent =(NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, l);
            NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];            (username != nil)
                textView.text = [textView.text stringByAppendingFormat:,username];
            
            NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey];            (service != nil)
                textView.text = [textView.text stringByAppendingFormat:,service];
        }        
        
        ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);         ( k = ; k<ABMultiValueGetCount(phone); k++)
        {            
            NSString * personPhoneLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k));            
            NSString * personPhone = (NSString*)ABMultiValueCopyValueAtIndex(phone, k);
            
            textView.text = [textView.text stringByAppendingFormat:,personPhoneLabel,personPhone];
        }        
        
        ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty);         ( m = ; m < ABMultiValueGetCount(url); m++)
        {            
            NSString * urlLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, m));            
            NSString * urlContent = (NSString*)ABMultiValueCopyValueAtIndex(url,m);
            
            textView.text = [textView.text stringByAppendingFormat:,urlLabel,urlContent];
        }        
        
        NSData *image = (NSData*)ABPersonCopyImageData(person);
        
        
        UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(, , , )];
        [myImage setImage:[UIImage imageWithData:image]];
        myImage.opaque = YES;
        [textView addSubview:myImage];
    }
    
    CFRelease(results);
    CFRelease(addressBook);
}
//……
@end

复制代码

 

ios7运行效果:


© 著作权归作者所有

Align
粉丝 12
博文 65
码字总数 71695
作品 0
昌平
高级程序员
私信 提问
TeeChart .NET for iOS图表开发入门教程

去年,TeeChart 为iOS图表开发专门发布了TeeChart NET for iOS(包含在TeeChart Mobile中,TeeChart8.5折进行中),相信很多人都对其感兴趣。慧都为大家制作了TeeChart NET for iOS的入门教程...

裸奔的火腿肠
2014/02/25
75
0
Telephony Function(通话和短信功能)

概述 在开发应用时,我们经常遇到需要调用系统内置的应用来完成一些功能,如拨打电话、发送短信和电子邮件、选择联系人等。Android中利用Intend不仅可以调用同意应用程序内Activity,也可以调...

失足处男的倒霉孩子
2013/12/27
766
0
苹果开放 iOS 6 正式版下载,抢先升级体验

今天凌晨,苹果正式放出了iOS 6的下载,升级还是不升级,就看你的了。中意越狱的同学,记得使用TinyUmbrella 备份SHSH。 iOS 6兼容支持iPhone 3GS,iPhone 4,iPhone 4S,iPad 3,iPad 2以及...

oschina
2012/09/20
1K
12
现有新的iOS更新可用,请从iOS12 beta版进行更新.解决方案

问题描述: ios系统一直弹出“现有新的iOS更新可用,请从iOS12 beta版进行更新”的提示,很烦的。 应该只出现在安装测试版ios12的手机上。 解决方案: 删除描述文件无法解决。 有网友机制的把...

江海不系舟
2018/08/31
0
0
苹果将为 iOS 8.3 和 iOS 9 推出公测版,为减少 Bug

为了在正式版发布前减少 iOS 系统的 Bug 数量,苹果计划为 iOS 操作系统推出公测项目。根据熟悉该计划的消息人士爆料,去年苹果为 OS X Yosemite 推出了相似的公测计划,苹果计划通过目前的 ...

oschina
2015/02/21
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
46分钟前
7
0
MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
今天
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
今天
6
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
今天
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部