JXAddressBook.m 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. //
  2. // JXAddressBook.m
  3. // shiku_im
  4. //
  5. // Created by p on 2017/4/14.
  6. // Copyright © 2017年 Reese. All rights reserved.
  7. //
  8. #import "JXAddressBook.h"
  9. #import <AddressBook/AddressBook.h>
  10. #import <Contacts/Contacts.h>
  11. #import "FMDatabase.h"
  12. #import "FMResultSet.h"
  13. #import "JSONKit.h"
  14. #define kPhoneNumPath [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/phoneNum_%@.plist",MY_USER_ID]]
  15. @interface JXAddressBook ()
  16. @property (nonatomic, strong) NSArray *locPhoneNums;
  17. @property (nonatomic, assign) ABAddressBookRef addressBookRef;
  18. @property (nonatomic, strong) NSDictionary *addressBookDic;
  19. @end
  20. @implementation JXAddressBook
  21. static JXAddressBook *shared;
  22. +(JXAddressBook*)sharedInstance{
  23. static dispatch_once_t onceToken;
  24. dispatch_once(&onceToken, ^{
  25. shared=[[JXAddressBook alloc]init];
  26. });
  27. return shared;
  28. }
  29. - (instancetype)init {
  30. if ([super init]) {
  31. _tableName = @"addressBook";
  32. }
  33. return self;
  34. }
  35. // 上传手机通讯录联系人
  36. - (void) uploadAddressBookContacts {
  37. self.locPhoneNums = nil;
  38. // 判断通讯录是否授权
  39. ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();
  40. ABAddressBookRef addressBookRef = ABAddressBookCreate();
  41. if (authorizationStatus == kABAuthorizationStatusNotDetermined) {
  42. // 请求授权
  43. ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
  44. if (granted) { // 授权成功
  45. [shared upLoadAddressBook];
  46. NSLog(@"授权成功!");
  47. } else { // 授权失败
  48. NSLog(@"授权失败!");
  49. }
  50. });
  51. }
  52. _addressBookRef = ABAddressBookCreate();
  53. // 注册通讯录回调
  54. ABAddressBookRegisterExternalChangeCallback(_addressBookRef, ContactsChangeCallback, nil);
  55. dispatch_sync(dispatch_get_global_queue(0, 0), ^{
  56. [self upLoadAddressBook];
  57. });
  58. if (addressBookRef) {
  59. CFRelease(addressBookRef);
  60. }
  61. }
  62. // 获取通讯录
  63. - (NSDictionary *) getMyAddressBook {
  64. // 1. 判读授权
  65. ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();
  66. if (authorizationStatus != kABAuthorizationStatusAuthorized) {
  67. NSLog(@"没有授权");
  68. return nil;
  69. }
  70. //获取当前联系人的数组
  71. // NSMutableArray *peopleArray = [[NSMutableArray alloc]init];
  72. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  73. CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(_addressBookRef);
  74. long count = CFArrayGetCount(arrayRef);
  75. for (int i = 0; i < count; i++) {
  76. //获取联系人对象的引用
  77. ABRecordRef people = CFArrayGetValueAtIndex(arrayRef, i);
  78. // 名
  79. NSString * oldFirstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
  80. if (!oldFirstName) {
  81. oldFirstName = @"";
  82. }
  83. // 姓
  84. NSString * oldLastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
  85. if (!oldLastName) {
  86. oldLastName = @"";
  87. }
  88. NSString *name;
  89. NSString *lang = [g_default stringForKey:kLocalLanguage];
  90. if ([JXMyTools isChineseLanguage:lang]) {
  91. name = [NSString stringWithFormat:@"%@%@",oldLastName, oldFirstName];
  92. }else {
  93. name = [NSString stringWithFormat:@"%@ %@",oldFirstName, oldLastName];
  94. }
  95. ABMultiValueRef phones = ABRecordCopyValue(people, kABPersonPhoneProperty);
  96. for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {
  97. NSString *phone = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j));
  98. phone = [phone stringByReplacingOccurrencesOfString:@"-" withString:@""];
  99. phone = [phone stringByReplacingOccurrencesOfString:@" " withString:@""];
  100. phone = [phone stringByReplacingOccurrencesOfString:@"(" withString:@""];
  101. phone = [phone stringByReplacingOccurrencesOfString:@")" withString:@""];
  102. phone = [phone stringByReplacingOccurrencesOfString:@" " withString:@""];
  103. phone = [self phoneNumberFormat:phone];
  104. __block NSString *areaCode;
  105. dispatch_async(dispatch_get_main_queue(), ^{
  106. areaCode = g_myself.areaCode;
  107. });
  108. if (!areaCode) {
  109. areaCode = @"86";
  110. }
  111. if (phone.length > 0) {
  112. if ([[phone substringToIndex:1] isEqualToString:@"+"]) {
  113. phone = [phone substringFromIndex:1];
  114. }
  115. if (phone.length > areaCode.length) {
  116. if (![[phone substringToIndex:areaCode.length] isEqualToString:areaCode]) {
  117. phone = [areaCode stringByAppendingString:phone];
  118. }
  119. if (phone) {
  120. [dict setObject:name forKey:phone];
  121. }
  122. }
  123. }
  124. }
  125. CFRelease(phones);
  126. }
  127. CFRelease(arrayRef);
  128. return [dict copy];
  129. }
  130. - (NSString *)phoneNumberFormat:(NSString *)phoneNum{
  131. NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:@"[^\\d]" options:0 error:NULL];
  132. phoneNum = [regular stringByReplacingMatchesInString:phoneNum options:0 range:NSMakeRange(0, [phoneNum length]) withTemplate:@""];
  133. return phoneNum;
  134. }
  135. /*
  136. 回调函数,实现自己的逻辑。
  137. */
  138. void ContactsChangeCallback (ABAddressBookRef addressBook,
  139. CFDictionaryRef info,
  140. void *context){
  141. [shared upLoadAddressBook];
  142. NSLog(@"ContactsChangeCallback");
  143. }
  144. - (void) upLoadAddressBook {
  145. self.addressBookDic = [self getMyAddressBook];
  146. NSArray *addressPhoneNums = self.addressBookDic.allKeys;
  147. if (!addressPhoneNums || addressPhoneNums.count <= 0)
  148. return;
  149. if ([NSArray arrayWithContentsOfFile:kPhoneNumPath].count > 0) {
  150. self.locPhoneNums = [NSArray arrayWithContentsOfFile:kPhoneNumPath];
  151. }
  152. if (!self.locPhoneNums || self.locPhoneNums.count <= 0) {
  153. dispatch_async(dispatch_get_main_queue(), ^{
  154. [g_server getAddressBookAll:self];
  155. });
  156. }
  157. NSArray *addArray = [NSArray array];
  158. // NSArray *deleArray = [NSArray array];
  159. // 谓词查询两个数组中不相同的
  160. // 添加
  161. NSPredicate * filterPredicate1 = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",self.locPhoneNums];
  162. addArray = [addressPhoneNums filteredArrayUsingPredicate:filterPredicate1];
  163. [addressPhoneNums writeToFile:kPhoneNumPath atomically:YES];
  164. if (addArray.count > 0) {
  165. NSMutableArray *uploadArr = [NSMutableArray array];
  166. for (NSInteger i = 0; i < addArray.count; i ++) {
  167. NSString *phone = addArray[i];
  168. NSString *name = self.addressBookDic[phone];
  169. NSDictionary *dic = @{
  170. @"toTelephone":phone,
  171. @"toRemarkName":name
  172. };
  173. [uploadArr addObject:dic];
  174. // if (i == 0) {
  175. // [uploadStr appendString:phone];
  176. // }else {
  177. // [uploadStr appendFormat:@",%@",phone];
  178. // }
  179. }
  180. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  181. NSString *uploadStr = [OderJsonwriter stringWithObject:uploadArr];
  182. // 更新电话号
  183. dispatch_async(dispatch_get_main_queue(), ^{
  184. [g_server uploadAddressBookUploadStr:uploadStr toView:self];
  185. });
  186. }
  187. }
  188. - (void)didServerResultSucces:(JXConnection *)aDownload dict:(NSDictionary *)dict array:(NSArray *)array1{
  189. if ([aDownload.action isEqualToString:act_AddressBookGetAll]) {
  190. for (NSInteger i = 0; i < array1.count; i ++) {
  191. NSDictionary *dict = array1[i];
  192. JXAddressBook *addressBook = [[JXAddressBook alloc] init];
  193. addressBook.toUserId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
  194. addressBook.toUserName = dict[@"toUserName"];
  195. addressBook.toTelephone = dict[@"toTelephone"];
  196. addressBook.telephone = dict[@"telephone"];
  197. addressBook.registerEd = dict[@"registerEd"];
  198. addressBook.registerTime = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
  199. addressBook.isRead = [NSNumber numberWithBool:1];
  200. addressBook.addressBookName = self.addressBookDic[addressBook.toTelephone];
  201. [addressBook insert];
  202. }
  203. }
  204. if ([aDownload.action isEqualToString:act_AddressBookUpload]) {
  205. for (NSInteger i = 0; i < array1.count; i ++) {
  206. NSDictionary *dict = array1[i];
  207. JXAddressBook *addressBook = [[JXAddressBook alloc] init];
  208. addressBook.toUserId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
  209. addressBook.toUserName = dict[@"toUserName"];
  210. addressBook.toTelephone = dict[@"toTelephone"];
  211. addressBook.telephone = dict[@"telephone"];
  212. addressBook.registerEd = dict[@"registerEd"];
  213. addressBook.registerTime = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
  214. addressBook.isRead = [NSNumber numberWithBool:0];
  215. addressBook.addressBookName = self.addressBookDic[addressBook.toTelephone];
  216. [addressBook insert];
  217. int status = [dict[@"status"] intValue];
  218. if (status == 1) {
  219. JXUserObject *user = [[JXUserObject alloc] init];
  220. user.remarkName = dict[@"toRemarkName"];
  221. user.userId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
  222. if (dict[@"toRemarkName"]) {
  223. user.userNickname = dict[@"toRemarkName"];
  224. }
  225. user.timeCreate = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
  226. user.status = [NSNumber numberWithInt:2];
  227. user.roomFlag = [NSNumber numberWithInt:0];
  228. [user insertFriend];
  229. }
  230. }
  231. [g_notify postNotificationName:kRefreshAddressBookNotif object:nil];
  232. }
  233. }
  234. - (int)didServerResultFailed:(JXConnection *)aDownload dict:(NSDictionary *)dict{
  235. return hide_error;
  236. }
  237. - (int)didServerConnectError:(JXConnection *)aDownload error:(NSError *)error{
  238. return hide_error;
  239. }
  240. -(BOOL)checkTableCreatedInDb:(FMDatabase *)db
  241. {
  242. 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];
  243. BOOL worked = [db executeUpdate:createStr];
  244. return worked;
  245. }
  246. //数据库增删改查
  247. -(BOOL)insert {
  248. NSString* myUserId = MY_USER_ID;
  249. FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
  250. [self checkTableCreatedInDb:db];
  251. NSString *insertStr=[NSString stringWithFormat:@"INSERT INTO '%@' ('toUserId','toUserName','addressBookName','registerEd','registerTime','toTelephone','telephone','isRead') VALUES (?,?,?,?,?,?,?,?)",_tableName];
  252. BOOL worked = [db executeUpdate:insertStr,self.toUserId,self.toUserName,self.addressBookName,self.registerEd,self.registerTime,self.toTelephone,self.telephone,self.isRead];
  253. return worked;
  254. }
  255. -(BOOL)delete {
  256. NSString* myUserId = MY_USER_ID;
  257. FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
  258. [self checkTableCreatedInDb:db];
  259. NSString *sql = [NSString stringWithFormat:@"delete from %@ where toUserId=?",_tableName];
  260. BOOL worked=[db executeUpdate:sql,self.toUserId];
  261. return worked;
  262. }
  263. -(BOOL)update {
  264. NSString* myUserId = MY_USER_ID;
  265. FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
  266. [self checkTableCreatedInDb:db];
  267. NSString* sql = [NSString stringWithFormat:@"update %@ set toUserName=?,addressBookName=?,registerEd=?,registerTime=?,toTelephone=?,telephone=?,isRead=? where toUserId=?",_tableName];
  268. BOOL worked = [db executeUpdate:sql,self.toUserName,self.addressBookName,self.registerEd,self.registerTime,self.toTelephone,self.telephone,self.isRead,self.toUserId];
  269. return worked;
  270. }
  271. // 获取所有手机联系人用户
  272. - (NSMutableArray *)fetchAllAddressBook {
  273. NSMutableArray *resultArr=[[NSMutableArray alloc]init];
  274. NSString* myUserId = MY_USER_ID;
  275. FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
  276. [self checkTableCreatedInDb:db];
  277. NSString *sql = [NSString stringWithFormat:@"select * from %@", _tableName]
  278. ;
  279. FMResultSet *rs=[db executeQuery:sql];
  280. while ([rs next]) {
  281. JXAddressBook *task=[[JXAddressBook alloc] init];
  282. [self addressBookFromDataset:task rs:rs];
  283. [resultArr addObject:task];
  284. }
  285. return resultArr;
  286. }
  287. -(void)addressBookFromDataset:(JXAddressBook*)obj rs:(FMResultSet*)rs{
  288. obj.toUserId = [rs stringForColumn:@"toUserId"];
  289. obj.toUserName = [rs stringForColumn:@"toUserName"];
  290. obj.addressBookName = [rs stringForColumn:@"addressBookName"];
  291. obj.registerEd = [rs objectForColumnName:@"registerEd"];
  292. obj.registerTime = [rs dateForColumn:@"registerTime"];
  293. obj.toTelephone = [rs stringForColumn:@"toTelephone"];
  294. obj.telephone = [rs stringForColumn:@"telephone"];
  295. obj.isRead = [rs objectForColumnName:@"isRead"];
  296. }
  297. // 将未读消息设置为已读
  298. - (BOOL)updateUnread {
  299. NSString *sql = [NSString stringWithFormat:@"update %@ set isRead = ? where isRead = 0", _tableName];
  300. NSString* myUserId = MY_USER_ID;
  301. FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
  302. [self checkTableCreatedInDb:db];
  303. BOOL worked = [db executeUpdate:sql,[NSNumber numberWithInt:1]];
  304. return worked;
  305. }
  306. // 查询未读消息
  307. -(NSMutableArray *)doFetchUnread {
  308. NSMutableArray *resultArr=[[NSMutableArray alloc]init];
  309. NSString *sql = [NSString stringWithFormat:@"select * from %@ where isRead = 0", _tableName];
  310. NSString* myUserId = MY_USER_ID;
  311. FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
  312. [self checkTableCreatedInDb:db];
  313. FMResultSet *rs=[db executeQuery:sql];
  314. while ([rs next]) {
  315. JXAddressBook *obj=[[JXAddressBook alloc] init];
  316. [self addressBookFromDataset:obj rs:rs];
  317. [resultArr addObject:obj];
  318. }
  319. return resultArr;
  320. }
  321. -(void)dealloc{
  322. // 移除通讯录回调
  323. ABAddressBookUnregisterExternalChangeCallback(_addressBookRef, ContactsChangeCallback, nil);
  324. // [_location release];
  325. // [_arrayConnections release];
  326. // [_dictWaitViews release];
  327. // [myself release];
  328. //
  329. // [super dealloc];
  330. }
  331. @end