3

问题

当我尝试使用损坏的 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 的文档没有提到数据损坏时会发生什么。
  • 我试过了@try@catch但没有真正抛出异常。
  • 由于框架正在记录所有这些语法错误,我确信它知道发生了什么事。我只是不知道如何抓住它。

为什么我关心损坏的数据

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

4

1 回答 1

1

我遇到了完全相同的问题,做了很多研究,但也找不到任何方法来捕获异常。

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

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 间接相关。也许直到几行之后当您的代码不准备处理空数组时它才会崩溃。

于 2012-07-19T13:47:14.793 回答