2016-08-19 59 views
0

我試圖使用ABAddressBook將vcf文件導入到我的地址簿中。iOS:嘗試使用ABAddressBook導入聯繫人時崩潰

首先,我讀的文件,並獲得NSData的:

NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
    NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"VZAllContactBackup.vcf"]; 

    NSData *vcardData = [[NSFileManager defaultManager] contentsAtPath:fileName]; 

    NSInvocationOperation *newoperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(importVcardData:) object:vcardData]; 
    [serailPhotoQueue addOperation:newoperation]; 

然後,嘗試使用下面的代碼將其導入:

- (void) importAllVcard: (NSData *)VcardData { 

    ABAddressBookRef book = ABAddressBookCreate(); 
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 
    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, (__bridge CFDataRef)(VcardData)); 

    numberOfContacts = CFArrayGetCount(vCardPeople); 

    for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 
     @autoreleasepool { 
      ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index); 
      ABAddressBookAddRecord(book, person, NULL); 
     } 
    } 

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

這個邏輯工作正常,我在測試時,但不知何故,我收到很多崩潰的線:

numberOfContacts = CFArrayGetCount(vCardPeople); // line 76 

與下面的崩潰報告:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000 
Triggered by Thread: 11 

... 

Thread 11 name: 
Thread 11 Crashed: 
0 CoreFoundation     0x0000000181590508 CFArrayGetCount + 36 
1 contenttransfer     0x000000010007ad44 -[VZContactsImport importAllVcard:] (VZContactsImport.m:76) 
2 contenttransfer     0x000000010007ad44 -[VZContactsImport importAllVcard:] (VZContactsImport.m:76) 
3 contenttransfer     0x00000001000865fc -[VZBonjourReceiveDataVC importVcardData:] (VZBonjourReceiveDataVC.m:2228) 
4 CoreFoundation     0x00000001816b8ae0 __invoking___ + 144 
5 CoreFoundation     0x00000001815b0548 -[NSInvocation invoke] + 284 
6 Foundation      0x000000018206c9c4 -[NSInvocationOperation main] + 40 
7 Foundation      0x0000000181faeed8 -[__NSOperationInternal _start:] + 604 
8 Foundation      0x000000018206e904 __NSOQSchedule_f + 224 
9 libdispatch.dylib    0x00000001810fd47c _dispatch_client_callout + 16 
10 libdispatch.dylib    0x00000001811094c0 _dispatch_queue_drain + 864 
11 libdispatch.dylib    0x0000000181100f80 _dispatch_queue_invoke + 464 
12 libdispatch.dylib    0x000000018110b390 _dispatch_root_queue_drain + 728 
13 libdispatch.dylib    0x000000018110b0b0 _dispatch_worker_thread3 + 112 
14 libsystem_pthread.dylib   0x0000000181315470 _pthread_wqthread + 1092 
15 libsystem_pthread.dylib   0x0000000181315020 start_wqthread + 4 

這看起來像我讀的vcardData是空的?或者當我試圖寫這個vcf文件時,它失敗了?

NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"VZAllContactBackup.vcf"]; 

[[NSFileManager defaultManager] removeItemAtPath:fileName error:nil]; 
[receivedData writeToFile:fileName atomically:NO]; 

或其他任何情況可能導致此問題?

+0

numberOfContacts被定義爲?最喜歡你的VZAllContactBackup.vcf在實際設備上已損壞或不正確。嘗試在真實設備上覆制問題 –

+0

numberOfContacts被定義爲NSInteger。@ SamB – Xin

+0

這是不對的。它需要是CFIndex,例如CFIndex nPeople = CFArrayGetCount(allPeopleArray); –

回答

0

它看起來像ABPersonCreatePeopleInSourceWithVCardRepresentation返回NULL,所以你崩潰的CFArrayGetCount()調用與NULL解除引用。你需要檢查NULL。不知道有什麼方法可以確定它爲什麼返回NULL。也許文件不存在(寫入磁盤空間太小?),所以你傳遞了一個零數據。或者你試圖在文件仍然由Apple的文件保護在磁盤上加密時執行此操作。或者任何其他原因。

相關問題