获取地址簿数据它的代码在模拟器上运行,但没有运行iPhone设备。

时间:2013-09-20 16:05:50

标签: iphone ios objective-c xcode

我的应用程序中的tableView中有一个地址簿数据。此代码在模拟器中成功运行。我在模拟器中获取了我的应用程序的tableView中的联系人数据,但是当我在我的设备中测试它时,联系人的数据没有得到。我使用6.1模拟器和iPhone设备ios 6.1.3。请告诉我这段代码中的实际问题是什么? 此代码在模拟器中成功运行,但它的代码未在iPhone设备iOS 6.1.3中运行

谢谢你

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


}

3 个答案:

答案 0 :(得分:1)

从IOS 6.它需要授权您的应用访问系统数据: 在保密性标签和联系人部分的IPhone设置中,验证您的应用是否已访问

答案 1 :(得分:1)

要继续TDelepine的建议,可能在您的getPersonOutOfAddressBook方法中,您可以检查您的应用是否具有AddressBook访问权限。如果尚未确定访问状态,下面的代码将强制设备要求用户访问:

 ...
NSLog(@"Succesful.");

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {

       if(granted) {
            NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
            etc...
        }
    });
}

答案 2 :(得分:1)

我认为您没有发送访问地址簿的请求。另一件事如果您没有使用它,那么它在模拟器中正常工作但在iPhone中无法正常工作

在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.
}