IT技术博客大学习 共学习 共进步

iOS开发检测通讯录权限并申请开启

风雨雷电堂 2016-02-16 20:45:46 浏览 1,361 次

   在iOS 6中,以前工作正常的访问通讯录的iPhone程序可能会出错,现象是程序启动时不提醒用户是否允许程序访问通讯录,同时在“设置->隐私->通讯录”中看不到你的程序。另外,对通讯录进行操作的代码会报类似于以下消息的错误:

Could not compile statement for query (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties):  
SELECT ROWID, Name, ExternalIdentifier, Type, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Capabilities FROM ABStore WHERE Enabled = ?;  

   其原因是iOS 6加强了通讯录访问控制,要求开发人员显式声明需要访问通讯录,方法是调用 ABAddressBookRequestAccessWithCompletion方法,具体参见官方文档:

   http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/index.html

   我自已写了一个过程CheckAddressBookAuthorization放在helper里

+(void)CheckAddressBookAuthorization:(void (^)(bool isAuthorized))block
{
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    ABAuthorizationStatus authStatus = ABAddressBookGetAuthorizationStatus();

    if (authStatus != kABAuthorizationStatusAuthorized)
    {
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
         {
             dispatch_async(dispatch_get_main_queue(), ^{
                 if (error)
                 {
                     NSLog(@"Error: %@", (__bridge NSError *)error);
                 }
                 else if (!granted)
                 {

                     block(NO);
                 }
                 else
                 {
                     block(YES);
                 }
             });  
         });  
    }
    else
    {
        block(YES);
    }

}

   可以在load页调用以让用户打开权限,以后在调用AddressBook相关操作时都使用此方法来调用,但是只有第一次调用iOS才会弹出允许的提示窗口,所以如果第一次被拒绝了,就只能跪求用户去设置里打开了。

[ActionHelper CheckAddressBookAuthorization:^(bool isAuthorized){
    if(isAuthorized)
    {
        [self appViewPromptLoad:@"导入通讯录"];
        ...
    }
    else
    {
        [self appViewPromptInfo:@"请到设置>隐私>通讯录打开本应用的权限设置"];
    }
}];

建议继续学习

  1. mysql 1045(28000)错误 (阅读 5,484)
  2. 文件明明存在但是file_exists总是返回FALSE (阅读 4,905)
  3. Linux用户、用户组、文件权限学习笔记 (阅读 4,761)
  4. crontab异常,无法自动运行 (阅读 4,445)
  5. linux下如何自动提升权限 (阅读 4,445)
  6. (oracle)11g与10g中alter session权限差异 (阅读 4,384)
  7. ZooKeeper权限控制初探 (阅读 3,662)
  8. 看看Gmail的新功能 (阅读 3,444)
  9. IIS写权限利用续以及写权限漏洞来由解释 (阅读 3,001)
  10. mysql的权限信息的存储 (阅读 2,902)