我想了解iOS 6中的ABAdressBookCreateWithOptions和ABAddressBookRequestAccessWithCompletion方法。 我所能find的最多信息如下:“要请求访问联系人数据,请在调用ABAddressBookRequestAccessWithCompletion函数后调用ABAddressBookCreateWithOptions函数”。 我相信这些方法应该提醒用户决定是否允许应用程序访问联系人,但是当我使用它们时,我看不到任何提示。 有人可以提供一些示例代码,说明如何在真实世界的例子中一起调用这些方法吗? 我如何创build( CFDictionary )选项? 我有工作代码使用不推荐的ABAddressBookCreate方法,但需要更新到iOS 6以适应隐私问题。 在此先感谢任何可以在这里点亮的人!
我有一个使用iPhone的联系人的应用程序。 使用iOS 6时,系统会提示用户在第一次尝试时进行联系人访问。 此时,用户可以点击“允许”或“不允许”。 问题是当用户背景的应用程序,然后导航到设置 – >隐私 – >联系人切换我的应用程序的联系人隐私设置。 一旦切换,我可以在控制台上看到我的应用程序: 应用程序'UIKitApplication:com.myApp'exception退出,信号9:已杀死:9 在苹果的文档中我找不到任何有关这方面的信息。 有谁知道一个方法来防止这个? 这是devise的吗? 或者这是一个苹果的错误?
我即将推出的应用程序的一些testing版用户报告说,联系人列表包含大量重复的logging。 我使用ABAddressBookCopyArrayOfAllPeople的结果作为我自定义的联系人表格视图的数据源,它让我感到困惑,结果与iPhone的“联系人”应用程序不同。 当仔细查看“通讯录”应用程序时,似乎重复内容来源于“已链接卡片”的条目。 下面的屏幕截图已经被混淆了一下,但正如你在我的应用程序中最右边看到的,“Celine”显示了两次,而左侧的Contacts应用程序中只有一个“Celine”。 如果您点击单个联系人的行,您会看到一张带有两个“链接卡”的“统一信息”卡(如中间所示,因为他们不适合在一个屏幕截图上,所以没有使用塞琳的联系方式) : 关于“链接卡片”的问题在苹果为最终用户提供的论坛上有不less 话题 ,但除了许多指向404支持页面的事实之外,我实际上并没有解决所有应用程序用户的通讯录问题。 我宁愿处理它优雅,而不打扰用户。 更糟糕的是,似乎我不是唯一的这个问题,因为WhatsApp显示包含重复联系人的同一个列表 。 只是为了清楚重复的联系人的起源,我不存储,caching或以其他方式试图聪明的数组ABAddressBookCopyArrayOfAllPeople返回。 所以重复logging直接来自API调用。 有谁知道如何处理或检测这些连接的卡,防止重复logging显示? 苹果的通讯录应用程序,我们其他人也可以这样做吗? 更新:我写了一个库,并把它放在Cocoapods上解决手头的问题。 看到我的答案在下面
我有一个使用地址簿的应用程序。 当在iOS 6中运行时,它会在用户做某些需要通讯录访问的情况下运行此代码。 if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { if (granted) { showContactChooser(); } }); CFRelease(addressBookRef); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { showContactChooser(); } else { showAccessDeniedAlert(); } 这是完美的作品:我能读取联系人信息,当用户拒绝访问,应用程序作出相应的反应。 但是,如果用户: 允许在应用程序中访问联系人, 退出应用程序, 进入设置 – >隐私 – >联系人,并禁用应用程序的联系人访问, 运行应用程序, 当应用程序在后台运行时会转到设置并启用应用程序的联系人访问, 应用程序立即崩溃在main() ,没有exception信息或有意义的堆栈跟踪。 我试着打开“所有exception”和[NSException raise]断点,但是这并没有给我更多的信息。 即使应用程序在启动期间没有运行上述代码,也可以复制崩溃。 […]
我试图写一个简单的方法来要求用户访问他们的地址簿,然后打印出地址簿中每个人的名字。 我已经看到了很多教程,解释了如何在Objective-C中做到这一点,但是我们很难将其转换为快速。 这是迄今为止我所做的。 下面的块在我的viewDidLoad()方法中运行,并检查用户是否授权访问通讯录,如果他们还没有授权访问,第一个if语句将要求访问。 本节按预期工作。 var emptyDictionary: CFDictionaryRef? var addressBook: ABAddressBookRef? if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.NotDetermined) { println("requesting access…") addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil) ABAddressBookRequestAccessWithCompletion(addressBook,{success, error in if success { self.getContactNames(); } else { println("error") } }) } } else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Denied || ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Restricted) { println("access denied") } else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Authorized) { […]
我想获得一个iPhone的所有联系人列表。 我查了Address Book引用,我可能错过了一些东西,但是我没有看到它提供了一个获取联系人列表的方法。
有什么办法可以缩短这个时间吗? 我正在用光标运行,并采取名称,电话号码和电子邮件 如果我从查询循环中删除电话号码查询,它会在3秒内结束 任何想法我怎么能改善这个查询? 也许我在查询中做错了什么? (很明显,我正在做asynchronous,但仍然…用户不能等待很长时间) 希望有人可以分享他的想法 这是我的代码 ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { AddressBookEntity adr = new AddressBookEntity(); String id = cur.getString(cur .getColumnIndex(ContactsContract.Contacts._ID)); String name = cur .getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); adr.fullName = name; Cursor emailCur = cr .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + […]