RYPersonInfo.h
#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>
@interface RYPersonInfo : NSObject
/**
* 单值信息
*/
#define PROPERTY_STR_READONLY(name) @property (nonatomic, copy) NSString *name;
// 姓
PROPERTY_STR_READONLY(firstName)
// 名
PROPERTY_STR_READONLY(lastName)
// 中间名
PROPERTY_STR_READONLY(middlename)
// 全名
PROPERTY_STR_READONLY(fullName)
// 搜索索引
PROPERTY_STR_READONLY(firstSpell)
// 前缀
PROPERTY_STR_READONLY(prefix)
// 后缀
PROPERTY_STR_READONLY(suffix)
// 昵称
PROPERTY_STR_READONLY(nickname)
// 姓_音标
PROPERTY_STR_READONLY(firstnamePhonetic)
// 名_音标
PROPERTY_STR_READONLY(lastnamePhonetic)
// 中间名_音标
PROPERTY_STR_READONLY(middlenamePhonetic)
// 公司
PROPERTY_STR_READONLY(organization)
// 工作
PROPERTY_STR_READONLY(jobtitle)
// 部门
PROPERTY_STR_READONLY(department)
// 生日
PROPERTY_STR_READONLY(birthday)
// 备忘录
PROPERTY_STR_READONLY(note)
// 第一次创建用户信息的时间
PROPERTY_STR_READONLY(firstknow)
// 最后一次更改用户信息的时间
PROPERTY_STR_READONLY(lastknow)
// 名片类型(company/person)
PROPERTY_STR_READONLY(kind)
// 多值信息
#define PROPERTY_ARR_READONLY(name) @property (nonatomic, strong) NSArray *name;
// 邮箱
PROPERTY_ARR_READONLY(email)
// 地址
PROPERTY_ARR_READONLY(address)
// 日期
PROPERTY_ARR_READONLY(dates)
// iMessage
PROPERTY_ARR_READONLY(iMessage)
// 电话号码
PROPERTY_ARR_READONLY(phone)
// URL链接
PROPERTY_ARR_READONLY(url)
#define PROPERTY_IMG_READONLY(name) @property (nonatomic, strong) UIImage *name;
// 图片
//PROPERTY_IMG_READONLY(image)
/**
* 初始化方法
*
* @param ref 联系人属性
*
* @return 实例对象
*/
- (id)initWithABRecordRef:(ABRecordRef)ref;
/**
* 初始化类方法
*
* @param ref 联系人属性
*
* @return 实例对象
*/
+ (id)personInfoWithABRecordRef:(ABRecordRef)ref;
@end
RYPersonInfo.m
#import "RYPersonInfo.h"
#define nullStrToEmpty(str)
[str rangeOfString:@"null"].location==0? @"" : str
/**
* 单值信息
*/
#define GET_PROPERTY_METHOD(property, property_key)
- (NSString *)property {
return (NSString *)CFBridgingRelease(ABRecordCopyValue(_recordRef, property_key));
}
/**
* 多值信息
*/
#define DICT_ADD_STR_FOR_KEY(dict, str, key)
if (str) {
[dict setObject:str forKey:key];
}
#define GET_PROPERTY_SIGLE_VALUE_METHOD(property, property_key)
- (NSArray *)property
{
NSMutableArray *rtnArray = [NSMutableArray array];
ABMultiValueRef ref = ABRecordCopyValue(_recordRef, property_key);
long count = ABMultiValueGetCount(ref);
for (int i = 0; i < count; i++)
{
NSString* label = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(ref, i));
NSString* content = (__bridge NSString*)ABMultiValueCopyValueAtIndex(ref, i);
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
DICT_ADD_STR_FOR_KEY(dict, content, label);
[rtnArray addObject:dict];
}
return rtnArray;
}
@interface RYPersonInfo ()
@property (nonatomic , assign)ABRecordRef recordRef;
@end
@implementation RYPersonInfo
- (id)initWithABRecordRef:(ABRecordRef)ref {
if (self = [super init]) {
_recordRef = ref;
}
return self;
}
+ (id)personInfoWithABRecordRef:(ABRecordRef)ref {
return [[[self class] alloc] initWithABRecordRef:ref];
}
GET_PROPERTY_METHOD( firstName , kABPersonFirstNameProperty);
GET_PROPERTY_METHOD( lastName , kABPersonLastNameProperty);
GET_PROPERTY_METHOD( middlename , kABPersonMiddleNameProperty);
GET_PROPERTY_METHOD( prefix , kABPersonPrefixProperty);
GET_PROPERTY_METHOD( suffix , kABPersonSuffixProperty);
GET_PROPERTY_METHOD( nickname , kABPersonNicknameProperty);
GET_PROPERTY_METHOD( organization , kABPersonOrganizationProperty);
GET_PROPERTY_METHOD( jobtitle , kABPersonJobTitleProperty);
GET_PROPERTY_METHOD( department , kABPersonDepartmentProperty);
GET_PROPERTY_METHOD( birthday , kABPersonBirthdayProperty);
GET_PROPERTY_METHOD( note , kABPersonNoteProperty);
GET_PROPERTY_METHOD( firstknow , kABPersonCreationDateProperty);
GET_PROPERTY_METHOD( lastknow , kABPersonModificationDateProperty);
GET_PROPERTY_METHOD( firstnamePhonetic , kABPersonFirstNamePhoneticProperty);
GET_PROPERTY_METHOD( lastnamePhonetic , kABPersonLastNamePhoneticProperty);
GET_PROPERTY_METHOD( middlenamePhonetic, kABPersonMiddleNamePhoneticProperty);
GET_PROPERTY_SIGLE_VALUE_METHOD(email, kABPersonEmailProperty)
GET_PROPERTY_SIGLE_VALUE_METHOD(dates, kABPersonDateProperty)
GET_PROPERTY_SIGLE_VALUE_METHOD(url , kABPersonURLProperty)
GET_PROPERTY_SIGLE_VALUE_METHOD(phone, kABPersonPhoneProperty)
- (NSString *)kind
{
NSString *rtnStr = nil;
CFNumberRef recordType = ABRecordCopyValue(_recordRef, kABPersonKindProperty);
if (recordType == kABPersonKindOrganization) {
rtnStr = @"company";
} else {
rtnStr = @"person";
}
return rtnStr;
}
- (NSArray *)iMessage
{
NSMutableArray *rtnArray = [NSMutableArray array];
ABMultiValueRef instantMessage = ABRecordCopyValue(_recordRef, kABPersonInstantMessageProperty);
for (int i = 1; i < ABMultiValueGetCount(instantMessage); i++)
{
NSString* label = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, i);
NSDictionary* content =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, i);
NSMutableDictionary *imessageInfoDict = [NSMutableDictionary dictionary];
NSString* username = [content valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];
NSString* service = [content valueForKey:(NSString *)kABPersonInstantMessageServiceKey];
DICT_ADD_STR_FOR_KEY(imessageInfoDict, username, @"username");
DICT_ADD_STR_FOR_KEY(imessageInfoDict, service, @"service");
NSDictionary *imessageDict = @{label: imessageInfoDict};
[rtnArray addObject:imessageDict];
}
return rtnArray;
}
-(NSArray *)address
{
NSMutableArray *rtnArray = [NSMutableArray array];
ABMultiValueRef address = ABRecordCopyValue(_recordRef, kABPersonAddressProperty);
long count = ABMultiValueGetCount(address);
for(int i = 0; i < count; i++)
{
NSString* addressLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(address, i);
NSDictionary* personaddress =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(address, i);
NSMutableDictionary *addressInfoDict = [NSMutableDictionary dictionary];
NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];
NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
DICT_ADD_STR_FOR_KEY(addressInfoDict, country, @"country");
DICT_ADD_STR_FOR_KEY(addressInfoDict, city, @"city");
DICT_ADD_STR_FOR_KEY(addressInfoDict, state, @"state");
DICT_ADD_STR_FOR_KEY(addressInfoDict, street, @"street");
DICT_ADD_STR_FOR_KEY(addressInfoDict, zip, @"zip");
DICT_ADD_STR_FOR_KEY(addressInfoDict, coutntrycode, @"coutntrycode");
NSDictionary *addressDict = @{addressLabel: addressInfoDict};
[rtnArray addObject:addressDict];
}
return rtnArray;
}
//- (UIImage *)image
//{
// NSData *data = (__bridge NSData*)ABPersonCopyImageData(_recordRef);
// return [UIImage imageWithData:data];
//}
#pragma mark -
#pragma mark - CustomProperty
/**
* 全名
*/
- (NSString *)fullName
{
return [NSString stringWithFormat:@"%@%@%@",
nullStrToEmpty(self.lastName),
nullStrToEmpty(self.middlename),
nullStrToEmpty(self.firstName)];
}
/**
* 首字母
*/
- (NSString *)firstSpell
{
return getFirstSpell(self.fullName);
}
/**
* 输出模型所有信息
*/
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ -- InfoPacket",
self.fullName];
}
/**
* 获取首字母
*/
NSString* getFirstSpell(NSString *fullName)
{
NSMutableString *ms = [[NSMutableString alloc] initWithString:fullName];
CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO);
CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO);
if (fullName.length > 0)
return [[ms substringWithRange:NSMakeRange(0, 1)] lowercaseString];
else
return @"#";
}
@end










