iOS-ajouter un contact dans les Contacts?

Heyo! Y a-t-il un moyen de savoir comment lorsqu'un utilisateur appuie sur un bouton, il peut ajouter ou mettre à jour un contact dans le Livre de Contacts Apple? Certains festivals ont des réponses par courriel comprennent une "carte de nom" que le récepteur peut télécharger et trouver dans leur carnet de contact.

33
demandé sur HowbeitGirl 2013-03-26 01:49:05

3 réponses

Si vous faites cela dans iOS 9 ou version ultérieure, vous devez utiliser le cadre Contacts:

@import Contacts;

Vous devez également mettre à jour votre Info.plist, en ajoutant un NSContactsUsageDescription pour expliquer pourquoi votre application nécessite l'accès aux contacts.

Ensuite, lorsque vous voulez ajouter le contact par programme, vous pouvez faire quelque chose comme:

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);
    }
}];

Ou, mieux encore, si vous voulez ajouter le contact en utilisant le cadre ContactUI (en donnant à l'utilisateur une confirmation visuelle du contact et en le laissant l'adapter comme bon lui semble), vous peut importer les deux cadres:

@import Contacts;
@import ContactsUI;

Puis:

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

Ma réponse originale, en utilisant les frameworks AddressBook et AddressBookUI pour les versions iOS antérieures à 9, est ci-dessous. Mais si vous ne supportez que iOS 9 et versions ultérieures, utilisez les frameworks Contacts et ContactsUI comme indiqué ci-dessus.

--

Si vous voulez ajouter un contact à l'adresse de l'utilisateur de livre, vous utilisez AddressBook.Framework pour créer un contact, puis vous utilisez le AddressBookUI.Framework, pour présenter l'interface utilisateur pour permettre à l'utilisateur d'ajouter à leur personnel carnet d'adresses en utilisant ABUnknownPersonViewController. Ainsi, vous pouvez:

  1. Ajouter AddressBook.Framework et AddressBookUI.Framework à votre liste en vertu de Lien Binaire Avec les Bibliothèques;

  2. Importer le .fichiers h:

    #import <AddressBook/AddressBook.h>
    #import <AddressBookUI/AddressBookUI.h>
    
  3. Écrivez le code pour créer un contact, par exemple:

    // 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);
    

Consultez la référence de classe ABUnknownPersonViewController ou la section invitant l'utilisateur à créer un nouvel enregistrement de personne à partir des données existantes de L'adresse Guide De Programmation Du Livre.

75
répondu Rob 2017-02-27 22:57:19

Pour présenter le contrôleur de contact par défaut

Étape 1: Ajouter ContactUi.cadre dans le projet et l'importation

    #import <Contacts/Contacts.h>
    #import <ContactsUI/ContactsUI.h>

Etape 2: Ajouter ce code

 -(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];
    }

Etape 3:

Pour obtenir un rappel lorsque vous appuyez sur Terminé ou annuler, ajoutez <CNContactViewControllerDelegate> et implémentez la méthode delegate.

- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact{
    //You will get the callback here
}
2
répondu Hari R Krishna 2017-08-16 05:17:05
@import Contacts;
-(void)addToContactList
 {
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) {

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:@"This app previously was refused permissions to contacts; Please go to settings and grant permission to this app so it can add the desired contact" preferredStyle:UIAlertControllerStyleAlert];

    [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault 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.givenName = @"Test";

    contact.familyName = @"User";

    CNLabeledValue *homePhone = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:[CNPhoneNumber phoneNumberWithStringValue:@"91012-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);

    }

}];

 }
0
répondu Deepak Kumar 2017-07-26 13:39:44