3

名前で交換連絡先を検索するアプリを開発しています (電話連絡先アプリと同様)。iOS の AddressBook API を使用し、ネットを検索します。iOS のアドレス帳 API の使用方法をまだ理解できません。交換連絡先を検索します。ABSource が検索可能であるという情報をアドレス帳が提供していることだけがわかりましたが、検索方法は提供されていません。任意の体を助けることができれば、それは大歓迎です。よろしくお願いします..私はこれにかなり長い間苦労してきました..

ABPeoplePicker のカスタマイズも試みましたが、あまり役に立ちませんでした。

4

1 に答える 1

0

これを解決するために私が取ったアプローチは、必要な ABSource レコードを見つけ、それらを使用してソース内の ABPerson レコードを取得し、いくつかのデータ構造を構築して NSPredicate でフィルタリングすることでした。少し複雑かもしれませんが、うまくいくようです。

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook);
CFIndex sourcesCount = CFArrayGetCount(sources);
ABRecordRef sourceToSearch = NULL;
for (CFIndex index = 0; index < sourcesCount; index++)
{
    ABRecordRef record = (ABRecordRef)CFArrayGetValueAtIndex(sources, index);
    NSNumber *sourceTypeNumber = (__bridge NSNumber *)(CFNumberRef)ABRecordCopyValue(record, kABSourceTypeProperty);
    ABSourceType sourceType = [sourceTypeNumber intValue];
    if (sourceType == 4) //this was the only source type with people on my phone, I guess you'll use kABSourceTypeExchange instead
    {
        sourceToSearch = record;
        break;
    }
}

CFArrayRef peopleInRecord = (CFArrayRef)ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, sourceToSearch);
CFIndex peopleCount = CFArrayGetCount(peopleInRecord);
NSMutableArray *peopleDictionaries = [NSMutableArray array];
for (CFIndex index = 0; index < peopleCount; index++)
{
    ABRecordRef personRecord = CFArrayGetValueAtIndex(peopleInRecord, index);
    ABRecordID recordID = ABRecordGetRecordID(personRecord);
    NSString *personName = (__bridge NSString *)(CFStringRef)ABRecordCopyValue(personRecord, kABPersonFirstNameProperty);
    if (personName)
    {
        NSDictionary *personDictionary = @{ @"recordID" : [NSNumber numberWithInt:recordID], @"name" : personName };
        [peopleDictionaries addObject:personDictionary];
    }
}

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"name",@"Kyle"];
NSArray *kyles = [peopleDictionaries filteredArrayUsingPredicate:predicate];
NSLog(@"filtered dictionarys = %@",kyles);
/*
 2012-08-27 17:26:24.679 FunWithSO[21097:707] filtered dictionaries = (
 {
 name = Kyle;
 recordID = 213;
 }
 )*/
//From here, get the recordID instance and go get your ABPerson Records directly from the address book for further manipulation.

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-08-27T23:31:34.853 に答える