2014-05-19 2 views
3

ABPeoplePickerNavigationController가 Exchange와 iCloud에서 동기화 된 전화 번호가있는 연락처에 대해 잘못된 식별자를 반환하는 것으로 보이는 문제가 있습니다. 내 응용 프로그램은 iOS 7.1에서 실행되며 iOS 7.1 SDK로 컴파일됩니다.Exchange 및 iCloud 전화 번호가 동일한 항목에있을 때 ABPeoplePicker 대리자가 잘못된 식별자를 반환합니다.

TL - 사람들 선택 대리인 콜백에서 Exchange와 iCloud에서 병합 된 전화 번호가있는 연락처가있을 때 잘못된 식별자가 나타납니다.

선제 답변 : 예 저는 ABMultiValueGetIndexForIdentifier를 호출하려고합니다.

이 문제는 Exchange 및 iCloud에서 전화 번호가 하나만있는 경우에만 발생합니다. iOS 6.1 SDK로 컴파일 된 이전 버전의 응용 프로그램을 실행했는데 iOS 7.1에서 실행할 때 문제가 없습니다. 나는 아래로 테스트를 단순화

:

아이폰 연락처와 iCloud에 등록되어 활성화, 동기화. iPhone도 Exchange로 메일을 체크하도록 설정되어 있습니다. Exchange에서. 세 개의 전화 번호가있는 "Foo Bar"라는 연락처가 있습니다.이 연락처는 iPhone에 올바르게 표시됩니다.

  • 일 : 212-111-1111
  • 모바일 : 212-222-2222
  • 홈 : 212-333-3333
  • 작업 팩스이 시점에서 모든 것을 내 응용 프로그램에서 예상대로 작동 : 212-444-4444

연락처 동기화가 활성화 된 상태에서 iPad가 iCloud에 등록되었습니다. 이 장치에는 전자 메일이 구성되어 있지 않습니다.

  • 홈 팩스 : 212-555-5555이
  • 작업 팩스 : 212-666-6666

은 아이 클라우드는 동기화 후 나는 두 개의 전화 번호와 함께 "푸 바"라는 이름의 사용자를 생성 연락처 "Foo Bar"에는 iPhone의 iOS 연락처 앱에 6 개의 전화 번호가 있습니다. iOS 연락처 앱에서 전화를 걸면 올바른 번호로 전화가 걸립니다.

내 응용 프로그램에서 ABPeoplePickerNavigationController를 표시하고 있습니다. 델리게이트 콜백에서 잘못된 전화 번호가 나타납니다. 사람에

내가이 순서에있는 모든 6 개 전화 번호와 연락처를 참조 선택기 :

  • 일 : 212-111-1111
  • 작업 팩스 : 212-444-4444
  • 홈 : 212-333-3333
  • 모바일 : 212-222-2222
  • 홈 팩스 : 212-555-5555
  • 작업 팩스 : 212-666-6666

델리게이트에서 모든 전화 번호가 표시되며 항상이 순서로 표시됩니다. iCloud 항목이 Exchange 번호 위에있는 목록에있는 것 같습니다 (중요한 것은 아닙니다).

  • xindex : 0 전화 : (212) 555-5555
  • xindex 1 전화 번호 : (212) 666-6666
  • xindex 2 전화 번호 : (212) 111-1111
  • xindex : (3) 전화 번호 : (212) 444-4444
  • xindex 4 전화 번호 : (212) 333-3333
  • xindex 5 전화 : (212) 222-2222

I은 ​​각 항목을 선택하면 ~로부터

  • 직장 전화 : 식별자 = 0 인덱스 = 0 전화 = (212) 555-5555 (잘못된 :해야 212-111-1111)
  • 사람들은 내가 사람들 피커 위임 이러한 결과를 얻을 선택기
  • 작업 팩스 : 식별자 = 1 = 인덱스 1 = 전화 (212) 666-6666 (그름 :이어야 212-444-4444)
  • 홈 : 식별자 = 2 인덱스 = 2 = 전화 (212) (111) -1111 (잘못 : 212-333-3333 여야 함)
  • 모바일 : 식별자 = 3 색인 = 3 전화 = (212) 444-4444 (잘못된 :해야 212-222-2222)
  • 는 홈 팩스 : 식별자 = 0 인덱스 = 0 전화 = (212) 555-5555 (올바른)
  • 작업 팩스 : 식별자 = 1 개 인덱스 = 1 전화 = (212) 666-6666 (올바른)

그것은 식별자 대리자에게 전달되는 모양 0과 1의 2 개 가지 항목에 대해 사용되기 때문에 정확하지 않다. 또한 인덱스 매핑에 대한 식별자가 올바르지 않을 수도 있습니다. 내가 올바른 인덱스 번호에 매핑 할 전화 번호 각각에 대해 서로 다른 식별자를보고 기대

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
    shouldContinueAfterSelectingPerson:(ABRecordRef)person 
    property:(ABPropertyID)property 
    identifier:(ABMultiValueIdentifier)identifier 
{ 
    if (property == kABPersonPhoneProperty) { 
     ABMutableMultiValueRef multi = ABRecordCopyValue(person, property); 
     if (multi != NULL) { 
      //Display all the phone numbers for the object 
      CFIndex xcount = ABMultiValueGetCount(multi); 
      NSLog(@"xcount = %lu", (unsigned long)xcount); 
      for (CFIndex xindex = 0 ; xindex < xcount ; ++xindex) { 
       CFStringRef xphone = (CFStringRef)ABMultiValueCopyValueAtIndex(multi, xindex); 
       NSLog(@"xindex:%ld phone:%@", (long)xindex, (__bridge NSString*)xphone); 
       if (xphone) { CFRelease(xphone); } 
      } 

      //Display the selected phone number 
      CFIndex itemIndex = ABMultiValueGetIndexForIdentifier(multi, identifier); 
      CFStringRef phone = (CFStringRef)ABMultiValueCopyValueAtIndex(multi, itemIndex); 
      NSLog(@"identifier:%ld itemIndex:%ld phone:%@", (long)identifier, (long)itemIndex, (__bridge NSString*)phone); 

      if (phone) { CFRelease(phone); } 
      CFRelease(multi); 
     } 
    } 
    return NO; 
} 

:

은 여기 내 간단한 위임 콜백입니다. 내가 누락 된 단계가 있습니까? iOS 7의 버그입니까?

도움이나 의견을 보내 주시면 감사하겠습니다.

답변

0

iOS 8과 9에서는 ABMultiValueGetIndexForIdentifier() (또는 그 뒤에있는 데이터)가 확실히 깨졌습니다. 그때까지는 충돌 추적이 없었기 때문에 iOS 7을 알 수 없습니다. 예 :

  • 식별자가 지금이 개 주소를 새 연락처 되세요 (0, 1)과 해당 인덱스 (0, 1)
  • 가 첫 번째 주소
  • 식별자에 대한 삭제 정확한지 나머지 주소는 (1)과 인덱스 (-1)입니다.

식별자가 1 인 것은 식별자이므로 이해할 수 있습니다. 그러나 색인은 0이어야합니다.당신이 3 개 주소를 사용할 때 어떤 일이 확연 :

  • (0, 1, 2), (0, 1, 2)
  • 삭제 첫 번째 주소
  • 가되다 (1 2) (1 , -1)
  • 첫 번째 주소를 클릭하면 두 번째 주소가 반환됩니다.
  • 두 번째 주소를 클릭하면 충돌이 발생합니다 (색인 -1을 확인하지 않으면 실제로는 안됨)

ID가 인덱스로 존재하면 ABMultiValueGetIndexForIdentifier가 식별자를 반환하거나 id가 인덱스 범위를 초과하면 -1을 반환합니다.

다른 각도에서 공격을 시도했지만 ABMultiValueGetIdentifierAtIndex도 손상된 것으로 보입니다. 따라서 항목을 반복하면 어느 쪽도 도움이되지 않습니다. ABMultiValueGetIdentifierAtIndex는 항상 색인 자체를 반환하는 것으로 보입니다 (iOS 9).

지금까지 나는 이것이 iOS의 버그라고 가정해야합니다. 다른 앱에서 내 테스트 연락처를 사용하면 똑같은 문제가있는 것 같습니다. 데이터를 감안할 때 ID와 ID-to-index-mapping이 실제로 깨져있는 것처럼 보입니다. 나를 위해 이드는 합리적이었다 (적어도).

ABPeoplePicker가 iOS 9에서 단종되었으므로보고가 도움이되지 않을 것이라고 생각합니다.