iOS 通讯录问题

来源:互联网 发布:网络主播唱歌是真的吗 编辑:程序博客网 时间:2024/05/22 13:29

转自http://h7ing.lofter.com/post/db4d2_2de8e2


iOS6.0中获取联系人信息的bug

    在iOS6.0之前,通过ABAddressBookCreate()可以直接获取到联系人信息。但之后苹果加强了隐私设置,原来的接口不会提示用户是否允许访问通讯录,只有使用新的接口才行。
比如:
    CFErrorRef error;
    ABAddressBookRef result = ABAddressBookCreateWithOptions(NULL, &error);
    if (!result)
    {
        NSLog(@"get addressBook failed:%@", error);
        CFRelease(error);
    }
    else
    {
//        if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
//        {
                ABAddressBookRequestAccessWithCompletion(result, ^(bool granted, CFErrorRef error) {
                    if (granted)
                    {
                        NSLog(@"granted");
                    }
                    else
                    {
                        NSLog(@"%@", error);
                        CFRelease(error);
                    }
                });
//        }
    }

在调用ABAddressBookCreateWithOptions之后,需要再请求一次权限ABAddressBookRequestAccessWithCompletion。

现在的文档只说"The user is only asked for permission the first time you request access. Later calls use the permission granted by the user."。从实际情况来看,这个"the first time"代表从应用装入手机开始,即使删除后重新安装,也不会自动弹出提示了。XD

因为第二次安装后,ABAddressBookCreateWithOptions直接返回NULL(如果删除前拒绝了访问通讯录),error code为1,即kABOperationNotPermittedByUserError,之后的ABAddressBookRequestAccessWithCompletion也就没有了意义,因为这个函数传入的参数必须为"a non-NULL ABAddressBookRef",也就是说,重装后系统再也不会提示用户是否允许应用访问通讯录了。

现在的测试环境为iPod 4, 32GB, iOS 6.0.1

另外,模拟器中是不会弹出隐私权限提示的:
Notes and Known Issues
"No privacy alerts are displayed in iOS Simulator for apps that access Photos, Contacts, Calendar, and Reminders. "



附图:目前的访问通讯录系统提示,貌似有点问题,至少简体中文是这样。

以上是转载内容。

这个问题最近在工作的时候遇到的。测试的时候在装入应用的时候,版本是6.1,确实弹筐提示。但是提示的是“相访问您的日历”啊```为!么!B!

而且如上所说删除之后重装也不会在有提示```为!么!B!


后来进一步测试发现。假如在删除的时候,你设定的是允许访问的权限,那么删除之后重新装,也同样是允许访问的权限。由此可推断,应用删除后,并没有删除所有的相关信息,iphone有所保留。so,“第一次”之后再也不弹框了(瞬间``想到了初夜``)

而且在测试过程中如果不给允许访问权限的话,对ABAddressBookRef的操作会出现很多问题(比如,随机性程序挂掉、向通讯录中写入数据有的时候成功有的时候失败```)

所以弹框提示只能我们自己来。通过

ABAddressBookGetAuthorizationStatus()判断