2015-01-21 2 views
0

새로운 소셜 네트워크를 추가하려면 AdreesBook에서 연락처를 찾아야합니다. 가끔은 그 전화와 이메일, 또는 그 전화, firstName과 lastName에 의해 연락처를 찾아야 만합니다. Whiles를하는 대신 ABRecordRef 연락을받을 수있는 쿼리가 있습니까? 내 사용자의 대부분전화, 이메일, 이름으로 주소록에서 ABRecordRef 연락처를 찾으십시오.

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

    감사합니다. 나는 그것을 시도 할 것이다. 이것은 하나의 phoneNumber 만 올바른 경우에만 작동합니까? rangeOfString에 배열을 사용할 수 있습니까? – titolancreo

    +0

    이 방법은 문자열로 모바일 번호를 검색하는 데 사용했습니다. 귀하의 경우에는 메서드를 조금 수정해야 할 수도 있고, 숫자 배열 인 경우 함수를 루핑 할 수도 있습니다. – Mrunal

    +0

    적어도 먼저 단일 연락처 번호 검색을 시도하십시오. 그런 다음 점진적으로 코드를 업데이트하십시오. – Mrunal