折腾:
[规避解决]swift中通过CNContactStore获取联系人列表出错:error=Error Domain=CNErrorDomain Code=100 "访问被拒绝”
好像是系统bug,绕不开。
所以打算,直接用
ios – CNContactPicker grant permission not prompting – Stack Overflow
提到的:
CNContactPickerViewController
去看看是否可以绕开权限,直接访问通讯录
参考:
iOS9系列专题五——全新的联系人与联系人UI框架 – 珲少的个人空间 – 开源中国社区
CNContactViewController Class Reference
CNContactPickerViewController Class Reference
看了半天,基本有点概念了:
CNContactPickerViewController:负责,读取联系人列表
CNContactViewController:负责点击单个联系人后,显示单个联系人的信息
这里还有个例子:
ContactsUISample/ViewController.swift at master · koogawa/ContactsUISample · GitHub
之前就试了试:
swift CNContactPickerViewController
swift CNContactViewController
contacts – CNContactPickerViewController() in xcode7 swift2 – Stack Overflow
然后试用了代码:
if #available(iOS 9.0, *) { let contactPicker = CNContactPickerViewController() contactPicker.displayedPropertyKeys = [CNContactEmailAddressesKey, CNContactPhoneNumbersKey] self.presentViewController(contactPicker, animated: true, completion: nil) |
可以显示出demo的效果:
然后此处,再去看看 设置-》隐私 中已经自动把此app添加了访问通讯录的权限,结果还是没有:
算了,去直接用:
class PhoneContactViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, CNContactPickerDelegate { /*************************************************************************** * CNContactPickerDelegate functions ***************************************************************************/ // Called when a property of the contact has been selected by the user. @available(iOS 9.0, *) func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) { print("didSelectContactProperty") let contact = contactProperty.contact let contactName = CNContactFormatter.stringFromContact(contact, style: .FullName) ?? "" let propertyName = CNContact.localizedStringForKey(contactProperty.key) let title = "\(contactName)’s \(propertyName)" dispatch_async(dispatch_get_main_queue()) { let alert = UIAlertController(title: title, message: contactProperty.value?.description, preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } } // Called when the user taps Cancel. @available(iOS 9.0, *) func contactPickerDidCancel(picker: CNContactPickerViewController) { print("contactPickerDidCancel") print("picker=\(picker)") } func readPhoneContactToList(){ print("readPhoneContactToList") if #available(iOS 9.0, *) { let contactPickerVC = CNContactPickerViewController() contactPickerVC.delegate = self let displayedItems = [CNContactPhoneNumbersKey, CNContactEmailAddressesKey, CNContactOrganizationNameKey, CNContactJobTitleKey] contactPickerVC.displayedPropertyKeys = displayedItems // self.presentViewController(contactPickerVC, animated: true, completion: nil) self.showViewController(contactPickerVC, sender: self) } else { // Fallback on earlier versions print("current OS version is <= 9.0") } } |
结果:
好像是,可以正常工作了?
没有报错,没有异常?没有出现权限问题?
此处直接黑色没东西,难道是因为,此处使用的是iOS模拟器,里面没有一个通讯录联系人而导致的?
那就去iOS模拟器中,想办法创建几个联系人:
先去Home:
再去选择到对应的联系人:
创建几个:
然后再去允许代码试试,看看能否出来联系人。
结果后来证实是,调用显示的代码不对,改为:
self.presentViewController(contactPickerVC, animated: true, completion: nil) // self.showViewController(contactPickerVC, sender: self) |
即可正常显示联系人:
然后,再去想办法:
[未解决]修改或扩展CNContactPickerViewController中的显示出来的单行的联系人显示形式
转载请注明:在路上 » [已解决]尝试用CNContactPickerViewController去绕开权限bug而直接访问通讯录