¿Cómo cuadra automáticamente la aplicación CardCase de los datos del usuario en la libreta de direcciones?

La aplicación de la nueva tarjeta Case de Square tiene una function de "Crear count". Toque y muestra un formulario PREPUPULADO con la input del usuario de la Libreta de direcciones.

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

    la única solución que podría encontrar era usar el nombre del dispositivo y luego search en la libreta de direcciones una coincidencia. Esto supone que alguien usaría una convención de nombres particular. Por ejemplo, uso 'Nik's iPhone' como mi nombre de dispositivo. También soy el único Nik en mi libreta de direcciones, por lo que para mi escenario funciona bien utilizar el text anterior a 's como el nombre del propietario.

    Hace uso de la muy 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, por lo que podrías expandirlo para darle al usuario la opción de elegir sus "detalles". Que aunque no coincida 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 que requieren aplicaciones para solicitar permissions 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é el monedero cuadrado (que es el sucesor de las references de la caja cuadrada de la tarjeta en la pregunta original) y ya no rellena previamente el formulario de logging. La ruta también se usa para hacer el truco de la libreta de direcciones del nombre del dispositivo, pero tampoco rellena previamente el formulario de logging.

    Usando el método anterior, aún podría rellenar previamente el formulario de logging 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 logging 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 usé la sugerencia de Nik Burns y escribí una publicación de 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.unifiedContactsMatchingPnetworkingicate(CNContact.pnetworkingicateForContactsMatchingName(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 function 5.0 … No estoy seguro si estuvo disponible anteriormente.