2013-06-25 11 views
1

Кто-нибудь знает, как получить Домашний адрес из multiaddress в iOS? У меня есть разрешение от пользователя и всего остального, но проблема в том, что мне нужен только домашний адрес.Я получаю несколько адресов контакта, но хочу только Домашний адрес

ABAddressBookRef addressBook = ABAddressBookCreate(); 
__block BOOL accessGranted = NO; 
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
     accessGranted = granted; 
     dispatch_semaphore_signal(sema); 
    }); 
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
    dispatch_release(sema); 
} 
else { // we're on iOS 5 or older 

    accessGranted = YES; 
} 

if (accessGranted) { 

    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    NSMutableArray *array = [[NSMutableArray alloc] init]; 

    for(int i = 0 ; i < nPeople ; i++) 

    { 
     NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; 

     ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i); 

     // First Name 
     NSString *fName = (__bridge NSString*)ABRecordCopyValue(ref, kABPersonFirstNameProperty); 

     // Last Name 
     NSString *lName = (__bridge NSString*)ABRecordCopyValue(ref, kABPersonLastNameProperty); 

     // Phone 
     ABMultiValueRef phoneMultiValue = ABRecordCopyValue(ref, kABPersonPhoneProperty); 
     CFArrayRef allPhones = ABMultiValueCopyArrayOfAllValues(phoneMultiValue); 
     NSMutableArray *phoneData = [NSMutableArray arrayWithArray:(__bridge NSArray*) allPhones]; 

     // Email 
     ABMultiValueRef emailMultiValue = ABRecordCopyValue(ref, kABPersonEmailProperty); 
     CFArrayRef allEmails = ABMultiValueCopyArrayOfAllValues(emailMultiValue); 
     NSMutableArray *emailData = [NSMutableArray arrayWithArray:(__bridge NSArray*) allEmails]; 

     // Address 
     ABMultiValueRef addressMultiValue = ABRecordCopyValue(ref, kABPersonAddressProperty); 

     CFArrayRef allAddresses = ABMultiValueCopyArrayOfAllValues(addressMultiValue); 

     NSMutableArray* addressData = [NSMutableArray arrayWithArray:(__bridge NSArray*) allAddresses]; 

     for (int j = 0 ; j < [addressData count]; j++) { 
      if ([[addressData objectAtIndex:j] count] > 0) { 

       if ([fName length] > 0 || [lName length] > 0) { 


        if ([fName length] > 0) { 
         [dic setObject:fName forKey:@"FirstName"]; 
        } 

        if ([lName length] > 0) { 
         [dic setObject:lName forKey:@"LastName"]; 
        } 

        if ([phoneData count] > 0) { 
         [dic setObject:phoneData forKey:@"MultiplePhoneNumbers"]; 
        } 

        if ([emailData count] > 0) { 
         [dic setObject:emailData forKey:@"MultipleEmails"]; 
        } 


        [dic setObject:addressData forKey:@"MultipleAddresses"]; 



       } 
      } 
     } 

     NSUInteger keyCount = [[dic allKeys] count]; 
     if (keyCount > 0) { 

      ABRecordID recId = ABRecordGetRecordID(ref); 


      [dic setObject:[NSString stringWithFormat:@"%d",recId] forKey:@"ABRecordRef"]; 
      [dic setObject:[NSString stringWithFormat:@"%d",i] forKey:@"ab_id"]; 
      [dic setObject:[NSNumber numberWithBool:FALSE] forKey:@"is_coordinate_fetch"]; 
      [array addObject:dic];     
     } 

Я был бы очень признателен, если бы кто-нибудь мог занять время и решить это для меня.

ответ

0

Единое решение этой проблемы отсутствует. То, что я сделал в своем приложении, было следующим:

1) Если у человека только один адрес, используйте это.

2) Если было несколько адресов, используя ячейки с именем и первым адресом и кнопку «Выбрать другой адрес». Если пользователь нажал эту кнопку, оживите лист, где пользователь видит другую таблицу всех адресов и может выбрать тот, который они хотят.

+0

Я сделал это, сохранив multipleaddresses в массиве, а затем подбирая по домашнему адресу из этого массива по objectatindex: 0 который всегда возвращает домашний адрес и objectatindex: 1 возвращает рабочий адрес, если есть какой-либо рабочий адрес, иначе он вернет ошибку ..... –

+0

Полезно знать! Я никогда не смотрел, имеет ли индекс значение. Единственная проблема, которую я вижу, - это если HOME не установлен, то добавляется другой адрес, поэтому индекс в индексе 0 - это бизнес. Вероятно, это действительно маловероятное событие. –

1

Вам необходимо выполнить итерацию через многозначное свойство kABPersonAddressProperty и извлечь один из них, соответствующий идентификатору kABHomeLabel. Вот как вы можете сделать это в прошивке 7 (предполагается, что ссылка на адресной книгу):

NSArray *people = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(localAddressBook)); 

// Iterate through each person in the Address Book 
for (NSUInteger i = 0; i < people.count; i++) 
{ 
    ABRecordRef person = CFArrayGetValueAtIndex((__bridge CFArrayRef)people, i); 

    // Access the person's addresses (a ABMultiValueRef) 
    ABMultiValueRef addressesProperty = CFAutorelease(ABRecordCopyValue(person, kABPersonAddressProperty)); 

    if (addressesProperty) 
    { 
     // Iterate through the address multivalue 
     for (CFIndex index = 0; index < ABMultiValueGetCount(addressesProperty); index++) 
     { 
      // Get the address label 
      NSString *addressLabel = (NSString *)CFBridgingRelease(ABMultiValueCopyLabelAtIndex(addressesProperty, index)); 

      // Check for home address label 
      if ([addressLabel isEqualToString:(NSString *)kABHomeLabel]) 
      { 
       // Your code here 
       NSLog(@"%@", addressLabel); 
      } 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^