0

我是目标 C 的新手,我处于急需创建应用程序的位置。我正在使用 XCode 4.2

在应用程序的一部分中,我将检测 QR 码并获取 NSString 格式的 VCard:我使用以下代码完成了该功能:-我将以下内容导入框架:

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 格式)的唯一方法吗?还有其他建议吗?

4

2 回答 2

1

我假设您启用了 ARC。

CFRetain使用对象时是否vCardData会停止崩溃?数据对象可能只存在到范围结束。

或者可能更好,使用__bridge_retained

请参阅ARC 上的发行说明

于 2011-11-16T16:42:04.037 回答
1

将 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); 
}
于 2012-04-12T06:37:26.807 回答