Iphone iOS-将联系人添加到联系人中?

Iphone iOS-将联系人添加到联系人中?,iphone,ios,email,uibutton,contacts,Iphone,Ios,Email,Uibutton,Contacts,嗨! 当用户点击按钮时,有没有办法将联系人添加或更新到实际的苹果联系人簿中?一些节日的电子邮件回复包括一张“名片”,接收者可以下载该名片并在其联系人簿中找到。如果在iOS 9或更高版本中进行此操作,则应使用联系人框架: @import Contacts; 您还需要更新您的Info.plist,添加NSContactsUsageDescription,以解释您的应用程序需要访问联系人的原因 然后,当您希望以编程方式添加联系人时,可以执行以下操作: CNAuthorizationStatus st

嗨!
当用户点击按钮时,有没有办法将联系人添加或更新到实际的苹果联系人簿中?一些节日的电子邮件回复包括一张“名片”,接收者可以下载该名片并在其联系人簿中找到。

如果在iOS 9或更高版本中进行此操作,则应使用
联系人
框架:

@import Contacts;
您还需要更新您的
Info.plist
,添加
NSContactsUsageDescription
,以解释您的应用程序需要访问联系人的原因

然后,当您希望以编程方式添加联系人时,可以执行以下操作:

CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Access to contacts." message:@"This app requires access to contacts because ..." preferredStyle:UIAlertControllerStyleActionSheet];
    [alert addAction:[UIAlertAction actionWithTitle:@"Go to Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
    }]];
    [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
    [self presentViewController:alert animated:TRUE completion:nil];
    return;
}

CNContactStore *store = [[CNContactStore alloc] init];

[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (!granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // user didn't grant access;
            // so, again, tell user here why app needs permissions in order  to do it's job;
            // this is dispatched to the main queue because this request could be running on background thread
        });
        return;
    }

    // create contact

    CNMutableContact *contact = [[CNMutableContact alloc] init];
    contact.familyName = @"Doe";
    contact.givenName = @"John";

    CNLabeledValue *homePhone = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:[CNPhoneNumber phoneNumberWithStringValue:@"312-555-1212"]];
    contact.phoneNumbers = @[homePhone];

    CNSaveRequest *request = [[CNSaveRequest alloc] init];
    [request addContact:contact toContainerWithIdentifier:nil];

    // save it

    NSError *saveError;
    if (![store executeSaveRequest:request error:&saveError]) {
        NSLog(@"error = %@", saveError);
    }
}];
或者,更好的是,如果您想使用
ContactUI
框架添加联系人(为用户提供联系人的视觉确认,并让他们根据自己的喜好进行定制),您可以导入这两个框架:

@import Contacts;
@import ContactsUI;
然后:

CNContactStore *store = [[CNContactStore alloc] init];

// create contact

CNMutableContact *contact = [[CNMutableContact alloc] init];
contact.familyName = @"Smith";
contact.givenName = @"Jane";

CNLabeledValue *homePhone = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:[CNPhoneNumber phoneNumberWithStringValue:@"301-555-1212"]];
contact.phoneNumbers = @[homePhone];

CNContactViewController *controller = [CNContactViewController viewControllerForUnknownContact:contact];
controller.contactStore = store;
controller.delegate = self;

[self.navigationController pushViewController:controller animated:TRUE];
下面是我最初的答案,使用9之前iOS版本的
AddressBook
AddressBookUI
框架。但如果只支持iOS 9及更高版本,请使用上文所述的
Contacts
ContactsUI
框架

--

如果要将联系人添加到用户的通讯簿中,请使用
AddressBook.Framework
创建联系人,然后使用
AddressBookUI.Framework
显示用户界面,以允许用户使用将其添加到其个人通讯簿中。因此,您可以:

  • AddressBook.Framework
    AddressBookUI.Framework
    添加到下面的列表中

  • 导入.h文件:

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

  • 请参阅通讯簿编程指南的或部分。

    以显示默认的联系人控制器

    第1步: 将ContactUi.framework添加到项目中并导入

        #import <Contacts/Contacts.h>
        #import <ContactsUI/ContactsUI.h>
    
    第三步:

    要在按“完成”或“取消”时获得回拨,请添加
    ,并实现委派方法

    - (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact{
        //You will get the callback here
    }
    

    为什么要输入“status==CNAuthorizationStatusDenied | | status==CNAuthorizationStatusDenied”?输入错误。应该被拒绝| |限制。请参阅修改后的答案。您能否帮助我了解为什么在创建以下标记值时无法使用自定义标识符:
    let app=CNLabeledValue(标签:“app”,值:appURL);contact.urlAddresses.append(app)
    请注意,如果iPhone仅使用iCloud保存联系人,我可以使用它。但是如果我使用的是谷歌联系人,它就不起作用了;(os/kern)无效功能(0x14)“无法插入副本发送”2017-03-29 06:05:56.068572 doko[26442:3530002][Common]\u BSMachError:端口e317;(os/kern)无效名称(0xf)“无法取消分配发送权限”我无法在此处对谷歌的限制发表评论,也不使用谷歌联系人,因此无法轻松验证。听起来,这应该作为它自己关于堆栈溢出的问题发布(假设您搜索了那个特定的错误消息,但什么也没找到)。
        #import <Contacts/Contacts.h>
        #import <ContactsUI/ContactsUI.h>
    
     -(void)showAddContactController{
            //Pass nil to show default contact adding screen
            CNContactViewController *addContactVC = [CNContactViewController viewControllerForNewContact:nil];
            addContactVC.delegate=self;
            UINavigationController *navController   = [[UINavigationController alloc] initWithRootViewController:addContactVC];
            [viewController presentViewController:navController animated:NO completion:nil];
        }
    
    - (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact{
        //You will get the callback here
    }