【问题标题】:Copying contacts from one source to another将联系人从一个来源复制到另一个来源
【发布时间】:2011-12-15 10:37:02
【问题描述】:

我正在尝试在本地联系人来源和 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);

【问题讨论】:

    标签: iphone objective-c cocoa-touch abaddressbook icloud


    【解决方案1】:

    我认为您忘记使用 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);    
    

    【讨论】:

    • 您好爵士盒,谢谢!让我试一试,让你知道。罗伯
    【解决方案2】:

    还有一个更根本的问题 - 您没有正确调用 ABAddressBookGetSourceWithRecordID。它采用的第二个参数是一个 int,它指定地址簿中特定源的记录 ID。您正在向它传递一个描述特定源类型的常量。

    您传递的常数,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;
        }
    }
    

    然后你可以使用 recordID 作为第一个函数的参数

    【讨论】:

    • 只是为了让事情更加混乱 - 并非所有“kABSourceTypeCardDAV”地址簿都是 iCloud。您还需要检查 kABSourceTypeNameProperty 是否为“Card”,否则您可能最终会意外地尝试保存到 Facebook 通讯录(这不会很好,因为它是只读的)或 Google 或 Yahoo 通讯录,所有这些都可以使用 CardDAV。另请注意,如果用户尚未在其设备中设置 iCloud,他们将拥有一个本地通讯录,当他们配置 iCloud 时,该通讯录将成为他们的 iCloud 通讯录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多