2015-01-21 6 views
0

Мне нужно найти контакт в AdreesBook, чтобы добавить новую социальную сеть. Иногда мне нужно найти контакт по своим телефонам и электронной почте или по своим телефонам, firstName и lastName, есть ли какой-либо запрос, чтобы получить контакт ABRecordRef вместо того, чтобы делать whiles?найти ios ABRecordRef связаться в AddressBook по телефону, электронной почте, адресу

Многие из моих пользователей имеет более 1000 контактов, и мне нужно обновить многие из них, так что это не эффективно, если мое единственное решение, чтобы сделать так много ... в то время как

Любая идея ??

Спасибо!

ответ

3

Ниже приведен метод, который может помочь вам получить контактные данные, используя номер телефона. Для этого его использовало kABPersonPhoneProperty, так же вы можете написать еще функции для поиска электронной почты и имени:

  • Для электронной почты, используйте свойство: kABPersonEmailProperty
  • Для Имени: kABPersonFirstNameProperty

Для получения дополнительной информации перейдите по ссылке: ABPerson Reference

Надеюсь, это поможет.

#import <AddressBook/AddressBook.h> 

-(NSArray *)contactsContainingPhoneNumber:(NSString *)phoneNumber { 
    /* 
    Returns an array of contacts that contain the phone number 
    */ 

    // Remove non numeric characters from the phone number 
    phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""]; 

    // Create a new address book object with data from the Address Book database 
    CFErrorRef error = nil; 
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 
    if (!addressBook) { 
     return [NSArray array]; 
    } else if (error) { 
     CFRelease(addressBook); 
     return [NSArray array]; 
    } 

    // Requests access to address book data from the user 
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {}); 

    // Build a predicate that searches for contacts that contain the phone number 
    NSPredicate *predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary *bindings) { 
     ABMultiValueRef phoneNumbers = ABRecordCopyValue((__bridge ABRecordRef)record, kABPersonPhoneProperty); 
     BOOL result = NO; 
     for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) { 
      NSString *contactPhoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i); 
      contactPhoneNumber = [[contactPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""]; 
      if ([contactPhoneNumber rangeOfString:phoneNumber].location != NSNotFound) { 
       result = YES; 
       break; 
      } 
     } 
     CFRelease(phoneNumbers); 
     return result; 
    }]; 

    // Search the users contacts for contacts that contain the phone number 
    NSArray *allPeople = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 
    NSArray *filteredContacts = [allPeople filteredArrayUsingPredicate:predicate]; 
    CFRelease(addressBook); 

    return filteredContacts; 
} 
+0

Спасибо большое! Я собираюсь попробовать. Это работает, только если у меня есть только один номер телефона? Можно ли использовать массив в rangeOfString? – titolancreo

+0

Это метод, который я использовал для поиска Mobile Number как строки. Для вашего случая вам может потребоваться немного изменить метод, а также выполнить цикл функции, если ее массив чисел. – Mrunal

+0

По крайней мере, сначала попробуйте найти один контактный номер. Затем постепенно обновляйте код. – Mrunal