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コードからのものであり、正確に1つの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 に答える