123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- //
- // JXAddressBook.m
- // shiku_im
- //
- // Created by p on 2017/4/14.
- // Copyright © 2017年 Reese. All rights reserved.
- //
- #import "JXAddressBook.h"
- #import <AddressBook/AddressBook.h>
- #import <Contacts/Contacts.h>
- #import "FMDatabase.h"
- #import "FMResultSet.h"
- #import "JSONKit.h"
- #define kPhoneNumPath [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/phoneNum_%@.plist",MY_USER_ID]]
- @interface JXAddressBook ()
- @property (nonatomic, strong) NSArray *locPhoneNums;
- @property (nonatomic, assign) ABAddressBookRef addressBookRef;
- @property (nonatomic, strong) NSDictionary *addressBookDic;
- @end
- @implementation JXAddressBook
- static JXAddressBook *shared;
- +(JXAddressBook*)sharedInstance{
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- shared=[[JXAddressBook alloc]init];
- });
- return shared;
- }
- - (instancetype)init {
- if ([super init]) {
- _tableName = @"addressBook";
-
- }
-
- return self;
- }
- // 上传手机通讯录联系人
- - (void) uploadAddressBookContacts {
- self.locPhoneNums = nil;
- // 判断通讯录是否授权
- ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();
- ABAddressBookRef addressBookRef = ABAddressBookCreate();
- if (authorizationStatus == kABAuthorizationStatusNotDetermined) {
- // 请求授权
- ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
- if (granted) { // 授权成功
- [shared upLoadAddressBook];
- NSLog(@"授权成功!");
- } else { // 授权失败
- NSLog(@"授权失败!");
- }
- });
- }
-
- _addressBookRef = ABAddressBookCreate();
- // 注册通讯录回调
- ABAddressBookRegisterExternalChangeCallback(_addressBookRef, ContactsChangeCallback, nil);
- dispatch_sync(dispatch_get_global_queue(0, 0), ^{
- [self upLoadAddressBook];
- });
-
- if (addressBookRef) {
- CFRelease(addressBookRef);
- }
- }
- // 获取通讯录
- - (NSDictionary *) getMyAddressBook {
- // 1. 判读授权
- ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();
- if (authorizationStatus != kABAuthorizationStatusAuthorized) {
-
- NSLog(@"没有授权");
- return nil;
- }
-
- //获取当前联系人的数组
- // NSMutableArray *peopleArray = [[NSMutableArray alloc]init];
- NSMutableDictionary *dict = [NSMutableDictionary dictionary];
- CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(_addressBookRef);
- long count = CFArrayGetCount(arrayRef);
- for (int i = 0; i < count; i++) {
- //获取联系人对象的引用
- ABRecordRef people = CFArrayGetValueAtIndex(arrayRef, i);
- // 名
- NSString * oldFirstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
- if (!oldFirstName) {
- oldFirstName = @"";
- }
- // 姓
- NSString * oldLastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
- if (!oldLastName) {
- oldLastName = @"";
- }
-
- NSString *name;
- NSString *lang = [g_default stringForKey:kLocalLanguage];
-
- if ([JXMyTools isChineseLanguage:lang]) {
- name = [NSString stringWithFormat:@"%@%@",oldLastName, oldFirstName];
- }else {
- name = [NSString stringWithFormat:@"%@ %@",oldFirstName, oldLastName];
- }
-
- ABMultiValueRef phones = ABRecordCopyValue(people, kABPersonPhoneProperty);
- for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {
- NSString *phone = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j));
- phone = [phone stringByReplacingOccurrencesOfString:@"-" withString:@""];
- phone = [phone stringByReplacingOccurrencesOfString:@" " withString:@""];
- phone = [phone stringByReplacingOccurrencesOfString:@"(" withString:@""];
- phone = [phone stringByReplacingOccurrencesOfString:@")" withString:@""];
- phone = [phone stringByReplacingOccurrencesOfString:@" " withString:@""];
- phone = [self phoneNumberFormat:phone];
- __block NSString *areaCode;
- dispatch_async(dispatch_get_main_queue(), ^{
- areaCode = g_myself.areaCode;
- });
- if (!areaCode) {
- areaCode = @"86";
- }
-
- if (phone.length > 0) {
- if ([[phone substringToIndex:1] isEqualToString:@"+"]) {
- phone = [phone substringFromIndex:1];
- }
-
- if (phone.length > areaCode.length) {
- if (![[phone substringToIndex:areaCode.length] isEqualToString:areaCode]) {
- phone = [areaCode stringByAppendingString:phone];
- }
- if (phone) {
- [dict setObject:name forKey:phone];
- }
- }
- }
-
- }
-
- CFRelease(phones);
- }
-
- CFRelease(arrayRef);
- return [dict copy];
- }
- - (NSString *)phoneNumberFormat:(NSString *)phoneNum{
- NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:@"[^\\d]" options:0 error:NULL];
- phoneNum = [regular stringByReplacingMatchesInString:phoneNum options:0 range:NSMakeRange(0, [phoneNum length]) withTemplate:@""];
- return phoneNum;
- }
- /*
- 回调函数,实现自己的逻辑。
- */
- void ContactsChangeCallback (ABAddressBookRef addressBook,
- CFDictionaryRef info,
- void *context){
- [shared upLoadAddressBook];
-
- NSLog(@"ContactsChangeCallback");
- }
- - (void) upLoadAddressBook {
- self.addressBookDic = [self getMyAddressBook];
- NSArray *addressPhoneNums = self.addressBookDic.allKeys;
- if (!addressPhoneNums || addressPhoneNums.count <= 0)
- return;
-
- if ([NSArray arrayWithContentsOfFile:kPhoneNumPath].count > 0) {
-
- self.locPhoneNums = [NSArray arrayWithContentsOfFile:kPhoneNumPath];
- }
- if (!self.locPhoneNums || self.locPhoneNums.count <= 0) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [g_server getAddressBookAll:self];
- });
-
- }
- NSArray *addArray = [NSArray array];
- // NSArray *deleArray = [NSArray array];
-
- // 谓词查询两个数组中不相同的
- // 添加
- NSPredicate * filterPredicate1 = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",self.locPhoneNums];
- addArray = [addressPhoneNums filteredArrayUsingPredicate:filterPredicate1];
-
- [addressPhoneNums writeToFile:kPhoneNumPath atomically:YES];
- if (addArray.count > 0) {
- NSMutableArray *uploadArr = [NSMutableArray array];
- for (NSInteger i = 0; i < addArray.count; i ++) {
- NSString *phone = addArray[i];
- NSString *name = self.addressBookDic[phone];
- NSDictionary *dic = @{
- @"toTelephone":phone,
- @"toRemarkName":name
- };
- [uploadArr addObject:dic];
- // if (i == 0) {
- // [uploadStr appendString:phone];
- // }else {
- // [uploadStr appendFormat:@",%@",phone];
- // }
- }
- SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
- NSString *uploadStr = [OderJsonwriter stringWithObject:uploadArr];
- // 更新电话号
- dispatch_async(dispatch_get_main_queue(), ^{
- [g_server uploadAddressBookUploadStr:uploadStr toView:self];
- });
-
- }
- }
- - (void)didServerResultSucces:(JXConnection *)aDownload dict:(NSDictionary *)dict array:(NSArray *)array1{
- if ([aDownload.action isEqualToString:act_AddressBookGetAll]) {
- for (NSInteger i = 0; i < array1.count; i ++) {
- NSDictionary *dict = array1[i];
- JXAddressBook *addressBook = [[JXAddressBook alloc] init];
- addressBook.toUserId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
- addressBook.toUserName = dict[@"toUserName"];
- addressBook.toTelephone = dict[@"toTelephone"];
- addressBook.telephone = dict[@"telephone"];
- addressBook.registerEd = dict[@"registerEd"];
- addressBook.registerTime = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
- addressBook.isRead = [NSNumber numberWithBool:1];
- addressBook.addressBookName = self.addressBookDic[addressBook.toTelephone];
- [addressBook insert];
- }
- }
-
- if ([aDownload.action isEqualToString:act_AddressBookUpload]) {
- for (NSInteger i = 0; i < array1.count; i ++) {
- NSDictionary *dict = array1[i];
- JXAddressBook *addressBook = [[JXAddressBook alloc] init];
- addressBook.toUserId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
- addressBook.toUserName = dict[@"toUserName"];
- addressBook.toTelephone = dict[@"toTelephone"];
- addressBook.telephone = dict[@"telephone"];
- addressBook.registerEd = dict[@"registerEd"];
- addressBook.registerTime = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
- addressBook.isRead = [NSNumber numberWithBool:0];
- addressBook.addressBookName = self.addressBookDic[addressBook.toTelephone];
- [addressBook insert];
-
- int status = [dict[@"status"] intValue];
- if (status == 1) {
- JXUserObject *user = [[JXUserObject alloc] init];
- user.remarkName = dict[@"toRemarkName"];
- user.userId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
- if (dict[@"toRemarkName"]) {
- user.userNickname = dict[@"toRemarkName"];
- }
- user.timeCreate = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
- user.status = [NSNumber numberWithInt:2];
- user.roomFlag = [NSNumber numberWithInt:0];
- [user insertFriend];
- }
- }
-
- [g_notify postNotificationName:kRefreshAddressBookNotif object:nil];
- }
- }
- - (int)didServerResultFailed:(JXConnection *)aDownload dict:(NSDictionary *)dict{
-
- return hide_error;
- }
- - (int)didServerConnectError:(JXConnection *)aDownload error:(NSError *)error{
-
- return hide_error;
- }
- -(BOOL)checkTableCreatedInDb:(FMDatabase *)db
- {
- NSString *createStr=[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('toUserId' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE ,'toUserName' VARCHAR,'addressBookName' VARCHAR,'registerEd' INTEGER,'registerTime' DATETIME,'toTelephone' VARCHAR,'telephone' VARCHAR,'isRead' INTEGER)",_tableName];
-
- BOOL worked = [db executeUpdate:createStr];
- return worked;
- }
- //数据库增删改查
- -(BOOL)insert {
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- NSString *insertStr=[NSString stringWithFormat:@"INSERT INTO '%@' ('toUserId','toUserName','addressBookName','registerEd','registerTime','toTelephone','telephone','isRead') VALUES (?,?,?,?,?,?,?,?)",_tableName];
- BOOL worked = [db executeUpdate:insertStr,self.toUserId,self.toUserName,self.addressBookName,self.registerEd,self.registerTime,self.toTelephone,self.telephone,self.isRead];
-
- return worked;
- }
- -(BOOL)delete {
-
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
- NSString *sql = [NSString stringWithFormat:@"delete from %@ where toUserId=?",_tableName];
- BOOL worked=[db executeUpdate:sql,self.toUserId];
- return worked;
- }
- -(BOOL)update {
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- NSString* sql = [NSString stringWithFormat:@"update %@ set toUserName=?,addressBookName=?,registerEd=?,registerTime=?,toTelephone=?,telephone=?,isRead=? where toUserId=?",_tableName];
- BOOL worked = [db executeUpdate:sql,self.toUserName,self.addressBookName,self.registerEd,self.registerTime,self.toTelephone,self.telephone,self.isRead,self.toUserId];
- return worked;
- }
- // 获取所有手机联系人用户
- - (NSMutableArray *)fetchAllAddressBook {
- NSMutableArray *resultArr=[[NSMutableArray alloc]init];
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- NSString *sql = [NSString stringWithFormat:@"select * from %@", _tableName]
- ;
- FMResultSet *rs=[db executeQuery:sql];
- while ([rs next]) {
- JXAddressBook *task=[[JXAddressBook alloc] init];
- [self addressBookFromDataset:task rs:rs];
- [resultArr addObject:task];
- }
-
- return resultArr;
- }
- -(void)addressBookFromDataset:(JXAddressBook*)obj rs:(FMResultSet*)rs{
- obj.toUserId = [rs stringForColumn:@"toUserId"];
- obj.toUserName = [rs stringForColumn:@"toUserName"];
- obj.addressBookName = [rs stringForColumn:@"addressBookName"];
- obj.registerEd = [rs objectForColumnName:@"registerEd"];
- obj.registerTime = [rs dateForColumn:@"registerTime"];
- obj.toTelephone = [rs stringForColumn:@"toTelephone"];
- obj.telephone = [rs stringForColumn:@"telephone"];
- obj.isRead = [rs objectForColumnName:@"isRead"];
- }
- // 将未读消息设置为已读
- - (BOOL)updateUnread {
-
- NSString *sql = [NSString stringWithFormat:@"update %@ set isRead = ? where isRead = 0", _tableName];
-
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- BOOL worked = [db executeUpdate:sql,[NSNumber numberWithInt:1]];
-
- return worked;
- }
- // 查询未读消息
- -(NSMutableArray *)doFetchUnread {
- NSMutableArray *resultArr=[[NSMutableArray alloc]init];
-
- NSString *sql = [NSString stringWithFormat:@"select * from %@ where isRead = 0", _tableName];
-
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- FMResultSet *rs=[db executeQuery:sql];
- while ([rs next]) {
- JXAddressBook *obj=[[JXAddressBook alloc] init];
- [self addressBookFromDataset:obj rs:rs];
- [resultArr addObject:obj];
- }
- return resultArr;
- }
- -(void)dealloc{
- // 移除通讯录回调
- ABAddressBookUnregisterExternalChangeCallback(_addressBookRef, ContactsChangeCallback, nil);
- // [_location release];
- // [_arrayConnections release];
- // [_dictWaitViews release];
- // [myself release];
- //
- // [super dealloc];
- }
- @end
|