2008-10-22 27 views
31

Para una aplicación de iPhone que envía imágenes a un servidor, necesito de alguna manera vincular todas las imágenes de un teléfono en particular. Con cada envío me gustaría enviar una identificación de teléfono única. Miró Identificador único para una aplicación de iPhone

 
    [[UIDevice mainDevice] uniqueIdentifier]
and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

pero obteniendo errores en el simulador.

¿Hay una forma aprobada por Apple de hacer esto?

+0

¿Se puede acceder al número de serie? –

+0

obtenía un error con

[[UIDevice mainDevice] uniqueIdentifier]
pero
 [[UIDevice currentDevice] uniqueIdentifier]
parece que funciona. –

+0

Consulte http://stackoverflow.com/questions/193182/programmatically-get-own-own-numero-en-iphone-os para saber por qué obtener SBFormattedPhoneNumber ya no funciona. – Archie

Respuesta

41

Qué errores te va? [[UIDevice currentDevice] uniqueIdentifier] ( editado para corregir API, gracias Martin!) es la forma oficialmente recomendada de hacerlo.

+4

*** + [UIDevice mainDevice]: no reconocido: sin embargo intenté con [UIDevice currentDevice] y funciona en el sim –

+0

lo siento, tienes razón. –

+9

'[[UIDevice currentDevice] uniqueIdentifier]' ahora está en desuso desde iOS 5.0 - no lo use. He leído que este repositorio de GitHub produce una identificación única con una biblioteca de código abierto: https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5 –

0

No he hecho el trabajo de iphone, pero ¿qué tal si tomo un truco de algo único en el teléfono ... oh, diga el número de teléfono?

Getting iphone number

+0

Eso funciona con frecuencia pero devolverá información incorrecta en un número significativo de casos. Obtiene un número de teléfono, pero no se garantiza que sea el número del teléfono actual, un número de teléfono válido o incluso un número único. –

+1

¿con qué frecuencia un iPod Touch tiene un número de teléfono? –

+0

El número de teléfono definitivamente no es único. También es algo que muchas personas conocen, por lo que es una mala opción para proteger cualquier tipo de datos detrás de un servicio web. Además, ¿qué sucede cuando cambias los números de teléfono? – npellow

18

También puede usar CFUUID para generar un UUID. Aquí hay algo de código:

NSString *uuid = nil; 
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault); 
if (theUUID) { 
    uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID)); 
    [uuid autorelease]; 
    CFRelease(theUUID); 
} 
+1

Suena genial. ¿La INDIVIDUAL será la misma en cada invocación? –

+2

No, cada vez es diferente, por lo que normalmente lo genera en el primer inicio y luego lo guarda según sus preferencias usando NSUserDefaults. –

+2

La desventaja de esto es que si la aplicación se elimina y se reinstala o si el dispositivo se restaura a partir de una copia de seguridad, perderá el UUID guardado y las cosas no se reconocerán como desde el mismo dispositivo. –

13

Con mucho, la forma más fácil y más adecuado para obtener un identificador único es el uso de los mecanismos de Apple prevé explícitamente la obtención de uno - [[UIDevice currentDevice] uniqueIdentifier]. No puede garantizar que el número de teléfono sea exclusivo del dispositivo o que el dispositivo tenga un número de teléfono. Más allá de eso, hacerlo es una idea horrible, ya que es una invasión definitiva de la privacidad del usuario. Incluso el uniqueidentifier debe ser hash si va a almacenarlo de alguna manera.

+3

+1 para llamar a las preocupaciones de privacidad. Muchos simplemente ignoran este aspecto. – jmanning2k

+0

¿Cuál es una buena manera de almacenar un valor HASHED de una cuerda? – Donna

+1

Como se señaló en otras respuestas, esto está obsoleto a partir de iOS 5.0 –

2

Este es un problema interesante que también estoy buscando resolver. Aquí hay un escenario que me gustaría abordar.

¿Qué sucede cuando vende su teléfono a otra persona ... esa ID de dispositivo pertenecerá a otra persona, por lo que incluso si la aplicación se elimina del iPhone, podría volver a agregarse y todos esos datos serían entonces ser re-asociado a un nuevo usuario ... esto es malo.

Usar el número de teléfono con la ID del dispositivo MD5 sería una gran solución. Otro que se nos ocurre es tener un SQL Lite DB con algunos tokens Hashed con el ID del dispositivo. Luego, cuando se elimina la aplicación, la base de datos se elimina y todos los datos se desasocian. Creo que eso podría ser muy frágil.

¿Alguna otra idea?

Rob Ellis (PhoneGap/Nitobi)

+1

O el teléfono presenta un problema y se reemplaza en garantía - el mismo usuario, el nuevo teléfono. El UUID generado almacenado en la solución NSUserDefaults ganaría aquí, ya que las preferencias se sincronizarán nuevamente. – jmanning2k

0

snippit:

NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator! 
NSLog(@"Formatted phone number [%@]", phoneNumber); 

I [recientemente] corrió el código tal y como está en OS 2.2.1 [y OS 3.0].

Funciona como se esperaba cuando se ejecuta en el dispositivo, y devuelve mi número de teléfono con los códigos de marcación internacional completos [1 en mi caso].

Cuando se ejecuta en el simulador, el valor [devuelto] es una cadena nula, por lo que solo funciona en un dispositivo de iPhone real.

No lo probé en un iPod Touch.

...

Ran este código en un dispositivo diferente esta semana, y tiene un valor nulo en lugar del número.

En futuras investigaciones, parece que el número devuelto por este snippit de código es el número que se configura en iTunes para el dispositivo.

Si no ingresó el número de iPhone en iTunes al activar el dispositivo, o quizás (como en mi caso) si el valor predeterminado no era el número del iPhone y de todos modos hizo clic en Aceptar, como iTunes no aparece el número de teléfono cuando su iPhone está conectado, este código devolverá una cadena nula.

[arriba es una concatenación de los comentarios editado recientemente he publicado a otro artículo sobre este tema en http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

+0

No es una buena idea con respecto a la seguridad de los datos ... – DAS

0

Here hay más información sobre la manera de conseguirlo de iTunes que pueden ser útiles para propósitos de prueba.

0

que tuvieron éxito con dicho código:

- (NSString *)stringUniqueID { 
    NSString * result; 
    CFUUIDRef uuid; 
    CFStringRef uuidStr; 
    uuid = CFUUIDCreate(NULL); 
    assert(uuid != NULL); 
    uuidStr = CFUUIDCreateString(NULL, uuid); 
    assert(uuidStr != NULL); 
    result = [NSString stringWithFormat:@"%@", uuidStr]; 
    assert(result != nil); 
    NSLog(@"UNIQUE ID %@", result); 
    CFRelease(uuidStr); 
    CFRelease(uuid); 
    return result; 
}  
7

No olvide que dejará de estar disponible en iOS 5 uniqueIdentifier se debe utilizar en lugar de CFUUID que

5

Curiosamente, Apple ha puesto en desuso en la uniqueIdentifier iOS 5 (como mencionó gN0Me). Aquí está el artículo pertinente TechCrunch: http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/

de Apple sugiere que identifique ya no de forma exclusiva el dispositivo, pero en lugar de identificar al usuario . En la mayoría de los casos, este es un excelente consejo, aunque hay algunas situaciones que aún requieren un global ID de dispositivo único. Estos escenarios son bastante comunes en publicidad. Por lo tanto, escribí una biblioteca extremadamente simple que replica exactamente el comportamiento existente.

En un desvergonzado complemento de autopromoción, lo vincularé aquí con la esperanza de que alguien lo encuentre útil. Asimismo, doy la bienvenida a todos y cualquier comentario/crítica: http://www.binpress.com/app/myid/591

No obstante, en su situación particular que le recomendaría saltarse la funcionalidad identificador único a nivel mundial mi biblioteca ofrece ya que es un poco exagerado para su situación. En cambio, generaría un CFUUID simple y lo almacenaría en NSUserDefaults. Esta identificación sería específica para su aplicación pero le permitiría agrupar todas las fotos para esa "instalación de la aplicación" en su base de datos.

En otras palabras, al desaprobar el método uniqueIdentifier, Apple sugiere que no se identifique por dispositivo sino que por aplicación instale. A menos que esté operando en condiciones específicas, es probable que la por aplicación ID se ajuste mejor a su producto de todos modos.

+0

Su solución no está disponible. – Stas

8

Con el fin de conservar el identificador único se crea entre las instalaciones, se puede usar el llavero Made easy with SSKeychain: Basta con establecer el UUID de la siguiente manera:

 [SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"]; 

y luego llamar de nuevo en cualquier momento que lo necesite:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"]; 

Nota: Los servicios y las cuentas deben coincidir exactamente con.

Luego, si la aplicación se elimina y se reinstala, el UUID persistirá con la reinstalación.

Si desea compartir este UUID entre dispositivos, configure su aplicación para usar iCloud. A continuación, puede almacenar el UUID en NSUserDefaults, sincronizar con KeyValueStore y luego establecer el UUID en el llavero de los nuevos dispositivos con el código anterior.

Esta respuesta sería extremadamente larga si escribo el código para todo lo anterior, pero un montón de código de muestra aquí para resolverlo.

1
+0

Las respuestas que solo contienen enlaces son [consideradas malas prácticas] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Resuma el contenido aquí (no copie/pegue) para que la respuesta pueda ser independiente. Si no lo hace, corre el riesgo de que su respuesta sea eliminada, especialmente si el enlace alguna vez muere. –

Cuestiones relacionadas