From 07563f73ad64709ad35ac71245d2f3e494b08ffc Mon Sep 17 00:00:00 2001 From: john kendall Date: Mon, 10 Oct 2016 17:22:58 -0400 Subject: [PATCH] Enhance to send back array of phones and emails Update to return a list of phones and emails with their localized labels --- ios/RCTContactsWrapper/RCTContactsWrapper.m | 116 +++++++++++++++----- 1 file changed, 86 insertions(+), 30 deletions(-) diff --git a/ios/RCTContactsWrapper/RCTContactsWrapper.m b/ios/RCTContactsWrapper/RCTContactsWrapper.m index 21ff7be..710eb87 100644 --- a/ios/RCTContactsWrapper/RCTContactsWrapper.m +++ b/ios/RCTContactsWrapper/RCTContactsWrapper.m @@ -57,6 +57,7 @@ -(void) launchContacts { UIViewController *picker; if([CNContactPickerViewController class]) { + //if(NSClassFromString(@"CNContactPickerViewController")){ //iOS 9+ picker = [[CNContactPickerViewController alloc] init]; ((CNContactPickerViewController *)picker).delegate = self; @@ -102,7 +103,11 @@ -(void)contactPicked:(NSDictionary *)contactData { - (NSMutableDictionary *) emptyContactDict { - return [[NSMutableDictionary alloc] initWithObjects:@[@"", @"", @""] forKeys:@[@"name", @"phone", @"email"]]; + return [ + [NSMutableDictionary alloc] + initWithObjects:@[@"", @"", @"", @"", @"", @""] + forKeys:@[@"givenName", @"middleName", @"familyName", @"fullName", @"phoneNumbers", @"email"] + ]; } /** @@ -110,47 +115,60 @@ - (NSMutableDictionary *) emptyContactDict { */ -(NSString *) getFullNameForFirst:(NSString *)fName middle:(NSString *)mName last:(NSString *)lName { //Check whether to include middle name or not - NSArray *names = (mName.length > 0) ? [NSArray arrayWithObjects:fName, mName, lName, nil] : [NSArray arrayWithObjects:fName, lName, nil];; + NSArray *names = (mName.length > 0) + ? [NSArray arrayWithObjects:fName, mName, lName, nil] + : [NSArray arrayWithObjects:fName, lName, nil]; return [names componentsJoinedByString:@" "]; } #pragma mark - Event handlers - iOS 9+ + - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact { switch(_requestCode){ case REQUEST_CONTACT: { /* Return NSDictionary ans JS Object to RN, containing basic contact data This is a starting point, in future more fields should be added, as required. - This could also be extended to return arrays of phone numbers, email addresses etc. instead of jsut first found */ NSMutableDictionary *contactData = [self emptyContactDict]; NSString *fullName = [self getFullNameForFirst:contact.givenName middle:contact.middleName last:contact.familyName ]; - NSArray *phoneNos = contact.phoneNumbers; - NSArray *emailAddresses = contact.emailAddresses; - + //Return full name - [contactData setValue:fullName forKey:@"name"]; + [contactData setValue:fullName forKey:@"fullName"]; + [contactData setValue:contact.givenName forKey:@"givenName"]; + [contactData setValue:contact.middleName forKey:@"middleName"]; + [contactData setValue:contact.familyName forKey:@"familyName"]; - //Return first phone number - if([phoneNos count] > 0) { - CNPhoneNumber *phone = ((CNLabeledValue *)phoneNos[0]).value; - [contactData setValue:phone.stringValue forKey:@"phone"]; + NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init]; + for(CFIndex i=0;i<[contact.phoneNumbers count];i++) { + NSMutableDictionary* phone = [NSMutableDictionary dictionary]; + CNLabeledValue *lv = ((CNLabeledValue *)contact.phoneNumbers[i]); + [phone setValue: ((CNPhoneNumber *)lv.value).stringValue forKey:@"number"]; + [phone setValue: [CNLabeledValue localizedStringForLabel:lv.label] forKey:@"label"]; + [phoneNumbers addObject:phone]; } - - //Return first email address - if([emailAddresses count] > 0) { - [contactData setValue:((CNLabeledValue *)emailAddresses[0]).value forKey:@"email"]; + [contactData setObject:phoneNumbers forKey:@"phoneNumbers"]; + + + NSMutableArray *emailAddresses = [[NSMutableArray alloc] init]; + for(CFIndex i=0;i<[contact.emailAddresses count];i++) { + NSMutableDictionary* email = [NSMutableDictionary dictionary]; + CNLabeledValue *lv = ((CNLabeledValue *)contact.emailAddresses[i]); + [email setValue: lv.value forKey:@"email"]; + [email setValue: [CNLabeledValue localizedStringForLabel:lv.label] forKey:@"label"]; + [emailAddresses addObject:email]; } - + [contactData setObject:emailAddresses forKey:@"emailAddresses"]; + [self contactPicked:contactData]; } break; case REQUEST_EMAIL : { - /* Return Only email address as string */ + // Return Only email address as string if([contact.emailAddresses count] < 1) { [self pickerNoEmail]; return; @@ -197,23 +215,60 @@ - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)p NSString *fullName = [self getFullNameForFirst:fNameObject middle:mNameObject last:lNameObject]; //Return full name - [contactData setValue:fullName forKey:@"name"]; + [contactData setValue:fullName forKey:@"fullName"]; + [contactData setValue:fNameObject forKey:@"givenName"]; + [contactData setValue:mNameObject forKey:@"middleName"]; + [contactData setValue:lNameObject forKey:@"familyName"]; - //Return first phone number - ABMultiValueRef phoneMultiValue = ABRecordCopyValue(person, kABPersonPhoneProperty); - NSArray *phoneNos = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneMultiValue); - if([phoneNos count] > 0) { - [contactData setValue:phoneNos[0] forKey:@"phone"]; - } - - //Return first email - ABMultiValueRef emailMultiValue = ABRecordCopyValue(person, kABPersonEmailProperty); - NSArray *emailAddresses = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue); - if([emailAddresses count] > 0) { - [contactData setValue:emailAddresses[0] forKey:@"email"]; + //Return first phone numbers + NSMutableArray *phoneNumberList = [[NSMutableArray alloc] init]; + + ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); + if (phoneNumbers) { + CFIndex numberOfPhoneNumbers = ABMultiValueGetCount(phoneNumbers); + for (CFIndex i = 0; i < numberOfPhoneNumbers; i++) { + NSMutableDictionary* phone = [NSMutableDictionary dictionary]; + CFStringRef label = ABMultiValueCopyLabelAtIndex(phoneNumbers, i); + CFStringRef number = ABMultiValueCopyValueAtIndex(phoneNumbers, i); + if (number) { + if (label){ + NSString *l=(__bridge NSString *)ABAddressBookCopyLocalizedLabel(label); + [phone setValue: l forKey:@"label"]; + } + else [phone setValue: @"Other" forKey:@"label"]; + [phone setValue: (__bridge NSString *)number forKey:@"number"]; + [phoneNumberList addObject:phone]; + } + } + CFRelease(phoneNumbers); } + [contactData setObject:phoneNumberList forKey:@"phoneNumbers"]; + //Return email list + NSMutableArray *emailList = [[NSMutableArray alloc] init]; + + ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); + if (emails) { + CFIndex numberOfEmails = ABMultiValueGetCount(emails); + for (CFIndex i = 0; i < numberOfEmails; i++) { + NSMutableDictionary* email = [NSMutableDictionary dictionary]; + CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, i); + CFStringRef value = ABMultiValueCopyValueAtIndex(emails, i); + if (value) { + if (label){ + NSString *l=(__bridge NSString *)ABAddressBookCopyLocalizedLabel(label); + [email setValue: l forKey:@"label"]; + } + else [email setValue: @"Other" forKey:@"label"]; + [email setValue: (__bridge NSString *) value forKey:@"email"]; + [emailList addObject:email]; + } + } + CFRelease(emails); + } + [contactData setObject:emailList forKey:@"emailAddresses"]; + [self contactPicked:contactData]; } break; @@ -249,3 +304,4 @@ - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationContr @end +