transferir sincronizar recuperar pasar otro los contactos como celular ios swift cncontact

ios - recuperar - sincronizar contactos iphone



Recuperando todos los contactos en ios Swift? (5)

Soy consciente de que ios swift tiene un Marco de contactos donde puedo buscar contactos, pero no puedo encontrar ningún método para reunir a todos los contactos desde donde puedo acceder a cada uno de los contactos desde esa matriz. Todos los métodos para obtener contactos parecen requerir algún tipo de condiciones. ¿Hay algún método en el que pueda reunir a todos los contactos?

Gracias


Muchas respuestas a las preguntas de Contact Framework sugieren iterar sobre varios contenedores (cuentas). Sin embargo, la documentación de Apple describe un "Contacto Unificado" como

Los contactos en diferentes cuentas que representan a la misma persona pueden vincularse automáticamente entre sí. Los contactos vinculados se muestran en las aplicaciones OS X e iOS como contactos unificados. Un contacto unificado es una vista temporal en memoria del conjunto de contactos vinculados que se fusionan en un contacto.

Por defecto, el marco de contactos devuelve contactos unificados. Cada objeto de contacto unificado recuperado (CNContact) tiene su propio identificador único que es diferente del identificador de cualquier contacto individual en el conjunto de contactos vinculados. Una recuperación de un contacto unificado se debe hacer con su identificador. Source

Así, la forma más sencilla de obtener una lista de contactos (parciales, basados ​​en claves) en una sola matriz, sería la siguiente:

var contacts = [CNContact]() let keys = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)] let request = CNContactFetchRequest(keysToFetch: keys) do { try self.contactStore.enumerateContactsWithFetchRequest(request) { (contact, stop) in // Array containing all unified contacts from everywhere contacts.append(contact) } } catch { print("unable to fetch contacts") }


Swift 4. He creado la clase PhoneContacts. Agregue la clave NSContactsUsageDescription a su archivo info.plist

import Foundation import ContactsUI class PhoneContacts { class func getContacts(filter: ContactsFilter = .none) -> [CNContact] { // ContactsFilter is Enum find it below let contactStore = CNContactStore() let keysToFetch = [ CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey, CNContactEmailAddressesKey, CNContactThumbnailImageDataKey] as [Any] var allContainers: [CNContainer] = [] do { allContainers = try contactStore.containers(matching: nil) } catch { Debug.Log(message: "Error fetching containers") // you can use print() } var results: [CNContact] = [] 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) } catch { Debug.Log(message: "Error fetching containers") } } return results } }

El método de llamar arriba en otra clase.

func phoneNumberWithContryCode() -> [String] { let contacts = PhoneContacts.getContacts() // here calling the getContacts methods var arrPhoneNumbers = [String]() for contact in contacts { for ContctNumVar: CNLabeledValue in contact.phoneNumbers { if let fulMobNumVar = ContctNumVar.value as? CNPhoneNumber { //let countryCode = fulMobNumVar.value(forKey: "countryCode") get country code if let MccNamVar = fulMobNumVar.value(forKey: "digits") as? String { arrPhoneNumbers.append(MccNamVar) } } } } return arrPhoneNumbers // here array has all contact numbers. }

Ahora, recibe correo electrónico y teléfono de contactos.

enum ContactsFilter { case none case mail case message } var phoneContacts = [PhoneContact]() // array of PhoneContact(It is model find it below) var filter: ContactsFilter = .none self.loadContacts(filter: filter) // Calling loadContacts methods fileprivate func loadContacts(filter: ContactsFilter) { phoneContacts.removeAll() var allContacts = [PhoneContact]() for contact in PhoneContacts.getContacts(filter: filter) { allContacts.append(PhoneContact(contact: contact)) } var filterdArray = [PhoneContact]() if self.filter == .mail { filterdArray = allContacts.filter({ $0.email.count > 0 }) // getting all email } else if self.filter == .message { filterdArray = allContacts.filter({ $0.phoneNumber.count > 0 }) } else { filterdArray = allContacts } phoneContacts.append(contentsOf: filterdArray) DispatchQueue.main.async { self.tableView.reloadData() } } }

TeléfonoContacto Modelo de Clase

import Foundation import ContactsUI class PhoneContact: NSObject { var name: String? var avatarData: Data? var phoneNumber: [String] = [String]() var email: [String] = [String]() var isSelected: Bool = false var isInvited = false init(contact: CNContact) { name = contact.givenName + " " + contact.familyName avatarData = contact.thumbnailImageData for phone in contact.phoneNumbers { phoneNumber.append(phone.value.stringValue) } for mail in contact.emailAddresses { email.append(mail.value as String) } } override init() { super.init() } }


Una implementación Swift 4.0 para atraer a todos los contactos.

let contactStore = CNContactStore() var contacts = [CNContact]() let keys = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)] let request = CNContactFetchRequest(keysToFetch: keys) do { try contactStore.enumerateContacts(with: request) { (contact, stop) in contacts.append(contact) } } catch { print(error.localizedDescription) }

Esto crea una propiedad local para almacenar los contactos, que luego se completan a través de la enumeración de contactStore .


Actualización para Swift 4

let contactStore = CNContactStore() var contacts = [CNContact]() let keys = [ CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey, CNContactEmailAddressesKey ] as [Any] let request = CNContactFetchRequest(keysToFetch: keys as! [CNKeyDescriptor]) do { try contactStore.enumerateContacts(with: request){ (contact, stop) in // Array containing all unified contacts from everywhere contacts.append(contact) for phoneNumber in contact.phoneNumbers { if let number = phoneNumber.value as? CNPhoneNumber, let label = phoneNumber.label { let localizedLabel = CNLabeledValue<CNPhoneNumber>.localizedString(forLabel: label) print("/(contact.givenName) /(contact.familyName) tel:/(localizedLabel) -- /(number.stringValue), email: /(contact.emailAddresses)") } } } print(contacts) } catch { print("unable to fetch contacts") }


// You may add more "keys" to fetch referred to official documentation let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)] // The container means // that the source the contacts from, such as Exchange and iCloud var allContainers: [CNContainer] = [] do { allContainers = try store.containersMatchingPredicate(nil) } catch { print("Error fetching containers") } var contacts: [CNContact] = [] // Loop the containers for container in allContainers { let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier) do { let containerResults = try store.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: keysToFetch) // Put them into "contacts" contacts.appendContentsOf(containerResults) } catch { print("Error fetching results for container") } }