使用 Swift 访问 iOS 地址簿:数组计数为零

2024-03-11

我正在尝试编写一个简单的方法来要求用户访问他们的地址簿,然后打印出地址簿中每个人的姓名。我看过很多教程解释如何在 Objective-C 中做到这一点,但我很难将它们转换为 swift。

这是我到目前为止所做的事情。下面的块在我的 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)
        {
            println("access granted")
            getContactNames()
        }

一旦我知道用户已授予访问权限,我就运行下面的 getContactNames() 方法。经过多次反复之后,我终于能够通过添加 takeRetainedValue() 方法来编译它,以便将 ABAddressBookCopyArrayOfAllPeople 返回的数组从非托管数组转换为托管数组,然后这允许我将 CFArrayRef 转换为NSArray。

我遇到的问题是 contactList 数组最终计数为 0,因此跳过了 for 循环。在我的模拟器中,地址簿有 6 或 7 条记录,因此我希望数组具有该长度。有任何想法吗?

func getContactNames()
    {
        addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
        var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
        println("records in the array \(contactList.count)") // returns 0

        for record:ABRecordRef in contactList {
            var contactPerson: ABRecordRef = record
            var contactName: String = ABRecordCopyCompositeName(contactPerson).takeRetainedValue()
            println ("contactName \(contactName)")
        }
    }

另外一点 - 如果我使用 ABAddressBookGetPersonCount 方法,它会返回 -1。

 var count: CFIndex = ABAddressBookGetPersonCount(addressBook);
        println("records in the array \(count)") // returns -1

基于此链接ABAddressBookGetPersonCount 在 iOS 中返回 -1 https://stackoverflow.com/questions/13371996/abaddressbookgetpersoncount-returns-1-in-ios,似乎这个函数返回 -1 可能与未授予权限有关,但我确实在上面的代码中请求了权限(并在我在模拟器中运行应用程序时授予了权限)


现在这一切都变得简单多了。需要注意的主要事情是,如果您未经授权创建 ABAddressBook,您会得到一个邪恶的地址簿 - 它不是零,但也没有任何好处。以下是我目前建议您设置授权状态并在必要时请求授权的方式:

var adbk : ABAddressBook!

func createAddressBook() -> Bool {
    if self.adbk != nil {
        return true
    }
    var err : Unmanaged<CFError>? = nil
    let adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, &err).takeRetainedValue()
    if adbk == nil {
        println(err)
        self.adbk = nil
        return false
    }
    self.adbk = adbk
    return true
}

func determineStatus() -> Bool {
    let status = ABAddressBookGetAuthorizationStatus()
    switch status {
    case .Authorized:
        return self.createAddressBook()
    case .NotDetermined:
        var ok = false
        ABAddressBookRequestAccessWithCompletion(nil) {
            (granted:Bool, err:CFError!) in
            dispatch_async(dispatch_get_main_queue()) {
                if granted {
                    ok = self.createAddressBook()
                }
            }
        }
        if ok == true {
            return true
        }
        self.adbk = nil
        return false
    case .Restricted:
        self.adbk = nil
        return false
    case .Denied:
        self.adbk = nil
        return false
    }
}

以下是如何循环遍历所有人并打印出他们的名字:

func getContactNames() {
    if !self.determineStatus() {
        println("not authorized")
        return
    }
    let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as NSArray as [ABRecord]
    for person in people {
        println(ABRecordCopyCompositeName(person).takeRetainedValue())
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swift 访问 iOS 地址簿:数组计数为零 的相关文章

随机推荐

  • 如何修复 Flash 安全错误 #2048

    我在 flash 2048 中遇到错误 我能找到的所有内容都表明这是一项安全预防措施 因为文件不在同一域中 我们有一个在 Rackspace 云服务器上运行的网站 现在正尝试使用云文件 CDN 来加速我们在网站上使用的产品轮换工具 您可以使
  • 如何验证用作反向代理的 Squid 是否正常工作?

    我们希望减少其中一台 Web 服务器的负载 并且正在使用配置为反向代理的鱿鱼运行一些测试 配置在下面的备注中 http port 80 accel defaultsite original server com cache peer ori
  • 用于查找名称以给定值开头的属性的 XPath

    使用这个 xml div a div div b div div c div div d div div f div div g div 我们只想找到 div a div div b div div c div 哪些节点具有属性 其中该属性
  • 为什么使用粘贴创建的文件名中有一个空格?

    我试图使用 R 编写一个文件 为了区分每个文件 我尝试每次在函数中添加不同的后缀 例如 counts lt function counts file name lt substr counts file 1 5 file lt paste
  • 在快速分配任务时

    将 Objective C 代码转换为 Swift 的正确方法是什么 while size inputdata readWithByteArray buf 1 我需要类似的 从这里 https stackoverflow com a 256
  • JAR 中的 Spring Boot + Elastic Beanstalk .ebextensions

    我有一个非常标准的 Spring Boot 应用程序 带有application properties属性文件位于标准 src main resources文件夹 我将其作为 fat JAR 部署在 AWS Elastic Beanstal
  • 如何在 Matlab 中绘制 3D 平面?

    我想使用从 3 个点计算得出的向量绘制一个平面 其中 pointA 0 0 0 pointB 10 20 10 pointC 10 20 10 plane1 cross pointA pointB pointA pointC 如何以 3D
  • Linux进程间共享内存

    我有使用多个进程的服务器 fork 有大量数据可以由一个进程创建 并且应该在其他进程之间共享 因此 我使用 shm open mmap 创建共享内存并将其映射到虚拟内存 struct SharedData const char name i
  • DataGridView 工具提示文本未显示

    我有数据绑定DataGridView在桌面应用程序中 其中的列有其ToolTipText属性集 但当我将鼠标悬停在网格视图 单元格或单元格标题 上时 没有显示工具提示 The ShowCellToolTips网格视图的属性是true 并且我
  • 如何在 C++ 中读取文件并获取单词

    我很好奇如何从没有固定结构 例如注释或小报告 的文本文件中逐字读取输入 例如 文本的结构可能如下 1992 年 6 月 5 日今天是个好日子 虫子已经转变 战斗胜利了 我在想也许可以使用 getline 获取该行 然后看看是否可以通过空格将
  • Flask 给出内部服务器错误而不是渲染 404

    在我的 Flask 应用程序中 我设置了一个 404 处理程序 如下所示 app errorhandler 404 def page not found e return render template 404 html 404 但是 当用
  • std::unique_ptr 用法

    std unique ptr
  • Eric Niebler 的 std::is_function 实现是如何工作的?

    上周埃里克 尼伯勒tweeted https twitter com ericniebler status 852192542653329408一个非常紧凑的实现std is function http en cppreference co
  • 在 SQL 中,如何在范围内“分组依据”?

    假设我有一个带有数字列的表 我们称之为 分数 我想生成一个计数表 显示每个范围内分数出现的次数 例如 score range number of occurrences 0 9 11 10 19 14 20 29 3 在此示例中 有 11
  • Protractor 通过 div 内的标签查找元素

    我在 HTML 页面中有一个 div 其名称始终已知 并且在该 div 内有一个 href 其详细信息未知 它可能是父母的直系孩子 也可能是进一步的孙子 看起来像这样 div class divName a href some text a
  • char a[]="string"; 之间的区别char *p="字符串"; [复制]

    这个问题在这里已经有答案了 可能的重复 C 中 char s 和 char s 有什么区别 https stackoverflow com questions 1704407 what is the difference between c
  • Eclipse 中的 Maven 插件“标记无效”(Mars - 4.5.0)[重复]

    这个问题在这里已经有答案了 我有一个新创建的 Maven 项目 并将其导入到 Eclipse 中 Eclipse 抱怨其中一个插件
  • 使用 v-for 时的 Vue.js 资源文件路径

    我刚刚开始使用 Vue js 在加载静态图像 例如我的徽标 时访问资产文件夹非常简单 img src assets logo png 但是 我使用 v for 使用示例数据创建多个列表项 这是我的模板 ul li img h2 class
  • 如何在iOS sdk中使用正则表达式

    如何在iOS sdk中使用正则表达式 我需要验证UITextField使用正则表达式只允许数值进入UITextField 在你的 shouldChangeCharactersInRange 中你可以这样做 BOOL textField UI
  • 使用 Swift 访问 iOS 地址簿:数组计数为零

    我正在尝试编写一个简单的方法来要求用户访问他们的地址簿 然后打印出地址簿中每个人的姓名 我看过很多教程解释如何在 Objective C 中做到这一点 但我很难将它们转换为 swift 这是我到目前为止所做的事情 下面的块在我的 viewD