2015-02-25 2 views
0

Я хочу получить доступ ко всем контактам из телефонной книги в IOS. Я попытался ниже кодЗастрял в доступе к контактам из телефонной книги в IOS

CFErrorRef error = NULL; 

    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 

    if (addressBook != nil) 
    { 
     NSLog(@"Succesful."); 

     NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 

    } 

этот код работает хорошо, и все контакты откладываются в «allContacts» массив в моем демо-проект, но когда я ставлю этот код в моем существующем проекте его возвращение «ноль» записи. Ниже представлены мои файлы заголовка и реализации моего существующего проекта, в которых я действительно хочу его использовать.

//.h file 
#import <UIKit/UIKit.h> 
#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 

@interface TestingViewController : UIViewController 
-(IBAction)GetContacts; 
-(void)GetPBAccess; 
@end 


    //.m file 
    #import "TestingViewController.h" 
    #import <AddressBook/AddressBook.h> 
    #import <AddressBookUI/AddressBookUI.h> 

    @interface TestingViewController() 

    @end 

    @implementation TestingViewController 

    - (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 GetPBAccess]; 
    } 
    - (void)didReceiveMemoryWarning 
    { 
     [super didReceiveMemoryWarning]; 
     // Dispose of any resources that can be recreated. 
    } 
    -(void)GetPBAccess 
{ 
    ABAddressBookRef addressBook1 = ABAddressBookCreateWithOptions(NULL, NULL); 
    switch (ABAddressBookGetAuthorizationStatus()) { 
     case kABAuthorizationStatusNotDetermined: 
     { 
      ABAddressBookRequestAccessWithCompletion(addressBook1, ^(bool granted, CFErrorRef error) { 
       if (granted) { 
        NSLog(@"Access Granted"); 
        [self GetContacts]; 
       } 
       else{ 
        NSLog(@"Access Not Granted"); 
       } 
      }); 
      break; 
     } 
     case kABAuthorizationStatusAuthorized: 
     { 
      NSLog(@"AUTHORIZATION ALREADY Granted"); 
      [self GetContacts]; 
      break; 
     } 
     case kABAuthorizationStatusDenied: 
     { 
      NSLog(@"AUTHORIZATION DENIED"); 
      break; 
     } 

     default: 
      break; 
    } 
} 


    -(IBAction)GetContacts 
    { 
     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; 

       //email 
       ABMultiValueRef emails = ABRecordCopyValue(contactPerson, kABPersonEmailProperty); 

       //   NSUInteger j = 0; 
       //   for (j = 0; j < ABMultiValueGetCount(emails); j++) 
       //   { 
       //    NSString *email = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(emails, j); 
       //    if (j == 0) 
       //    { 
       //     person.homeEmail = email; 
       //     NSLog(@"person.homeEmail = %@ ", person.homeEmail); 
       //    } 
       // 
       //    else if (j==1) 
       //     person.workEmail = email; 
       //   } 
       // 
       //   [self.tableData addObject:person]; 
      } 
     } 

     CFRelease(addressBook); 
    } 


    /* 
    #pragma mark - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 
     // Get the new view controller using [segue destinationViewController]. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

    @end 
+0

Что он делает? Где вы запрашиваете авторизацию? – Wain

+0

@Wain Запрошенное разрешение OP в GetPBAccess –

+0

Спасибо @LyndseyScott неправильно прочитал и подумал, что это просто запись – Wain

ответ

0

Проблема выглядит потому, что вы называете

[self GetPBAccess]; 
    [self GetContacts]; 

непосредственно рядный. Что вы должны сделать, это переместить вызов GetContacts в GetPBAccess, чтобы он вызывался, как только вы знаете, что у вас есть доступ (и не вызывается, если у вас нет доступа).

В настоящий момент он будет запущен до того, как пользователь предоставит доступ, конечно, в первый раз, когда вы попробуете его, и ничего не вернете.

+0

Я изменил свой код и добавил метод [GetContacts] в методе [GetPbAccess], но снова дал нуль массиву * allConatcts. –

+0

Не содержит ли 'ошибка' что-нибудь? Вывод каких-либо исключений или сообщений журнала? – Wain

Смежные вопросы