2011-11-16 51 views
0

我是新来的目标C,我处于需要紧急创建应用程序的位置。我使用的XCode 4.2VCard阅读器不能正常工作

在App我会检测到QR码和的NSString格式得到一个电子名片的一部分: 我用下面的代码做了功能: -I进口下列到框架:

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

+3

“我是'新目标C'和我在我需要'紧急创建应用程序'的位置:“哦,我的天......哦,我的d .... – Oliver

回答

1

我假设你已经启用了ARC。

CFRetainvCardData当您使用它的对象时是否停止崩溃?数据对象可能只能存在直到范围结束。

或者可能更好,使用__bridge_retained

release notes on ARC

+0

我试过__bridge_retained,但它仍然不能正常工作 我不确定我是否理解你的问题,它在for循环中崩溃 – user1044771

+0

@ user1044771:你是否检查过“vCardPeople”非空,并且是阵列? – JeremyP

+0

我检查确认(基本上我是一个文本) 现在它不会崩溃,但它不保存在地址簿,任何线索? – user1044771

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); 
} 
+0

你有没有迅速的版本? – user998405