Users Pricing

articles

home / developersection / articles / sample on contact-sync in ios

Sample on Contact-Sync in iOS

Tarun Kumar 4985 11 Dec 2015 Updated 13 May 2026

Previous:  Fetching Device Contacts using ABAddressBook framework in iOS
 

In our previousarticle we already learn about the code of address book framework step-by-step.So here we will not talk in detail about the address book only some importantpoint. In iOS device the contacts application allows users to manage theircontacts. And the address book framework allows us to get access to the addressbook database on the device. In our application we will display only name,phone number with its type.

 To create contact sync app using address book framework followthe steps:

1.   Open Xcode andcreate a new Single View Application. In the product name field enter “Contact-Sync-Demo”.Check mark on the iPhone option and Automatic Reference Counting and un-checkthe Storyboard.

2.  Ok, First ofall we will go to add some contacts into the address book. For this gotoleft-top on the Xcode and click on the Run button, after that simulator will beopen. On the simulator open the simulator contacts app and click on “+”button on the top-right of the screen to add contact and add contact like belowand click on 'Done' button, after that you can a contact now added like below:

Sample on Contact-Sync in iOS    Sample on Contact-Sync in iOS

3.     Now, click on the Contact-Sync-Demo project and under theSummary section, click on + buttonunder the ‘Linked Frameworks and Libraries’ and add ‘AddressBook.framework’,like this:

Sample on Contact-Sync in iOS

4.     Now, click on the ViewController.xib file and drag and droptable view from the Objects library. Like this:

Sample on Contact-Sync in iOS

5.     Now, create new class with name ‘Person’ and its parent willbe NSObject. Select Person.h file and between the @interface and @end add some properties such as Id, firstName, middleName, lastName, contactNumber, contactType, modificationDate, like this:

@property (nonatomic, strong) NSNumber *Id;
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *middleName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *contactNumber;
@property (nonatomic, strong) NSString *contactType;
@property (nonatomic, strong) NSDate *modificationDate;

6. Now, select AppDelegate.h file and add some properties of ViewController, ABAddressBookRef, NSMutableArray, and a method getContactsFromAddressBook: like this:

 @property (strong, nonatomic) ViewController *viewController;
     @property ABAddressBookRef addressBook;
     @property(nonatomic, strong) NSMutableArray *tableData;
     - (NSMutableArray*)getContactsFromAddressBook:(ABAddressBookRef*)phoneContacts;

7. Now, add an m character in the extension of AppDelegate.m file after its name will be AppDelegate.mm, we change it because we are going to use C/C++ methods and some other codes in this file so .m file will not handle the C/C++ code so we add and m character in this file. 

8. Now, in the AppDelegate.mm file add these code in the didFinishLaunchingWithOptions: method: 

    _addressBook = ABAddressBookCreate();

Above code will be used toget and store the address book reference into the _addressBook; andimplement the getContactsFromAddressBook: method that is already declared inthe header file and call it in the didFinishLaunchingWithOptions: method, withthe help of getContactsFromAddressBook: method we will fetch all the contactsfrom the device at first time when it will call, we will call it like this:

[self getContactsFromAddressBook];

9.     Now, select the ViewController.h file and create an outletfor the table view and named it TableViewRef,like this:

@property (strong, nonatomic) IBOutlet UITableView *TableViewRef;

That’s it, our devicecontacts fetch coding is completed, and below we are provided


 

our completecode of our app. But the code we are adding here is not completed


 

we willcomplete it in our next article. Here our main motive is to get device


 

contactson our app.


 


 

Now, run the application byclicking on the run button on the Xcode, in our app we


 

are displayingperson name with its mobile no and type,  like this:

Sample on Contact-Sync in iOS

Here is the Complete code of ourapplication:

 
AppDelegate.h file


 

#import <UIKit/UIKit.h>

#import <AddressBook/AddressBook.h>

#import "Person.h"

@interface AppDelegate : UIResponder< UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@property ABAddressBookRef addressBook;

@property(nonatomic, strong) NSMutableArray *tableData;

- (NSMutableArray*)getContactsFromAddressBook:(ABAddressBookRef*)phoneContacts;

@end

AppDelegate.mm file


 

#import "AppDelegate.h"

#import "ViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

  __block BOOL accessGranted = NO;

  _addressBook = ABAddressBookCreate();

  if (&ABAddressBookRequestAccessWithCompletion != NULL) { 

      dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

      ABAddressBookRequestAccessWithCompletion(_addressBook, ^(bool granted, CFErrorRef error) {

          accessGranted = granted;

          dispatch_semaphore_signal(semaphore);

      });

      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

  }

  ABAddressBookRegisterExternalChangeCallback(_addressBook, addressBookChanged, (__bridge void *)(self));

   // Override point for customization after application launch.

   self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

   UINavigationController *navController = [[UINavigationController alloc] initWithRoot   ViewController:self.viewController];

   self.window.rootViewController = navController;

   self.tableData = [[NSMutableArray alloc] init];

   [self getContactsFromAddressBook];

   [self.window makeKeyAndVisible];

   return YES;

}

- (void)getContactsFromAddressBook

{

   if(self.tableData.count<=0){

   CFErrorRef error = nil;

   ABAddressBookRef phoneContacts = ABAddressBookCreateWithOptions(NULL,& error);

   if (phoneContacts != nil) {

      NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOf      AllPeople(phoneContacts);

      NSUInteger i = 0;

      for(i = 0; i < [allContacts count]; i++)

      {

         ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];

         NSNumber *contactId = [NSNumber numberWithInt:ABRecordGetRecordID(contactPerson)];

         NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);

         NSString *middleName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonMiddleNameProperty);

         NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contact         Person, kABPersonLastNameProperty);

         NSDate *modificationDate = (__bridge_transfer NSDate *)ABRecordCopyValue(contactPerson, kABPersonModificationDateProperty);

         // Getting no of person contact numbers

        ABMultiValueRef numbersArr = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);

        NSUInteger j = 0;

        for(j = 0; j < ABMultiValueGetCount(numbersArr); j++)

        {

            NSString *cellN = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(numbersArr, j);

            NSString *cellT =(__bridge NSString*)ABAddressBookCopyLocalizedLabel( AB            MultiValueCopyLabelAtIndex(numbersArr, j));

            Person *person = [Person new];

            person.Id = contactId;

            person.firstName = firstName;

            person.middleName = middleName;

            person.lastName = lastName;

            person.modificationDate = modificationDate;

            person.contactNumber = cellN;

            person.contactType = cellT;

            [self.tableData addObject:person];

        }

     }

     CFRelease(phoneContacts);

     } else { 

        NSLog(@"Error reading Address Book");

     }

   }

.

.

.

@end

 

ViewController.h file 


 

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

@interface ViewController : UIViewController<ContactDelegate>

@property(nonatomic,strong) AppDelegate *obj;

@property (strong, nonatomic) IBOutlet UITableView *TableViewRef;

@end

ViewController.m file


 

#import "AppDelegate.h"

#import "ViewController.h"

#import "Person.h"

#import <AddressBook/AddressBook.h>

#define allTrim(object) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]

@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad

{

   [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.title = @"Contacts";

    _obj = (AppDelegate *)[UIApplication sharedApplication].delegate;

    _obj.delegate=self;

}

- (void)didReceiveMemoryWarning

{

   [super didReceiveMemoryWarning];

   // Dispose of any resources that can be recreated.

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

   // NSLog(@"%d",[[AppDelegate GetData] count]);

   NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];

   NSArray *array = [NSArray arrayWithObject:sortDescriptor];

   [_obj.tableData sortUsingDescriptors:array];

   return [_obj.tableData count];

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

   static NSString *identifier = @"Cell";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

   if(cell == nil){

      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];

   }

   Person *person = [_obj.tableData objectAtIndex:indexPath.row];

   NSString *personName;

   if(person.firstName.length != 0&& person.lastName.length != 0) {

      personName = [[NSString alloc] initWithFormat:@"%@ %@",person.firstName,person.lastName];

   }

   else if (person.lastName.length == 0) {

      personName = person.firstName;

   }

   else { 

      personName = person.lastName;

      cell.textLabel.text = personName;

      cell.detailTextLabel.text = [[NSString alloc] initWithFormat:@"%@: %@",person.contactType,person.contactNumber];

      return cell;

   }

@end

Person.h file


 

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, strong) NSNumber *Id;

@property (nonatomic, strong) NSString *firstName;

@property (nonatomic, strong) NSString *middleName;

@property (nonatomic, strong) NSString *lastName;

@property (nonatomic, strong) NSString *contactNumber;

@property (nonatomic, strong) NSString *contactType;

@property (nonatomic, strong) NSDate *modificationDate;

@end

 

Person.m file

#import "Person.h" 

@implementation Person 

@end

Next: we will learn how to add functionality(addition, deletion, or updation) on our Contact Application : Adding modification functionality in Contact sample


Tarun Kumar

Other