6

私のコードでは、ABPeoplePickerNavigationControllerを使用して人を選択します。ユーザーが連絡先リストから人を選択した後、指定された人のレコードに電話番号があるかどうかを確認します。

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
      ABMutableMultiValueRef phones;
      phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
      if (phones == nil || ABMultiValueGetCount(phones) == 0)
      {
          return NO;
      }
      // other code....
}

連絡先を作成し、それに電話番号を追加して、コードをテストしました。iOS 5では、このコードはうまく機能します。 phone変数には1つの電話番号が含まれます。

ただし、iOS 6では、連絡先をFacebookアカウントにリンクした後、phones変数に値が含まれていません。

Facebookアカウントとの連絡先のリンクを解除すると、すべてが再び正常に機能します。

この方法で人の電話番号を読み取るにはどうすればよいですか?

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

UPD

上記の関数でYESを返すと、関数で

 (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

私はすべての人の電話番号を通常の方法で読むことができます。では、なぜ最初の関数でそれらを読み取ることができないのですか?

4

2 に答える 2

9

私は自分の質問に対する答えを見つけました。連絡先がリンクされている場合は、メソッドで

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

リンクされた連絡先を表す person への参照を受け取ります。すべての電話番号を取得するには、リンクされているすべての連絡先を取得してから、その連絡先で電話番号を探す必要があります。私は次のコードでこれを行います:

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{

ABMutableMultiValueRef phones;
phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
if (phones == nil || ABMultiValueGetCount(phones) == 0)
{
    CFArrayRef linkedContacts = ABPersonCopyArrayOfAllLinkedPeople(person);
    phones = ABMultiValueCreateMutable(kABPersonPhoneProperty);
    ABMultiValueRef linkedPhones;
    for (int i = 0; i < CFArrayGetCount(linkedContacts); i++)
    {
        ABRecordRef linkedContact = CFArrayGetValueAtIndex(linkedContacts, i);
        linkedPhones = ABRecordCopyValue(linkedContact, kABPersonPhoneProperty);
        if (linkedPhones != nil && ABMultiValueGetCount(linkedPhones) > 0)
        {
            for (int j = 0; j < ABMultiValueGetCount(linkedPhones); j++)
            {
                ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j), NULL, NULL);
            }
        }
        CFRelease(linkedPhones);
    }
    CFRelease(linkedContacts);

    if (ABMultiValueGetCount(phones) == 0)
    {
        CFRelease(phones);
        return NO;
    }   
}
// other code ...

}

そのコードを使用して、リンクされた連絡先のすべての電話番号を受け取りました。

于 2012-10-25T08:54:43.717 に答える
0

ソリューション re: linked contact では、見つかった電話番号を保存する行を変更する必要があります

ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j),
    ABMultiValueCopyLabelAtIndex(linkedPhones, j), NULL);

後で「電話」を使用してラベルで確認できるようにします。与えられたソリューションは数字を格納するだけなので、kABPersonPhoneMainLabel のような定数に対してテストすることはできません。

このアプローチは、電子メールやアドレスにも使用されます。アドレスの場合、次のようにパーツを引き出します:-

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0);
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));
于 2012-11-28T14:30:56.890 に答える