¿Cómo la aplicación CardCase de Square llena automáticamente los detalles del usuario de la libreta de direcciones?

La nueva aplicación para iOS de Square tiene una función de “Crear cuenta”. Toque y muestra un formulario PREPOPULADO con la entrada del usuario de la Libreta de direcciones.

¿Cómo es esto posible? ¿Nadie sabe? Pensé que esto era imposible, para obtener la información del usuario de esta manera. No es una cosa de iOS 5.0, afaict.

La única solución que pude encontrar fue usar el nombre del dispositivo y buscar en la libreta de direcciones una coincidencia. esto supone que alguien usaría una convención de nomenclatura particular. Yo, por ejemplo, uso ‘Nik’s iPhone’ como el nombre de mi dispositivo. También soy el único Nik en mi libreta de direcciones, por lo que para mi escenario funciona bien usar el texto anterior a ‘s como el nombre del propietario.

Hace uso de la práctica envoltura para ABAddressBook por Erica Sadun, ABContactHelper . Dejé el código de enumeración en lugar de utilizar el índice de matriz en 0, ya que es probable que se devuelva un pequeño número de coincidencias para que pueda ampliar y darle al usuario la opción de elegir ‘sus’ detalles. Lo que si bien no coincide exactamente con la solución de caja cuadrada funciona bien. En mi humilde opinión.

NSString *firstname; NSString *lastname; NSString *ownerName = [[UIDevice currentDevice] name]; NSRange t = [ownerName rangeOfString:@"'s"]; if (t.location != NSNotFound) { ownerName = [ownerName substringToIndex:t.location]; } NSArray *matches = [ABContactsHelper contactsMatchingName:ownerName]; if(matches.count == 1){ for (ABContact *contact in matches){ firstname = [contact firstname]; lastname = [contact lastname]; } } 

Dado que los cambios requieren que las aplicaciones soliciten permisos para acceder a la libreta de direcciones, este método ya no funciona . La respuesta de Nik Burns funcionó muy bien, pero necesita acceso a la libreta de direcciones.

Descargué la billetera cuadrada (que es el sucesor de las referencias de Square Card Case en la pregunta original) y ya no rellena previamente el formulario de registro. La ruta también solía hacer el truco de la libreta de direcciones del nombre del dispositivo pero tampoco rellena previamente el formulario de registro.

Utilizando el método anterior, aún puede completar previamente el formulario de registro después de solicitar el acceso a Contactos, pero pierde la experiencia “mágica” deseada.

Como no estaba contento con tener que usar el nombre del dispositivo, elegí usar el primer registro de la libreta de direcciones que corresponde a “ME”

 ABAddressBookRef addressBook = ABAddressBookCreate( ); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook ); ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, 0 ); ABContact * contact = [ABContact contactWithRecord:ref]; 

Tuve el mismo problema, pero en Swift, y utilicé la sugerencia de Nik Burns y escribí una publicación en el blog al respecto: http://paulpeelen.com/2016/01/20/prefill-an-signup-form-in-ios-using -swift-and-cncontact /

Este es básicamente el resultado final en Swift:

 import Contacts ... @IBOutlet weak var nameFirst: UILabel! @IBOutlet weak var nameLast: UILabel! @IBOutlet weak var email: UILabel! @IBOutlet weak var phoneNo: UILabel! @IBOutlet weak var address: UILabel! /** Search the addressbook for the contact */ private func getMe() { let ownerName = getOwnerName() let store = CNContactStore() do { // Ask permission from the addressbook and search for the user using the owners name let contacts = try store.unifiedContactsMatchingPredicate(CNContact.predicateForContactsMatchingName(ownerName), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactPostalAddressesKey, CNContactEmailAddressesKey]) //assuming contain at least one contact if let contact = contacts.first { // Checking if phone number is available for the given contact. if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { // Populate the fields populateUsingContact(contact) } else { //Refetch the keys let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactPostalAddressesKey, CNContactEmailAddressesKey] let refetchedContact = try store.unifiedContactWithIdentifier(contact.identifier, keysToFetch: keysToFetch) // Populate the fields populateUsingContact(refetchedContact) } } } catch let e as NSError { print(e.localizedDescription) } } /** Get the device owners name - returns: The owners name */ private func getOwnerName() -> String { // Get the device owners name var ownerName = UIDevice.currentDevice().name.trimmedString.stringByReplacingOccurrencesOfString("'", withString: "") // Get the model of the device let model = UIDevice.currentDevice().model // Remove the device name from the owners name if let t = ownerName.rangeOfString("s \(model)") { ownerName = ownerName.substringToIndex(t.startIndex) } return ownerName.trimmedString } /** Populate the fields using a contact - parameter contact: The contact to use */ private func populateUsingContact(contact: CNContact) { // Set the name fields nameFirst.text = contact.givenName nameLast.text = contact.familyName // Check if there is an address available, it might be empty if (contact.isKeyAvailable(CNContactPostalAddressesKey)) { if let addrv = contact.postalAddresses.first, addr = addrv.value as? CNPostalAddress where addrv.value is CNPostalAddress { let address = "\(addr.street)\n\(addr.postalCode) \(addr.city)\n\(addr.country)" self.address.text = address } } // Check if there is a phonenumber available, it might be empty if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { if let phonenumberValue = contact.phoneNumbers.first, pn = phonenumberValue.value as? CNPhoneNumber where phonenumberValue.value is CNPhoneNumber { phoneNo.text = pn.stringValue } } } 

Y la extensión:

 extension String { /// Trim a string var trimmedString: String { return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) } } 

No, tu puedes

http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Introduction.html#//apple_ref/doc/uid/TP40007744

Sé que estaba disponible en 4.X; no solo una función 5.0 … No estoy seguro de si estuvo disponible antes.

    Intereting Posts