Reputation: 921
I have got a address book data into the tableView in my application.This code is running in simulator successfully. i got the data of contacts in the tableView of my app in simulator but when i test this in my device then data of contacts didn't get. I used 6.1 simulator and iPhone device ios 6.1.3. Please suggest me what is the actual problem in this code ? This code is run in simulator successfully but it's code didn't run in iPhone device iOS 6.1.3
Thanks You
ClsMainPageAppDelegate.h
#import <UIKit/UIKit.h>
#import "Person.h"
@interface ClsMainPageAppDelegate : UIResponder <UIApplicationDelegate>
{
}
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) Person *objPerson;
@end
ClsMainPageAppDelegate.m
#import "ClsMainPageAppDelegate.h"
#import "ClsMainPageViewController.h"
@implementation ClsMainPageAppDelegate
@synthesize objPerson;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
}
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *fullName;
@property (nonatomic, strong) NSString *phoneNumber;
@property (nonatomic, strong) NSString *workEmail;
@end
Person.m
#import "Person.h"
@implementation Person
- (id)init
{
self = [super init];
if (self)
{
}
return self;
}
@end
ClsAddressBookViewController.h
#import <UIKit/UIKit.h>
@interface ClsAddressBookViewController : UIViewController
- (IBAction)backcontacts:(id)sender;
@end
ClsAddressBookViewController.m
#import "ClsAddressBookViewController.h"
#import "ClsUpdateNetworkViewController.h"
#import "ClsMainPageAppDelegate.h"
#import "Person.h"
#import <AddressBook/AddressBook.h>
@interface ClsAddressBookViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) NSMutableArray *tableData;
@end
@implementation ClsAddressBookViewController
@synthesize tableData;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"Contacts";
self.tableData = [[NSMutableArray alloc]init];
[self getPersonOutOfAddressBook];
}
- (void)getPersonOutOfAddressBook
{
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook != nil)
{
NSLog(@"Succesful.");
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSUInteger i = 0;
for (i = 0; i < [allContacts count]; i++)
{
Person *person = [[Person alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
person.firstName = firstName;
person.lastName = lastName;
person.fullName = fullName;
//Mobile Number
ABMultiValueRef mobilenum = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);
NSUInteger k = 0;
for(k = 0; k < ABMultiValueGetCount(mobilenum); k++)
{
NSString *mobile = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(mobilenum, k);
if(k == 0)
{
person.phoneNumber = mobile;
NSLog(@"person.mobilenum = %@", person.phoneNumber);
}
else if (k==1)
person.phoneNumber = mobile;
}
[self.tableData addObject:person];
}
}
CFRelease(addressBook);
}
#pragma mark TableView Delegate
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.tableData count];
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Person *person = [self.tableData objectAtIndex:indexPath.row];
cell.textLabel.text = person.fullName;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Person *person = [self.tableData objectAtIndex:indexPath.row];
ClsMainPageAppDelegate *objdelegate = [[UIApplication sharedApplication]delegate];
objdelegate.objPerson = person;
UIStoryboard *storybrd = self.storyboard;
ClsAddressBookViewController *svc = [storybrd instantiateViewControllerWithIdentifier:@"clsUpdatecontrol"];
[self presentViewController:svc animated:YES completion:nil ];
}
Upvotes: 0
Views: 823
Reputation: 6454
I think you're not sending request for access Address Book. One other thing If you're not using this then It's work properly in simulator but not working in iPhone
Use this code in ViewDidLoad
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// dispatch_release(sema);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted) {
// Do whatever you want here.
}
Upvotes: 1
Reputation: 7155
To continue TDelepine's suggestion, perhaps in your getPersonOutOfAddressBook method, you can check if your app has AddressBook access. The code below will force the device to ask the user for access if access status has not been determined:
...
NSLog(@"Succesful.");
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if(granted) {
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
etc...
}
});
}
Upvotes: 1
Reputation: 2016
From IOS 6. it need to authorize your apps for to access system datas : In settings on your IPhone in confidentiality tab and contact section, verify if your app has acces is "on"
Upvotes: 1