2011-10-26 6 views
2

ローカル連絡先とiCloud連絡先の間で連絡先をコピーしようとしていますが、結果が表示されません。このコードはエラーなく実行され、正常に動作するはずですが、後で新しく作成された連絡先は表示されません。誰でもそれに関する問題を見ますか?連絡先をあるソースから別のソースにコピーする

ABAddressBookRef addressBook = ABAddressBookCreate(); 

ABRecordRef abSourceSource = ABAddressBookGetSourceWithRecordID(addressBook, kABSourceTypeLocal); 
ABRecordRef abDestinationSource = ABAddressBookGetSourceWithRecordID(addressBook, kABSourceTypeCardDAV); 

CFArrayRef sourceContacts = ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, abSourceSource); 
CFArrayRef destinationContacts = ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, abDestinationSource); 

ABPersonCreatePeopleInSourceWithVCardRepresentation(abDestinationSource, ABPersonCreateVCardRepresentationWithPeople(sourceContacts)); 
ABPersonCreatePeopleInSourceWithVCardRepresentation(abSourceSource, ABPersonCreateVCardRepresentationWithPeople(destinationContacts))); 

ABAddressBookSave(addressBook, NULL); 

答えて

2

あなたはABAddressBookAddRecordでレコードを追加するのを忘れたと思います。ここに私の作業例です:

ABAddressBookRef addressBook = ABAddressBookCreate(); 
ABRecordRef abSource = ABAddressBookGetSourceWithRecordID(addressBook, kABSourceTypeLocal); 
NSURL *theURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"some.vcf"]; 
NSData *vCardData = [NSData dataWithContentsOfURL:theURL]; 
NSLog(@"data %@", vCardData); 
NSArray *createdPeople = (__bridge_transfer NSArray*)ABPersonCreatePeopleInSourceWithVCardRepresentation(abSource, (__bridge CFDataRef)vCardData); 
NSLog(@"createdPeople %@", createdPeople); 
CFErrorRef error = NULL; 
bool ok; 
for (id person in createdPeople) { 
    error = NULL; 
    ok = ABAddressBookAddRecord(addressBook, (__bridge ABRecordRef)person, &error); 
    if (!ok) { 
     NSLog(@"add err %@", error); 
     break; 
    } 
} 
if (ok) { 
    error = NULL; 
    BOOL isSaved = ABAddressBookSave(addressBook, &error); 
    if (isSaved) { 
     NSLog(@"saved.."); 
    } 
    if (error != NULL) { 
     NSLog(@"ABAddressBookSave %@", error); 
    } 
} 
CFRelease(addressBook);  
+0

こんにちはjazzbox最初の関数の引数としてレコードIDを使用することができ、感謝!あなたに知ってもらうために、このショットを私に教えてください。 Rob – rob5408

4

より根本的な問題があります - あなたは適切ABAddressBookGetSourceWithRecordIDを呼び出していません。 2番目のパラメータは、アドレス帳の特定のソースのレコードIDを指定するintです。特定のソースの種類を表す定数を渡しています。

あなたが渡す定数kABSourceTypeCardDavは常に4です。しかし、ユーザーのアドレス帳にあるiCloudソースのレコードIDは、非常に異なるものになります。あなたがする必要がどのような

すべてのソースを列挙し、その種類をテストし、そのようなものです:

NSArray *allSources = (NSArray*)ABAddressBookCopyArrayOfAllSources(addressBook); 

for (int i = 0; i < allSources.count; i++) { 
    ABRecordRef src = [allSources objectAtIndex:i]; 
    NSNumber *stObj = (NSNumber*)ABRecordCopyValue(src, kABSourceTypeProperty); 
    ABSourceType st = (ABSourceType)[stObj intValue]; 

    if (st == kABSourceTypeCardDAV) { 
     int recordID = ABRecordGetRecordID(src); 
     break; 
    } 
} 

次にあなたが

+3

ちょっとしたことを混乱させるだけです。 "kABSourceTypeCardDAV"のアドレス帳はすべてiCloudであるわけではありません。また、kABSourceTypeNamePropertyが "Card"であることを確認する必要があります。そうしないと、誤ってFacebookのアドレス帳に保存しようとしてしまうことがあります(これは、読み込み専用です)これらのすべてがCardDAVを使用することができます。 ユーザーが自分のデバイスにiCloudをまだ設定していない場合、代わりにローカルアドレス帳があり、iCloudを設定するときにiCloudアドレス帳になります。 –

関連する問題