gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:41:58 24 4
gpt4 key购买 nike

嘿嘿!有没有一种方法可以在用户点击按钮时将联系人添加或更新到实际的 Apple 通讯录中?一些节日的电子邮件回复包括一张“名片”,收件人可以下载并在他们的联系簿中找到。

最佳答案

如果在 iOS 9 或更高版本中执行此操作,您应该使用 Contacts 框架:

@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];

我的原始答案,使用 iOS 9 之前版本的 AddressBookAddressBookUI 框架,如下所示。但如果仅支持 iOS 9 及更高版本,请使用上面概述的 ContactsContactsUI 框架。

--

如果要在用户通讯录中添加一个联系人,使用AddressBook.Framework创建一个联系人,然后使用AddressBookUI.Framework来呈现用户界面允许用户使用 ABUnknownPersonViewController 将其添加到他们的个人地址簿中.因此,您可以:

  1. AddressBook.FrameworkAddressBookUI.Framework 添加到 Link Binary With Libraries 下的列表中;

  2. 导入 .h 文件:

    #import <AddressBook/AddressBook.h>
    #import <AddressBookUI/AddressBookUI.h>
  3. 编写创建联系人的代码,例如:

    // create person record

    ABRecordRef person = ABPersonCreate();

    // set name and other string values

    ABRecordSetValue(person, kABPersonOrganizationProperty, (__bridge CFStringRef) venueName, NULL);

    if (venueUrl) {
    ABMutableMultiValueRef urlMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(urlMultiValue, (__bridge CFStringRef) venueUrl, kABPersonHomePageLabel, NULL);
    ABRecordSetValue(person, kABPersonURLProperty, urlMultiValue, nil);
    CFRelease(urlMultiValue);
    }

    if (venueEmail) {
    ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFStringRef) venueEmail, kABWorkLabel, NULL);
    ABRecordSetValue(person, kABPersonEmailProperty, emailMultiValue, nil);
    CFRelease(emailMultiValue);
    }

    if (venuePhone) {
    ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    NSArray *venuePhoneNumbers = [venuePhone componentsSeparatedByString:@" or "];
    for (NSString *venuePhoneNumberString in venuePhoneNumbers)
    ABMultiValueAddValueAndLabel(phoneNumberMultiValue, (__bridge CFStringRef) venuePhoneNumberString, kABPersonPhoneMainLabel, NULL);
    ABRecordSetValue(person, kABPersonPhoneProperty, phoneNumberMultiValue, nil);
    CFRelease(phoneNumberMultiValue);
    }

    // add address

    ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
    NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];

    if (venueAddress1) {
    if (venueAddress2)
    addressDictionary[(NSString *) kABPersonAddressStreetKey] = [NSString stringWithFormat:@"%@\n%@", venueAddress1, venueAddress2];
    else
    addressDictionary[(NSString *) kABPersonAddressStreetKey] = venueAddress1;
    }
    if (venueCity)
    addressDictionary[(NSString *)kABPersonAddressCityKey] = venueCity;
    if (venueState)
    addressDictionary[(NSString *)kABPersonAddressStateKey] = venueState;
    if (venueZip)
    addressDictionary[(NSString *)kABPersonAddressZIPKey] = venueZip;
    if (venueCountry)
    addressDictionary[(NSString *)kABPersonAddressCountryKey] = venueCountry;

    ABMultiValueAddValueAndLabel(multiAddress, (__bridge CFDictionaryRef) addressDictionary, kABWorkLabel, NULL);
    ABRecordSetValue(person, kABPersonAddressProperty, multiAddress, NULL);
    CFRelease(multiAddress);

    // let's show view controller

    ABUnknownPersonViewController *controller = [[ABUnknownPersonViewController alloc] init];

    controller.displayedPerson = person;
    controller.allowsAddingToAddressBook = YES;

    // current view must have a navigation controller

    [self.navigationController pushViewController:controller animated:YES];

    CFRelease(person);

参见 ABUnknownPersonViewController Class ReferencePrompting the User to Create a New Person Record from Existing Data 地址簿编程指南部分。

关于iphone - iOS - 将联系人添加到联系人中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com