ios - para - ¿Cómo rellena automáticamente la aplicación CardCase de Square los detalles del usuario de la libreta de direcciones?
app para organizar contactos iphone (5)
La nueva aplicación iOS de la caja de tarjeta de Square tiene una función "Crear cuenta". Tóquelo 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.
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];
Dado que los cambios que requieren las aplicaciones para solicitar 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é Square Wallet (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 de nombres de dispositivos, pero ya no rellena previamente el formulario de registro.
Usando el método anterior, todavía puede rellenar previamente el formulario de registro después de solicitar el acceso a Contactos, pero pierde la experiencia "mágica" deseada.
No, tu puedes
Sé que estaba disponible en 4.X; no solo una característica 5.0 ... No estoy seguro de si estaba disponible anteriormente.
Tuve el mismo problema, pero en Swift, y utilicé la sugerencia de Nik Burns y escribí una publicación del 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())
}
}
la única solución que se me ocurrió fue usar el nombre del dispositivo y luego buscar en la libreta de direcciones una coincidencia. esto supone que alguien usaría una convención de nomenclatura particular. Por ejemplo, uso el ''iPhone de Nik'' como el nombre de mi dispositivo. También soy el único Nik en mi libreta de direcciones, así que para mi escenario funciona bien usar el texto antes de ''s como nombre del propietario.
Hace uso del muy práctico envoltorio para ABAddressBook de Erica Sadun, ABContactHelper . Dejé el código de enumeración en lugar de usar el índice de matriz en 0, ya que es probable que se devuelva una pequeña cantidad de coincidencias para que pueda expandirse y 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];
}
}