使用Swift 3从移动设备和存储到sqliteDB获取联系人

时间:2016-12-06 20:47:10

标签: ios sqlite swift3 cncontact

我是Swift 3语言的新手,我希望从数组中的手机中获取联系人,然后存储在sqliteDB中。请帮忙。

我看到了Swift 2.1的旧教程,但所有这些方法都被弃用了,我尝试了很多CNContacts,但这对我没用。

我也尝试过Stack Overflow的这个链接,但没有得到任何帮助:
Fetching all contacts in ios Swift?

1 个答案:

答案 0 :(得分:0)

我刚刚处理过类似的问题,所以我会给你我的代码。我把它放在我发现的几个不同的线程中(包括this)。我们的要求是只从所有联系人那里获取电话号码并将其放入String数组中,但您可以轻松修改它以执行更多操作:

func getContacts(){

    contactStore.requestAccess(for: .contacts, completionHandler: {
        granted, error in

        var contacts: [CNContact] = {
            let contactStore = CNContactStore()

            //Change keys here to retreive more than just the phone number of the contact
            let keysToFetch = [CNContactPhoneNumbersKey]

            // Get all the containers
            var allContainers: [CNContainer] = []
            do {
                allContainers = try contactStore.containers(matching: nil)
            } catch {
                print("Error fetching containers")
            }

            var results: [CNContact] = []

            // Iterate all containers and append their contacts to our results array
            for container in allContainers {

                let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)

                do {

                    let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as [CNKeyDescriptor])

                    results.append(contentsOf: containerResults)

                    for phone in results{

                        for labeledValue in phone.phoneNumbers{
                            self.phoneNumbersArray.append(labeledValue.value.stringValue)
                        }
                    }

                } catch {
                    print("Error fetching results for container")
                }
            }

            return results
        }()

        self.getFriendsFromPhoneNumbers()
    })
}

这会遍历所有容器并返回一个CNObjects数组(只有里面的电话号码但你可以通过更改键来获得更多),然后遍历每个Contact和标签内的标签以插入电话号码作为字符串进入电话号码数组。