VCard не работает - PullRequest
       3

VCard не работает

0 голосов
/ 16 ноября 2011

Я новичок в задаче C и могу срочно создать приложение.Я использую XCode 4.2

в части приложения. Я буду обнаруживать QR-код и получать VCard в формате NSString: я выполнил функцию, используя следующий код: -Я импортировал следующее в фреймворки:

AddressBookUI.framework
AddressBook.framework

в .h файле, который я написал:

#import <addressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

@interface HellowWorld : UIViewController<ABPeoplePickerNavigationControllerDelegate>{

}

-(IBAction)saveContacts;
@end

в .m файле, который я написал:

-(IBAction)saveContacts{
    NSString *vCardString = test //where the data will be comming from
    CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];  ABAddressBookRef book = ABAddressBookCreate(); 
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 
    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 
    for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {     
        ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);     
        ABAddressBookAddRecord(book, person, NULL);     
        CFRelease(person); 
    }  
    CFRelease(vCardPeople); 
    CFRelease(defaultSource); 
    ABAddressBookSave(book, NULL); 
    CFRelease(book); 
}

Я использовал этот код, но это не такработает.

Сначала он не скомпилировал эту строку:

CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; 

Мне пришлось изменить это на следующее:

CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];

и после компиляции он вылетает на этой строке:

 for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {

Выдает следующую зеленую ошибку: Thread1: Program Received Signal "EXC_BAD_ACCESS".Любые причины?

также это единственный способ сохранить VCard (в формате NSString) в адресной книге?другие предложения?

Ответы [ 2 ]

1 голос
/ 12 апреля 2012

Импорт данных Vcard в список контактов Iphone выполняется следующим образом.

Добавить AddressbookUi.framework

Добавить Addressbook.framework

Включить следующие заголовки:

#include AddressBook/ABAddressBook.h>
#include AddressBook/ABRecord.h>
#include AddressBook/ABSource.h>

И вызвать эту функцию:

-(void)importVcard {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *startPath = [paths objectAtIndex:0]; 
    NSString *filename  = @"contacts.vcf";
    NSString *filePath = [NSString stringWithFormat:@"%@/%@",startPath,filename];
    NSLog(@"File Path is %@",startPath);

    NSString *vCardString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil ];

    CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];  ABAddressBookRef book = ABAddressBookCreate(); 
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 

    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 

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

    CFRelease(vCardPeople); 
    CFRelease(defaultSource); 
    ABAddressBookSave(book, NULL); 
    CFRelease(book); 
}
1 голос
/ 16 ноября 2011

Я предполагаю, что вы включили ARC.

Останавливает ли CFRetain объект vCardData, пока вы его используете, сбой? Вероятно, объект данных выживет только до конца области действия.

Или, возможно, лучше, используйте __bridge_retained

См. примечания к выпуску ARC

...