Получение контактов с мобильного телефона и сохранение в sqliteDB с использованием Swift 3

Я новичок в языке Swift 3 и хочу получить контакты с телефона в виде массива, а затем сохранить в sqliteDB. Пожалуйста помоги.

Я видел старый учебник по Swift 2.1, но все эти методы устарели, и я много пробовал с CNContacts, но это мне не помогло.

Я также попробовал эту ссылку переполнения стека, но не получил никакой помощи:
Извлечение всех контакты в ios Swift?


person Arslan Javed    schedule 06.12.2016    source источник
comment
Не могли бы вы показать нам, что вы уже пробовали до этого?   -  person Randy    schedule 06.12.2016
comment
Извините, я отменил весь свой код, потому что он не работал.   -  person Arslan Javed    schedule 06.12.2016
comment
Вы действительно хотите хранить свои контакты в базе данных sqlite? У вас есть отличные альтернативы. Обычно я выбираю Realm, но вы также можете использовать CoreData Чтобы получить контакты, проверьте этот ответ   -  person Randy    schedule 06.12.2016
comment
не имеет значения, где я должен хранить данные. моя основная цель - восстановить контакты.   -  person Arslan Javed    schedule 07.12.2016
comment
может быть, я пойду с coredata   -  person Arslan Javed    schedule 07.12.2016
comment
Вы пробовали это?   -  person Randy    schedule 07.12.2016


Ответы (1)


Я только что работал над подобной проблемой, поэтому я дам вам свой код. Я собрал его из нескольких найденных мной тем (включая это). Наше требование состоит в том, чтобы просто получить номер телефона из всех контактов и поместить его в массив строк, но вы можете легко изменить это, чтобы сделать больше:

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 (только с телефонными номерами внутри, но вы можете увеличить его, просто изменив ключи), а затем перебирает каждый контакт и метку внутри массива, чтобы вставить только телефонные номера как Строки в массив телефонных номеров.

person Mahen Ratnayake    schedule 06.12.2016
comment
меня устраивает. но что я должен написать, чтобы получить имя и фамилию? - person Arslan Javed; 07.12.2016
comment
Вы должны использовать больше ключей, таких как: [CNContactGivenNameKey, CNContactFamilyNameKey] - person Mahen Ratnayake; 07.12.2016
comment
Я уже изменил ключ, но что мне нужно написать в этом цикле for /////////////////////// для labeledValue в phone.phoneNumbers{ print(labeledValue.value .строковое значение) } - person Arslan Javed; 07.12.2016
comment
Взгляните на это, вы можете использовать свойства имени, чтобы получить их из объектов внутри массив результатов. - person Mahen Ratnayake; 07.12.2016
comment
Хорошо, позвольте мне как следует проверить все эти ключи. большое спасибо - person Arslan Javed; 07.12.2016