usar todos teléfono sincronizar pasar número numero los eliminar cómo contactos con como bloquear iphone objective-c cocoa-touch

todos - Cómo obtener un número de teléfono de un contacto de la libreta de direcciones(iphone sdk)



pasar contactos de android a iphone 8 (5)

Estoy mostrando una vista de la libreta de direcciones al usuario y dejándoles hacer clic en un contacto y seleccionar un número de teléfono. Si seleccionan un número de teléfono, quiero obtener el número de teléfono como un número entero y el nombre del contacto como NSString.

He intentado hacerlo con el siguiente código:

//printf("%s/n",[[(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier] UTF8String]); //CFArrayRef *arrayString = [[(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier] UTF8String]; NSArray *arrayString = [(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier]; printf("%s/n", arrayString);

Este código está dentro de este método:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

Y estoy comprobando si el usuario seleccionó un número de teléfono con este código:

if (propertyType == kABStringPropertyType) { [self wrongSelection]; } else if (propertyType == kABIntegerPropertyType) { [self wrongSelection]; } else if (propertyType == kABRealPropertyType) { [self wrongSelection]; } else if (propertyType == kABMultiStringPropertyType) { //This is the phone number...

Puedo obtener el número de teléfono para mostrar en la consola con printf, sin embargo, no puedo encontrar la forma de convertirlo en un número entero y cómo obtener el nombre de los contactos aunque la propiedad seleccionada no sea el nombre de una persona.

Además, lo que estoy haciendo parece muy ineficiente. ¿Hay alguna forma mejor de hacer esto?

Editar: si no puedo almacenarlos como un int, una cadena estaría bien. Simplemente no puedo entender cómo pasar de esa matriz a una cadena real. Si lo lanzo o lo guardo como un UTF8String siempre obtengo algún error.


No puede convertir el número de teléfono en un número entero. Los números de teléfono son cadenas. La entrada predeterminada que Apple incluye para sí misma tiene el número "1-800-MYAPPLE".

Además, incluso si todos los componentes de un número de teléfono son dígitos, no hay garantía de que los números de teléfono en todas partes del mundo sean lo suficientemente pequeños como para caber dentro de un valor de 64 bits, una vez que tenga en cuenta códigos de área, códigos de país, extensiones internas , etc. Los usuarios pueden poner todo lo que deseen allí.


Para obtener la propiedad de manera eficiente (en lo que respecta a la lectura), puede hacer algo como esto en su método de devolución de llamada:

switch( propertyType ) { case kABMultiStringPropertyType: // this is the phone number, do something break; default: [self wrongSelection]; break; }

Sin embargo, no estoy seguro de que incluso necesite analizar eso. Para obtener el número de teléfono del registro, puede hacerlo (nuevamente, dentro de su método de devolución de llamada):

ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty); NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty); CFRelease(phoneNUmberProperty); // Do whatever you want with the phone numbers NSLog(@"Phone numbers = %@", phoneNumbers); [phoneNumbers release];


CFStringRef cfName = ABRecordCopyCompositeName(person); NSString *personName = [NSString stringWithString:(NSString *)cfName]; CFRelease(cfName); ABMultiValueRef container = ABRecordCopyValue(person, property); CFStringRef contactData = ABMultiValueCopyValueAtIndex(container, identifier); CFRelease(container); NSString *contactString = [NSString stringWithString:(NSString *)contactData]; CFRelease(contactData);

contactString contiene el número de teléfono seleccionado y personName contiene el nombre de la persona. Como se indicó anteriormente, no necesariamente puede convertir la cadena a números genéricamente, ya que puede contener caracteres alfabéticos. Sin embargo, puede escribir su propio controlador para convertir caracteres alfabéticos en números y quitar todo lo demás para obtener solo una cadena numérica, que luego puede convertir en una larga (los números de teléfono son bastante largos).

Sin embargo, cuestiono la necesidad de convertir un número de teléfono a un valor numérico, ya que también puede contener otros caracteres necesarios como Pausa. Además, un número de teléfono representa una cadena de dígitos más de lo que representa un número largo de todos modos, por lo que el formato de datos conceptual es más String que Int en cualquier caso.


Otra razón para no usar números enteros: algunos países usan ceros a la izquierda en los números de teléfono, por ejemplo, todos los números del Reino Unido comienzan con un cero (generalmente escrito 01234 567890 o 0123 4567890).


Tenga en cuenta que este código falla en "stringWithString", si la entrada de Adressbook no contiene un nombre o un contacdata. cfName podría ser nulo!

CFStringRef cfName = ABRecordCopyCompositeName(person); NSString *personName = [NSString stringWithString:(NSString *)cfName]; CFRelease(cfName);

fijar:

NSString *personName = nil; if ((cfName = ABRecordCopyCompositeName(person)) != nil) { personName = [NSString stringWithString:(NSString *)cfName]; CFRelease(cfName); }