2016-08-19 2 views
0

Я пытаюсь импортировать файл vcf в свою адресную книгу, используя ABAddressBook.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

numberOfКонтакты определяется как? Скорее всего, ваш VZAllContactBackup.vcf поврежден или некорректен на самом устройстве. Попробуйте реплицировать проблему на реальном устройстве. –

+0

numberOfContacts определяется как NSInteger. @ SamB – Xin

+0

Неправильно. Он должен быть CFIndex, например. CFIndex nPeople = CFArrayGetCount (allPeopleArray); –

ответ

0

Похоже, что ABPersonCreatePeopleInSourceWithVCardRepresentation возвращает NULL, поэтому вы вызываете ошибку при вызове CFArrayGetCount() с помощью разыменования NULL. Вам нужно проверить NULL. Не уверен, что есть какой-либо способ определить, почему он возвращает NULL. Возможно, файл не существует (слишком мало места на диске для его записи?), Поэтому вы передали данные nil. Или вы пытались сделать это в то время, когда файл по-прежнему был зашифрован на диске защитой файлов Apple. Или любое количество других причин.

 Смежные вопросы

  • Нет связанных вопросов^_^