无论我做什么,Swift中的ABPersonH​​asImageData总是返回false

时间:2014-10-23 05:12:46

标签: swift ios8 xcode6

我刚刚进入斯威夫特,我绊倒了这个。我想在方法

中获取联系人的联系人图像
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier)

首先检查联系人是否有图像,然后用

将其复制到新创建的常量中
if(ABPersonHasImageData(person))
    {
        let avatar : NSData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()
    }

问题是,它总是在模拟器中返回false。还不能在真正的手机上试试。 我究竟做错了什么?没有错误。从联系人中提取所有其他信息就可以了。

3 个答案:

答案 0 :(得分:1)

刚才修好了。在工作中尝试之后,我对代码进行了比较,并注意到我遗漏了一件事,这让它起作用了:

这一行:

pickerController.displayedProperties = [NSNumber(int: kABPersonPhoneProperty)]

我从未想过这是问题,因为图片显示在联系人视图中。当然,我现在需要知道如何在该列表中包含联系人的UIImage,但由于它不像kABPersonPhoneProperty那样可用,我真的不知道如何做到这一点。

这可能是个错误吗?难道我不能获得图像,即使上述行除了电话号码之外的所有内容都不包括在内吗?

我的解决方法是实施

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!) {
    //get the image, then hide everything except phone numbers
}

然后在下一步中定义隐藏在联系人视图中的内容。但这不是很好吗?

也许有人知道更好的解决方案。非常感谢!

答案 1 :(得分:0)

好吧,毕竟好像没有问题。我刚刚尝试了我的第一篇文章的代码,它的确有效。在我的设备上和同一个模拟器上......

自从我第一次遇到这个问题后,我重新安装了Xcode,也许这解决了它而没有我注意到。奇怪的错误......

尽管如此:(非)问题解决了!

答案 2 :(得分:0)

我想你总是从false收到ABPersonHasImageData的原因是你的代码没有访问任何AddressBook数据的权限,除了用户明确选择的数据(电话号码,你的情况)。

要请求权限,请将presentViewController: ...包裹在ABAddressBookRequestAccessWithCompletion中(或获取其他位置的权限,但之前您尝试访问该图片)。

e.g。

ABAddressBookRequestAccessWithCompletion(nil) {
        (granted:Bool, err:CFError!) in
        dispatch_async(dispatch_get_main_queue()) {
            if granted {
                // TODO: present ABPeoplePickerNavigationController etc.
            }
        }
}