diff --git a/Pod/Core/APAddressBook.h b/Pod/Core/APAddressBook.h index 2b96271..e1181a5 100755 --- a/Pod/Core/APAddressBook.h +++ b/Pod/Core/APAddressBook.h @@ -21,6 +21,7 @@ + (void)requestAccess:(void (^)(BOOL granted, NSError * error))completionBlock; + (void)requestAccessOnQueue:(dispatch_queue_t)queue completion:(void (^)(BOOL granted, NSError * error))completionBlock; ++ (NSString *)getContactsVcard:(NSArray *)contacts withImage:(BOOL)copyImage; - (void)loadContacts:(void (^)(NSArray *contacts, NSError *error))completionBlock; - (void)loadContactsOnQueue:(dispatch_queue_t)queue diff --git a/Pod/Core/APAddressBook.m b/Pod/Core/APAddressBook.m index f7db5e9..f1cc64f 100755 --- a/Pod/Core/APAddressBook.m +++ b/Pod/Core/APAddressBook.m @@ -95,6 +95,62 @@ + (void)requestAccessOnQueue:(dispatch_queue_t)queue } ++ (NSString *)getContactsVcard:(NSArray *)contacts withImage:(BOOL)copyImage +{ + if (contacts.count == 0) { + return @""; + } + + for (NSUInteger i = 0; i < contacts.count; i++){ + if (![contacts[i] isKindOfClass:[APContact class]]) { + [NSException raise:@"Invalid type of object" format:@"input array object is not of 'APContact' type"]; + } + } + + NSMutableArray *naitiveContacts = [[NSMutableArray alloc]init]; + for (APContact *contact in contacts){ + [naitiveContacts addObject:contact.originalABRecord]; + } + + CFDataRef vcards = (CFDataRef)ABPersonCreateVCardRepresentationWithPeople((__bridge CFArrayRef)(naitiveContacts)); + NSString *vcardString = [[NSString alloc] initWithData:(__bridge NSData *)vcards encoding:NSUTF8StringEncoding]; + + if (copyImage) { + return vcardString; + } + + return [self removeImageFromVcardString:vcardString]; +} + ++ (NSString *)removeImageFromVcardString:(NSString*)vcard +{ + NSScanner *scanner = [NSScanner scannerWithString:vcard]; + NSString *text = nil; + + NSString *photo = @"PHOTO"; + NSString *endVcard = @"END:VCARD"; + NSString *socialProfile = @"X-SOCIALPROFILE"; + + if ([vcard rangeOfString:@"X-SOCIALPROFILE"].location == NSNotFound) { + while ([scanner isAtEnd] == NO) { + [scanner scanUpToString:photo intoString:NULL] ; + [scanner scanUpToString:endVcard intoString:&text] ; + vcard = [vcard stringByReplacingOccurrencesOfString: + [NSString stringWithFormat:@"%@", text] withString:@""]; + } + }else{ + while ([scanner isAtEnd] == NO) { + [scanner scanUpToString:photo intoString:NULL] ; + [scanner scanUpToString:socialProfile intoString:&text] ; + [scanner scanUpToString:endVcard intoString:NULL]; + vcard = [vcard stringByReplacingOccurrencesOfString: + [NSString stringWithFormat:@"%@", text] withString:@""]; + } + } + + return vcard; +} + - (void)loadContacts:(void (^)(NSArray *contacts, NSError *error))completionBlock { [self loadContactsOnQueue:dispatch_get_main_queue() completion:completionBlock]; diff --git a/Pod/Core/APContact.h b/Pod/Core/APContact.h index 4dc1745..f699ed0 100755 --- a/Pod/Core/APContact.h +++ b/Pod/Core/APContact.h @@ -32,6 +32,7 @@ @property (nonatomic, readonly) NSArray *socialProfiles; @property (nonatomic, readonly) NSString *note; @property (nonatomic, readonly) NSArray *linkedRecordIDs; +@property (nonatomic, readonly) ABRecordRef originalABRecord; - (id)initWithRecordRef:(ABRecordRef)recordRef fieldMask:(APContactField)fieldMask; diff --git a/Pod/Core/APContact.m b/Pod/Core/APContact.m index ed7b118..c186c64 100755 --- a/Pod/Core/APContact.m +++ b/Pod/Core/APContact.m @@ -20,6 +20,8 @@ - (id)initWithRecordRef:(ABRecordRef)recordRef fieldMask:(APContactField)fieldMa self = [super init]; if (self) { + // Preserve original ABAddressBook record for future use (like generating vCard) + _originalABRecord = recordRef; _fieldMask = fieldMask; if (fieldMask & APContactFieldFirstName) {