2015-07-03 40 views
2

我用下面的代码访问ABAddressBook:错误,同时访问ABAddressBook

+ (void)connectToAddressBook { 
    if(!_addressBook) 
    { 
     CFErrorRef error; 
     _addressBook = ABAddressBookCreateWithOptions(NULL, &error); 
     NSLog(@"Address book %@", _addressBook); 

     if (error != nil) { 
      NSLog(@"ERROR WHILE ACCESSING ADDRESS BOOK: %@", CFBridgingRelease(error)); 
      CFRelease(error); 
     } 

     if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
      ABAddressBookRequestAccessWithCompletion(_addressBook, ^(bool granted, CFErrorRef error) { 
       _isAccessToContactsAllowed = granted; 
      }); 
     } 
     else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
      _isAccessToContactsAllowed = YES; 
     } 
     else { 
      _isAccessToContactsAllowed = NO; 
     } 
    } 
} 

地址簿打开正常,但由于某种原因,误差不为零,并记录当前类的名称:

ERROR WHILE ACCESSING ADDRESS BOOK: MyContactManager 

为什么错误不是零?我的代码有问题吗?在发生真正错误的情况下,如何检测并停止尝试访问地址簿?

+0

检查什么错误,那么说? – Artrmz

+2

http://stackoverflow.com/questions/19724995/my-contact-not-add-in-addressbook-in-ios-7 – ilesh

+0

@Ilesh - 谢谢,*错误的作品。这很奇怪。这是一开始就是如此,但它打破了很多,所以我不得不重写它(有一个错误,调试器在试图登录时卡住了)。 – puzzler

回答

1

这里是我的固定方法,感谢反馈Ilesh:

+ (void)connectToAddressBook { 
    if(!_addressBook) { 
     CFErrorRef *error = nil; 
     _addressBook = ABAddressBookCreateWithOptions(NULL, error); 

     // To test if error is not nil: 
     //error = CFErrorCreate(NULL, CFSTR("Hello, world."), 111, NULL); 

     if (error != nil) { 
      NSLog(@"ERROR WHILE ACCESSING ADDRESS BOOK: %@", CFBridgingRelease(error)); 
      CFRelease(error); 
     } 
     else { 
      if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
       ABAddressBookRequestAccessWithCompletion(_addressBook, ^(bool granted, CFErrorRef error) { 
        _isAccessToContactsAllowed = granted; 
       }); 
      } 
      else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
       _isAccessToContactsAllowed = YES; 
      } 
      else { 
       _isAccessToContactsAllowed = NO; 
      } 
     } 
    } 
} 

编辑:

看来,我最初的错误是不分配错误。除非实际存在错误,否则地址簿创建不会设置错误。所以我的未分配变量指向内存中的一些随机位置,这就是为什么我第一次尝试时会出现随机错误。

更重要的是,ABAddressBookCreateWithOptions将返回如果有错误,所以要做到这一点,正确的做法是:

if(_addressBook) { 
    // do something 
} 
else { 
    // there is an error 
} 
0

替换你的整个代码,这

+ (void)connectToAddressBook { 
    if(!_addressBook) 
    { 
_addressBook = ABAddressBookCreateWithOptions(NULL, NULL); 
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
     ABAddressBookRequestAccessWithCompletion(addressBook, 
               ^(bool granted, CFErrorRef error) { 
                if (granted) 
                 dispatch_async(dispatch_get_main_queue(), ^{ 
                 _isAccessToContactsAllowed = granted; 
                }); 

                 }); 


    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
_isAccessToContactsAllowed = YES; 

    }); 
    } 
    else { 
     UIAlertView *alert=[[UIAlertView alloc] initWithTitle:Nil message:@"You don't have permission of access contacts for access go to Setting-" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
    } 
}} 
+0

谢谢,但我想知道尝试创建通讯录时是否有错误。 – puzzler