【问题标题】:Adding vCard data directly to the system Address Book将 vCard 数据直接添加到系统通讯簿
【发布时间】:2011-12-28 07:24:59
【问题描述】:

我正在设计一个二维码阅读器,它需要检测并导入 vCard 格式 (.vcf) 的联系人卡片。

有没有办法直接将卡片数据添加到系统通讯录中,还是我需要自己解析vCard并单独添加每个字段?

【问题讨论】:

  • 有一个函数,ABPersonCreatePeopleInSourceWithVCardRepresentation() 用于重要的 VCF 数据,但它只在 iOS 5 中添加。你的目标是什么版本的 iOS?
  • 好吧,我还不确定版本可能是最新版本。我的应用程序现在适用于 iPhone 4 和 4s,我正在使用 iPhone 4s 测试它到 ios5(及更高版本)应该很好,谢谢
  • VCF 数据的变量类型是什么? NSData、NSString,还是只是一个实际文件的路径?
  • 它可能是 Nsstring。有什么建议吗?
  • 检查我的答案!我希望这行得通。

标签: objective-c ios addressbook


【解决方案1】:

如果您在 iOS 5 或更高版本上运行,此代码应该可以解决问题:

#import <AddressBook/AddressBook.h>

// This gets the vCard data from a file in the app bundle called vCard.vcf
//NSURL *vCardURL = [[NSBundle bundleForClass:self.class] URLForResource:@"vCard" withExtension:@"vcf"];
//CFDataRef vCardData = (CFDataRef)[NSData dataWithContentsOfURL:vCardURL];

// This version simply uses a string. I'm assuming you'll get that from somewhere else.
NSString *vCardString = @"vCardDataHere";
// This line converts the string to a CFData object using a simple cast, which doesn't work under ARC
CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];
// If you're using ARC, use this line instead:
//CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];

ABAddressBookRef book = ABAddressBookCreate();
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book);
CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData);
for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {
    ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);
    ABAddressBookAddRecord(book, person, NULL);
}

CFRelease(vCardPeople);
CFRelease(defaultSource);
ABAddressBookSave(book, NULL);
CFRelease(book);

确保链接到项目中的 AddressBook 框架。

【讨论】:

  • 非常感谢,非常感谢,我明天试试
  • 我正在决定读取什么二维码数据类型,我只知道文本的格式是这样的:
  • BEGIN:VCARD N;CHARSET=utf-8:;;;; FN;CHARSET=utf-8: ORG;CHARSET=utf-8: TITLE;CHARSET=utf-8: TEL;WORK: TEL;WORK;FAX: EMAIL;INTERNET;WORK;CHARSET=utf-8:<email> ADR;WORK;CHARSET=utf-8:;; URL;WORK;CHARSET=utf-8: <website> VERSION:2.1 END:VCARD 现在考虑到它将分布在几行上,我可以说它是一个 NSString 还是 NSSstring 只会占用该文本的第一行? (我对目标 C 相当陌生)</website></email>
  • NSString 可以轻松存储多行文本。
  • 桥代码是必需的,因为您使用的是 ARC,所以这是有道理的。这是最简单的问题:您是否提供了有效的 vCard 字符串?或者你只是在使用我的占位符?如果您使用占位符,那肯定行不通。您需要有一个有效的 vCard 字符串。
【解决方案2】:

Carter Allen 的回答对我有用,只是它导致我的应用程序在最终声明时崩溃 CFRelease(book);

原来CFRelease(person); 语句应该被删除。这样做可以阻止我的应用程序崩溃。请参阅此答案以获取解释https://stackoverflow.com/a/1337086/881103

还可以查看此页面上的“创建规则”和“获取规则”部分https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

【讨论】:

    【解决方案3】:

    Contacts 非常宽容,会尽力导入您的 vCard,但您的地址似乎不正确。应该有 7 个参数,用分号分隔:邮政信箱、Suite #、街道地址、城市、州、ZIP、国家。大多数人不使用邮政信箱(和套件#),这就是为什么一个典型的地址在开头有一个(或两个)分号。如果您的地址格式不正确,则参数可能会出现在错误的位置。

    vCard 中的各个字段以&lt;return&gt; 结尾:@"\r"

    你不需要CHARSET=utf-8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多