检测ABPersonCreoplePeopleInSourceWithVCardRepresentation()中的错误

时间:2012-07-15 00:38:49

标签: ios vcard abrecord

问题

当我尝试使用损坏的vCard数据创建ABPerson ABPersonCreatePeopleInSourceWithVCardRepresentation()时,我的应用崩溃了。这是控制台输出:

2012-07-14 20:20:37.530 vCardTest[4418:707] vCard Syntax Error, character: 7 : /
2012-07-14 20:20:37.531 vCardTest[4418:707] Malformed BEGIN
2012-07-14 20:20:37.534 vCardTest[4418:707] vCard Syntax Error, character: 14 : n
2012-07-14 20:20:37.536 vCardTest[4418:707] Malformed BEGIN
2012-07-14 20:20:37.539 vCardTest[4418:707] vCard Syntax Error, character: 21 : i
2012-07-14 20:20:37.543 vCardTest[4418:707] Malformed BEGIN
2012-07-14 20:20:37.546 vCardTest[4418:707] vCard Syntax Error, character: 28 : o
2012-07-14 20:20:37.548 vCardTest[4418:707] Malformed BEGIN
2012-07-14 20:20:37.550 vCardTest[4418:707] vCard Syntax Error, character: 35 : s
2012-07-14 20:20:37.553 vCardTest[4418:707] Malformed BEGIN
2012-07-14 20:20:37.555 vCardTest[4418:707] vCard Syntax Error, character: 42 : g
2012-07-14 20:20:37.556 vCardTest[4418:707] Malformed BEGIN
2012-07-14 20:20:37.559 vCardTest[4418:707] Malformed BEGIN

我试图解决它

  • Apple's docs没有提及数据损坏时会发生什么。
  • 我尝试了@try@catch,但实际上并没有例外。
  • 由于框架记录了所有这些语法错误,我确信它知道某些事情正在发生。我只是不知道如何抓住它。

为什么我关心损坏的数据

生成vCard的输入字符串来自我无法控制的不同来源,因此很多时候输入数据甚至根本不是vCard。我只关心解析有效的vCard,这就是能够检测非vCard数据并将其丢弃的重要原因。

1 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题,进行了大量研究,但找不到任何方法来捕捉异常。

由于错误似乎不会影响我的应用,我只是忽略它们并检查扫描数据中找到了多少有效的vCard - 在我的情况下,vCard来自QR码,我希望它只包含一个电子名片。

CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, scannedVCard);

if(vCardPeople != NULL && CFArrayGetCount(vCardPeople) == 1) {
    // Successfully read one vCard, save it to contacts
    ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, 0);
    // ...
}
else {
    // Display an alert view to inform the user about malformed input data
}

你说你的应用程序崩溃了 - 我认为这只是与格式错误的vCard间接相关。也许它会在你的代码没有准备好处理空数组的几行之后才会崩溃。