通讯录, 获取联系人, 删除联系人
2016-01-28 12:00
501 查看
<pre name="code" class="objc">// // BuddyManager.h // wincall // // Created by User on 15/12/8. // Copyright © 2015年 Zero. All rights reserved. // #import <Foundation/Foundation.h> #import <AddressBook/AddressBook.h> @interface ContactsManager : NSObject @property (nonatomic, strong) NSArray *persons; @property (nonatomic, strong) NSMutableArray *cpassBuddies; @property (nonatomic) ABAddressBookRef addressBook; @property (nonatomic, assign) BOOL isimage; + (instancetype)share; -(void)getPersonInfo; + (NSString *)firstCharactor:(NSString *)aString; + (void)groupingByInitialWithDataSource:(NSArray*)dataSource resureBlock:(void (^)(NSMutableDictionary*result,NSArray *allkeys))block ; + (NSString*)castSpecialChar:(NSString*)cha; //删除联系人 - (BOOL)deletePerson:(ABRecordRef)ref; +(NSMutableArray *)searchScopeWithSearchText:(NSString *)searchText FromeArray:(NSArray *)array; @end
// // BuddyManager.m // wincall // // Created by User on 15/12/8. // Copyright © 2015年 Zero. All rights reserved. // #import "ContactsManager.h" #import "ContactsModel.h" #import "PinYinForObjc.h" #define emptyString(value) value == nil?@"":value @implementation ContactsManager - (instancetype)init { self = [super init]; return self; } +(instancetype)share { static ContactsManager* base = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ base = [[ContactsManager alloc] init];; // base.addressBook = ABAddressBookCreateWithOptions(NULL, NULL); }); return base; } #pragma mark 获取通讯录内容 -(void)getPersonInfo{ //取得本地通信录名柄 NSMutableArray *array = [[NSMutableArray alloc] init]; // ABAddressBookRef addBook = [[ContactsManager share] addressBook]; ABAddressBookRef addBook = ABAddressBookCreateWithOptions(NULL, NULL); //等待同意后向下执行创建信号,发出信号, 等待信号 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addBook, ^(bool granted, CFErrorRef error) { dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); //取得本地所有联系人记录 CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addBook); for(int i = 0; i < CFArrayGetCount(results); i++) { ABRecordRef person = CFArrayGetValueAtIndex(results, i); //读取firstname NSString *personName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); //读取lastname NSString *lastname = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty); //读取middlename NSString *middlename = (__bridge NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty); NSString *name = [NSString stringWithFormat:@"%@%@%@",emptyString(lastname),emptyString(personName),emptyString(middlename)]; //读取organization公司 NSString *organization = (__bridge NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty); NSData *image = (__bridge NSData*)ABPersonCopyImageData(person); UIImage *headImage = [UIImage imageWithData:image]; if (!headImage) { headImage = [self backgroundImageWithRow]; _isimage = NO; } else { _isimage = YES; } //读取电话多值 ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); if (ABMultiValueGetCount(phone) == 0) { ContactsModel *model = [[ContactsModel alloc] init]; //读取照片 model.image = headImage; model.isImage = _isimage; //读取名字 if(name.length == 0){ name = organization; } model.modelName = name; if(name != nil) { model.pinyin = [ContactsManager hanziToPinyin:name]; if(model.pinyin.length >0) { model.fristCharacter = [NSString stringWithFormat:@"%c",[model.pinyin characterAtIndex:0]]; } } model.person = person; [array addObject:model]; } for (int k = 0; k<ABMultiValueGetCount(phone); k++) { ContactsModel *model = [[ContactsModel alloc] init]; NSMutableArray *phones = [[NSMutableArray alloc] init]; NSString * personPhone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, k); personPhone =[ContactsManager castSpecialChar:personPhone]; if (personPhone.length > 10) { NSString *cut = [personPhone substringToIndex:[personPhone length] - 6]; if ([cut hasPrefix:@"96833"] || [cut hasPrefix:@"02196833"]) { // [wincalls addObject:personPhone]; model.wincallPhone = personPhone; model.iswincall = YES; NSLog(@"phone %@--%@",name,personPhone); }else { NSLog(@"wicnall %@--%@",name,personPhone); model.iswincall = NO; model.phone = personPhone; } } else { NSLog(@"wicnall %@--%@",name,personPhone); model.iswincall = NO; model.phone = personPhone; } //读取照片 model.image = headImage; model.isImage = _isimage; //读取名字 if(name.length == 0){ name = organization; } model.modelName = name; if(name != nil) { model.pinyin = [ContactsManager hanziToPinyin:name]; if(model.pinyin.length >0) { model.fristCharacter = [NSString stringWithFormat:@"%c",[model.pinyin characterAtIndex:0]]; } } model.person = person; [array addObject:model]; [phones addObject:personPhone]; model.phoneValues = phones; } } _persons = array; CFRelease(results);//new } //随机背景图片 - (UIImage*)backgroundImageWithRow{ UIImage *aquaImage = [UIImage imageNamed:@"aqua"]; UIImage *blueImage = [UIImage imageNamed:@"blue"]; UIImage *greenImage = [UIImage imageNamed:@"green"]; UIImage *pinkImage = [UIImage imageNamed:@"pink"]; UIImage *purpleImage = [UIImage imageNamed:@"purple"]; UIImage *yellowImage = [UIImage imageNamed:@"yellow"]; NSArray *array = @[aquaImage, blueImage, greenImage, pinkImage, purpleImage, purpleImage, yellowImage]; int i = arc4random() %6; return array[i]; } //获取拼音首字母(传入汉字字符串, 返回大写拼音首字母) + (NSString *)firstCharactor:(NSString *)aString { if (aString == nil) { return aString; } //转成了可变字符串 NSMutableString *str = [NSMutableString stringWithString:aString]; //先转换为带声调的拼音 CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO); //再转换为不带声调的拼音 CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO); //转化为大写拼音 NSString *pinYin = [str capitalizedString]; //获取并返回首字母 // return [pinYin substringToIndex:1]; return pinYin; } //根据封装字典 #pragma mark 根据首字母分组 + (void)groupingByInitialWithDataSource:(NSArray*)dataSource resureBlock:(void (^)(NSMutableDictionary*result,NSArray *allkeys))block { NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; NSMutableArray * allData = [[NSMutableArray alloc] init]; for (int i = 0;i<dataSource.count;i++) { NSMutableArray * temp = [[NSMutableArray alloc] init]; 4000 id obj = [dataSource objectAtIndex:i]; ContactsModel *model; NSString *pinyin; NSString *fristCharacter; if([obj isKindOfClass:[ContactsModel class]]){ model = obj; pinyin = [ContactsManager hanziToPinyin:model.modelName]; } int asciiCode; if(pinyin.length > 0){ asciiCode = [pinyin characterAtIndex:0]; fristCharacter = [NSString stringWithFormat:@"%c",[pinyin characterAtIndex:0]]; }else{ asciiCode = 0; } /* *如果首字符满足条件,则正常分组;否则 分到 ‘#’,存储到allData里 */ if(('a'<=asciiCode&&asciiCode<='z')||('A'<=asciiCode&&asciiCode<='Z')) { if([dic objectForKey:fristCharacter]) { NSArray *exist = [dic objectForKey:fristCharacter]; [temp addObjectsFromArray:exist]; [temp addObject:obj]; }else{ [temp addObject:obj]; } [dic setObject:temp forKey:fristCharacter]; }else{ [allData addObject:obj]; } } if(allData.count > 0){ [dic setObject:allData forKey:@"a"]; } //Key值排序 NSArray *_keys = [dic allKeys]; _keys = [_keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ NSComparisonResult result = [obj1 compare:obj2]; return result == NSOrderedDescending; }]; block(dic,_keys); } //删除联系人 - (BOOL)deletePerson:(ABRecordRef)ref{ ABAddressBookRef address = [[ContactsManager share]addressBook]; CFErrorRef error = nil; ABAddressBookRemoveRecord(address, ref, &error); //保存电话本 return ABAddressBookSave(address,&error); } #pragma mark -去重复对象 + (NSMutableArray *)arrayWithMemberIsOnly:(NSMutableArray *)array { NSMutableArray *categoryArray = [[NSMutableArray alloc] init]; for (unsigned i = 0; i < [array count]; i++) { if ([categoryArray containsObject:[array objectAtIndex:i]] == NO){ [categoryArray addObject:[array objectAtIndex:i]]; } } return categoryArray; } /* *去掉特殊字符 */ + (NSString*)castSpecialChar:(NSString*)cha{ cha = [cha stringByReplacingOccurrencesOfString:@"+86" withString:@""]; cha = [cha stringByReplacingOccurrencesOfString:@"-" withString:@""]; cha = [cha stringByReplacingOccurrencesOfString:@" " withString:@""]; cha = [cha stringByReplacingOccurrencesOfString:@" " withString:@""]; cha = [cha stringByReplacingOccurrencesOfString:@"(" withString:@""]; cha = [cha stringByReplacingOccurrencesOfString:@")" withString:@""]; NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%+-*=_\\|~<>$€^• '@#$%^&*()_'\""]; return [[cha componentsSeparatedByCharactersInSet: set]componentsJoinedByString:@""]; } #pragma mark - 汉字转拼音 + (NSString*)hanziToPinyin:(NSString*)hanzi{ HanyuPinyinOutputFormat *outputFormat=[[HanyuPinyinOutputFormat alloc] init]; [outputFormat setToneType:ToneTypeWithoutTone]; [outputFormat setVCharType:VCharTypeWithV]; [outputFormat setCaseType:CaseTypeLowercase]; NSString *outputPinyin = [PinyinHelper toHanyuPinyinStringWithNSString:hanzi withHanyuPinyinOutputFormat:outputFormat withNSString:@""]; return [outputPinyin uppercaseString]; } //搜索 + (BOOL)isIncludeChineseInString:(NSString*)str { for (int i=0; i<str.length; i++) { unichar ch = [str characterAtIndex:i]; if (0x4e00 < ch && ch < 0x9fff) { return true; } } return false; } +(NSMutableArray *)searchScopeWithSearchText:(NSString *)searchText FromeArray:(NSArray *)array { NSMutableArray * searchResults = [[NSMutableArray alloc]init]; if (searchText.length>0&&![ContactsManager isIncludeChineseInString:searchText]) { for (int i=0; i<array.count; i++) { ContactsModel *model = array[i]; NSString *name = model.modelName; if ([ContactsManager isIncludeChineseInString:name]) { NSString *tempPinYinStr = [PinYinForObjc chineseConvertToPinYin:name]; NSRange titleResult=[tempPinYinStr rangeOfString:searchText options:NSCaseInsensitiveSearch]; if (titleResult.length>0) { [searchResults addObject:name]; } NSString *tempPinYinHeadStr = [PinYinForObjc chineseConvertToPinYinHead:name]; NSRange titleHeadResult=[tempPinYinHeadStr rangeOfString:searchText options:NSCaseInsensitiveSearch]; if (titleHeadResult.length>0) { [searchResults addObject:name]; } } else { NSRange titleResult=[name rangeOfString:searchText options:NSCaseInsensitiveSearch]; if (titleResult.length>0) { [searchResults addObject:name]; } } } } else if (searchText.length>0&&[ContactsManager isIncludeChineseInString:searchText]) { for (NSString *tempStr in array) { NSRange titleResult=[tempStr rangeOfString:searchText options:NSCaseInsensitiveSearch]; if (titleResult.length>0) { [searchResults addObject:tempStr]; } } } return searchResults; } @end
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android获取手机通讯录、sim卡联系人及调用拨号界面方法
- Android实现仿通讯录侧边栏滑动SiderBar效果代码
- Android、iOS和Windows Phone中的推送技术详解
- Python 实现简单的电话本功能
- Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
- IOS 改变键盘颜色代码