使用 Objective 中的 Contacts.Framework 将所有联系人导出到一个 .vcf 文件中 - C
Exporting all contacts in one .vcf file using Contacts.Framework in Objective - C
使用我 AddressBook.framework 我曾经从所有联系人创建 Contacts.vcf 并将其保存在文档目录中。
这是我以前使用的代码:
ABAddressBookRef addressBook1 = ABAddressBookCreate();
NSArray *arrayOfAllPeople = (__bridge_transfer NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook1);
long cnt = (unsigned long)[arrayOfAllPeople count];
if (cnt==0) {
ABAddressBookRequestAccessWithCompletion(addressBook1, nil);
}
if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
{
ABAddressBookRef addressBook2 = ABAddressBookCreate();
CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook2);
CFDataRef vcards = (CFDataRef)ABPersonCreateVCardRepresentationWithPeople(contacts);
NSString *vcardString = [[NSString alloc] initWithData:(__bridge NSData *)vcards encoding:NSUTF8StringEncoding];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *folderPath = [paths objectAtIndex:0];
NSString *filePath = [folderPath stringByAppendingPathComponent:@"Contacts.vcf"];
[vcardString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
CFRelease(addressBook2); }
如何使用 Contacts.framework 创建包含所有设备联系人的 Contacts.vcf 文件并将其保存在文档目录中?
从 iOS 9+ 版本 AddressBookUI.framework 和 Addressbook.framework 开始弃用。 Apple 引入了 ContactUI.framework 和 Contact.framework,并增强了 AddressBookUI.framework 和 Addressbook.framework。在这篇博客中,我们将讨论如何使用这两个新框架和导出 VCard。让我们开始从 phone 个联系人中选择联系人并访问该人的基本信息。
步骤 1. 创建新的 Xcode 项目名称 ContactDemo
并导入 Contacts.framework 和 ContactsUI.framework
,如图所示。
第二步,在工程中添加UIButton
、UIImageView
和3个UILabel
如图:
第 3 步。在各自的视图控制器中创建按钮操作、图像视图和标签的出口:
@property (weak, nonatomic) IBOutlet UIImageView *personImage;
@property (weak, nonatomic) IBOutlet UILabel *personName;
@property (weak, nonatomic) IBOutlet UILabel *emailId;
@property (weak, nonatomic) IBOutlet UILabel *phoneNo;
- (IBAction)selectAction:(id)sender;
第 4 步。将代表 CNContactPickerDelegate
添加到 viewController
。
第 5 步. 添加委托方法:
- (void) contactPicker:(CNContactPickerViewController *)picker
didSelectContact:(CNContact *)contact {
[self getContactDetails:contact];
}
此委托方法将 return 以 CNContact
对象的形式联系,该对象将在本地方法中进一步处理
-(void)getContactDetails:(CNContact *)contactObject {
NSLog(@"NAME PREFIX :: %@",contactObject.namePrefix);
NSLog(@"NAME SUFFIX :: %@",contactObject.nameSuffix);
NSLog(@"FAMILY NAME :: %@",contactObject.familyName);
NSLog(@"GIVEN NAME :: %@",contactObject.givenName);
NSLog(@"MIDDLE NAME :: %@",contactObject.middleName);
NSString * fullName = [NSString stringWithFormat:@"%@ %@",contactObject.givenName,contactObject.familyName];
[self.personName setText:fullName];
if(contactObject.imageData) {
NSData * imageData = (NSData *)contactObject.imageData;
UIImage * contactImage = [[UIImage alloc] initWithData:imageData];
[self.personImage setImage:contactImage];
}
NSString * phone = @"";
NSString * userPHONE_NO = @"";
for(CNLabeledValue * phonelabel in contactObject.phoneNumbers) {
CNPhoneNumber * phoneNo = phonelabel.value;
phone = [phoneNo stringValue];
if (phone) {
userPHONE_NO = phone;
}}
NSString * email = @"";
NSString * userEMAIL_ID = @"";
for(CNLabeledValue * emaillabel in contactObject.emailAddresses) {
email = emaillabel.value;
if (email) {
userEMAIL_ID = email;
}}
NSLog(@"PHONE NO :: %@",userPHONE_NO);
NSLog(@"EMAIL ID :: %@",userEMAIL_ID);
[self.emailId setText:userEMAIL_ID];
[self.phoneNo setText:userPHONE_NO];
}
第 6 步。创建 CNContactPickerViewController
class 对象并在按钮 IBAction 方法中注册其委托:
- (IBAction) selectAction:(id)sender {
CNContactPickerViewController *contactPicker = [CNContactPickerViewController new];
contactPicker.delegate = self;
[self presentViewController:contactPicker animated:YES completion:nil];
}
[self presentViewController:contactPicker animated:YES completion:nil];
将显示联系人列表视图。
第 7 步。运行 项目
一个。主视图
乙。点击“Select 联系人”按钮 CNContactPickerViewController
将打开,如图所示:
C。选择一个联系人,视图将关闭,您将获得该联系人的详细信息,如图所示:
之前我们写了访问联系人的权限代码,现在它隐式授予了访问联系人的权限。通过这个框架我们还可以生成VCard(VCF) 并在其他平台之间共享。以下是创建 VCard 的步骤。
第 1 步。从 CNContactPickerViewController
中选择联系人,您将在委托中获得 CNContact
对象,如上所述。
第2步。将联系人保存在文档目录中。由于数据以 NSData
形式存储,因此将联系人转换为 NSData
使用 CNContactVCardSerialization
class 表示 NSData
格式的 VCard。
- (NSString *) saveContactToDocumentDirectory:(CNContact *)contact {
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString * VCardPath = [documentsDirectory stringByAppendingString:@"/VCard.vcf"];
NSArray *array = [[NSArray alloc] initWithObjects:contact, nil];
NSError *error;
NSData *data = [CNContactVCardSerialization dataWithContacts:array error:&error];
[data writeToFile:VCardPath atomically:YES];
return VCardPath;
}
CNContactVCardSerialization
class 方法 dataWithContacts:error:
采用联系人对象数组(CNContact
class 对象)。
saveContactToDocumentDirectory
方法将returnVcard的文件路径。使用文件路径,您可以将联系人导出到任何您想要的地方。
来源:Contacts UI, Contacts Framework and create VCard(VCF) in Objective-C
您可以使用此方法获取.vcf 文件中的所有联系人。它 return 与您使用 AddressBook.framework.
得到的输出相同
- (void)getContacts {
NSMutableArray *contactsArray=[[NSMutableArray alloc] init];
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
dispatch_async(dispatch_get_main_queue(), ^{
});
return;
}
NSMutableArray *contacts = [NSMutableArray array];
NSError *fetchError;
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[[CNContactVCardSerialization descriptorForRequiredKeys], [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]];
BOOL success = [store enumerateContactsWithFetchRequest:request error:&fetchError usingBlock:^(CNContact *contact, BOOL *stop) {
[contacts addObject:contact];
}];
if (!success) {
NSLog(@"error = %@", fetchError);
}
// you can now do something with the list of contacts, for example, to show the names
CNContactFormatter *formatter = [[CNContactFormatter alloc] init];
for (CNContact *contact in contacts) {
[contactsArray addObject:contact];
// NSString *string = [formatter stringFromContact:contact];
//NSLog(@"contact = %@", string);
}
//NSError *error;
NSData *vcardString =[CNContactVCardSerialization dataWithContacts:contactsArray error:&error];
NSString* vcardStr = [[NSString alloc] initWithData:vcardString encoding:NSUTF8StringEncoding];
NSLog(@"vcardStr = %@",vcardStr);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *folderPath = [paths objectAtIndex:0];
NSString *filePath = [folderPath stringByAppendingPathComponent:@"Contacts.vcf"];
[vcardStr writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}];
}
使用我 AddressBook.framework 我曾经从所有联系人创建 Contacts.vcf 并将其保存在文档目录中。 这是我以前使用的代码:
ABAddressBookRef addressBook1 = ABAddressBookCreate();
NSArray *arrayOfAllPeople = (__bridge_transfer NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook1);
long cnt = (unsigned long)[arrayOfAllPeople count];
if (cnt==0) {
ABAddressBookRequestAccessWithCompletion(addressBook1, nil);
}
if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
{
ABAddressBookRef addressBook2 = ABAddressBookCreate();
CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook2);
CFDataRef vcards = (CFDataRef)ABPersonCreateVCardRepresentationWithPeople(contacts);
NSString *vcardString = [[NSString alloc] initWithData:(__bridge NSData *)vcards encoding:NSUTF8StringEncoding];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *folderPath = [paths objectAtIndex:0];
NSString *filePath = [folderPath stringByAppendingPathComponent:@"Contacts.vcf"];
[vcardString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
CFRelease(addressBook2); }
如何使用 Contacts.framework 创建包含所有设备联系人的 Contacts.vcf 文件并将其保存在文档目录中?
从 iOS 9+ 版本 AddressBookUI.framework 和 Addressbook.framework 开始弃用。 Apple 引入了 ContactUI.framework 和 Contact.framework,并增强了 AddressBookUI.framework 和 Addressbook.framework。在这篇博客中,我们将讨论如何使用这两个新框架和导出 VCard。让我们开始从 phone 个联系人中选择联系人并访问该人的基本信息。
步骤 1. 创建新的 Xcode 项目名称 ContactDemo
并导入 Contacts.framework 和 ContactsUI.framework
,如图所示。
第二步,在工程中添加UIButton
、UIImageView
和3个UILabel
如图:
第 3 步。在各自的视图控制器中创建按钮操作、图像视图和标签的出口:
@property (weak, nonatomic) IBOutlet UIImageView *personImage;
@property (weak, nonatomic) IBOutlet UILabel *personName;
@property (weak, nonatomic) IBOutlet UILabel *emailId;
@property (weak, nonatomic) IBOutlet UILabel *phoneNo;
- (IBAction)selectAction:(id)sender;
第 4 步。将代表 CNContactPickerDelegate
添加到 viewController
。
第 5 步. 添加委托方法:
- (void) contactPicker:(CNContactPickerViewController *)picker
didSelectContact:(CNContact *)contact {
[self getContactDetails:contact];
}
此委托方法将 return 以 CNContact
对象的形式联系,该对象将在本地方法中进一步处理
-(void)getContactDetails:(CNContact *)contactObject {
NSLog(@"NAME PREFIX :: %@",contactObject.namePrefix);
NSLog(@"NAME SUFFIX :: %@",contactObject.nameSuffix);
NSLog(@"FAMILY NAME :: %@",contactObject.familyName);
NSLog(@"GIVEN NAME :: %@",contactObject.givenName);
NSLog(@"MIDDLE NAME :: %@",contactObject.middleName);
NSString * fullName = [NSString stringWithFormat:@"%@ %@",contactObject.givenName,contactObject.familyName];
[self.personName setText:fullName];
if(contactObject.imageData) {
NSData * imageData = (NSData *)contactObject.imageData;
UIImage * contactImage = [[UIImage alloc] initWithData:imageData];
[self.personImage setImage:contactImage];
}
NSString * phone = @"";
NSString * userPHONE_NO = @"";
for(CNLabeledValue * phonelabel in contactObject.phoneNumbers) {
CNPhoneNumber * phoneNo = phonelabel.value;
phone = [phoneNo stringValue];
if (phone) {
userPHONE_NO = phone;
}}
NSString * email = @"";
NSString * userEMAIL_ID = @"";
for(CNLabeledValue * emaillabel in contactObject.emailAddresses) {
email = emaillabel.value;
if (email) {
userEMAIL_ID = email;
}}
NSLog(@"PHONE NO :: %@",userPHONE_NO);
NSLog(@"EMAIL ID :: %@",userEMAIL_ID);
[self.emailId setText:userEMAIL_ID];
[self.phoneNo setText:userPHONE_NO];
}
第 6 步。创建 CNContactPickerViewController
class 对象并在按钮 IBAction 方法中注册其委托:
- (IBAction) selectAction:(id)sender {
CNContactPickerViewController *contactPicker = [CNContactPickerViewController new];
contactPicker.delegate = self;
[self presentViewController:contactPicker animated:YES completion:nil];
}
[self presentViewController:contactPicker animated:YES completion:nil];
将显示联系人列表视图。
第 7 步。运行 项目
一个。主视图
乙。点击“Select 联系人”按钮 CNContactPickerViewController
将打开,如图所示:
C。选择一个联系人,视图将关闭,您将获得该联系人的详细信息,如图所示:
之前我们写了访问联系人的权限代码,现在它隐式授予了访问联系人的权限。通过这个框架我们还可以生成VCard(VCF) 并在其他平台之间共享。以下是创建 VCard 的步骤。
第 1 步。从 CNContactPickerViewController
中选择联系人,您将在委托中获得 CNContact
对象,如上所述。
第2步。将联系人保存在文档目录中。由于数据以 NSData
形式存储,因此将联系人转换为 NSData
使用 CNContactVCardSerialization
class 表示 NSData
格式的 VCard。
- (NSString *) saveContactToDocumentDirectory:(CNContact *)contact {
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString * VCardPath = [documentsDirectory stringByAppendingString:@"/VCard.vcf"];
NSArray *array = [[NSArray alloc] initWithObjects:contact, nil];
NSError *error;
NSData *data = [CNContactVCardSerialization dataWithContacts:array error:&error];
[data writeToFile:VCardPath atomically:YES];
return VCardPath;
}
CNContactVCardSerialization
class 方法 dataWithContacts:error:
采用联系人对象数组(CNContact
class 对象)。
saveContactToDocumentDirectory
方法将returnVcard的文件路径。使用文件路径,您可以将联系人导出到任何您想要的地方。
来源:Contacts UI, Contacts Framework and create VCard(VCF) in Objective-C
您可以使用此方法获取.vcf 文件中的所有联系人。它 return 与您使用 AddressBook.framework.
得到的输出相同- (void)getContacts {
NSMutableArray *contactsArray=[[NSMutableArray alloc] init];
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
dispatch_async(dispatch_get_main_queue(), ^{
});
return;
}
NSMutableArray *contacts = [NSMutableArray array];
NSError *fetchError;
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[[CNContactVCardSerialization descriptorForRequiredKeys], [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]];
BOOL success = [store enumerateContactsWithFetchRequest:request error:&fetchError usingBlock:^(CNContact *contact, BOOL *stop) {
[contacts addObject:contact];
}];
if (!success) {
NSLog(@"error = %@", fetchError);
}
// you can now do something with the list of contacts, for example, to show the names
CNContactFormatter *formatter = [[CNContactFormatter alloc] init];
for (CNContact *contact in contacts) {
[contactsArray addObject:contact];
// NSString *string = [formatter stringFromContact:contact];
//NSLog(@"contact = %@", string);
}
//NSError *error;
NSData *vcardString =[CNContactVCardSerialization dataWithContacts:contactsArray error:&error];
NSString* vcardStr = [[NSString alloc] initWithData:vcardString encoding:NSUTF8StringEncoding];
NSLog(@"vcardStr = %@",vcardStr);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *folderPath = [paths objectAtIndex:0];
NSString *filePath = [folderPath stringByAppendingPathComponent:@"Contacts.vcf"];
[vcardStr writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}];
}