IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

风雨雷电堂 2016-02-16 20:45:46 累计浏览 1,424 次
本机暂存

   在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. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. App的成本 (累计阅读 7,584)
  2. iPhone下的libcurl with SSL for iOS (累计阅读 6,350)
  3. iOS的定位原理揭秘 (累计阅读 5,946)
  4. iOS内存暴增问题追查与使用陷阱 (累计阅读 5,840)
  5. IOS APP设计流程 (累计阅读 5,085)
  6. 在Visual Studio中使用MonoTouch开发iOS应用程序(上):环境配置 (累计阅读 5,076)
  7. iOS push服务 (累计阅读 4,943)
  8. 有关思维,有关Ipad一个Bug的故事 (累计阅读 4,770)
  9. IPhone上的邮件推送 (累计阅读 4,617)
  10. 手机交互设计资料 (累计阅读 4,508)