2010-10-05 17 views
8

Wow ... mira todas las "historias de pánico" en línea esta semana sobre el uso de un UDID de iPhone.¿Qué usar si no es "IPHONE UDID"?

[[UIDevice currentDevice] uniqueIdentifier] 

Qué DEBEMOS que utilizaremos en su lugar?

¿Qué sucede si el teléfono se vende a otro usuario ... y una aplicación ha almacenado algunos datos en un servidor remoto, según el UDID del teléfono?

(Por supuesto, quiero evitar los problemas con "restricciones de cifrado" de la tienda de aplicaciones.)

+2

No sé cuáles son las historias de esta semana. Y deberías convertir esto en una pregunta específica. ¿Para qué planeabas usar el UDID? Seguramente no es un reemplazo de credenciales de usuario completo? – marcc

+0

¿qué estás tratando de hacer? Utilizo una versión salada md5ed del UDID para saber desde qué dispositivo los datos se sincronizaron con otro dispositivo. Creo que esto está bien. No estoy informando nada a mi servidor para ver qué está haciendo la gente con mi aplicación. Lo malo no es el uso de udid, lo malo son esas funciones de "espionaje". Todo lo que esos muchachos están haciendo con UDID se puede lograr de otra manera. –

+0

El UDID se usa para "identificar el dispositivo o usuario único" ... para "guardar y recuperar datos" ... y estoy seguro de que parte de esta información es MUY privada. ¿Qué debería usarse en su lugar? Algo era un usuario no puede pretender ser otro usuario. Todo sin verificar direcciones de correo electrónico o nombre de usuario o contraseñas. – Patty

Respuesta

0

La forma recomendada es mediante el uso de la generación de UUID, y asociada que con algo que el usuario él/ella misma es dispuesto a proporcionar a la aplicación.

A continuación, almacene estos datos externamente, donde podrían recuperarse nuevamente. Probablemente haya otras maneras de hacerlo fácilmente, pero esta es la manera recomendada.

+0

El problema con esto es que no será persistente durante la reinstalación de la misma aplicación en el mismo dispositivo. Ese era el propósito de los UUID de dispositivo. – gcamp

+0

Asociarlo con una identificación de usuario determinada. ¿No es ese el propósito de la identificación? Debe estar basado en el consentimiento del usuario. Si funciona con una dirección MAC y alguna otra combinación de la misma, entonces eso no es diferente de usar UDID. Si no permiten el UDID debido a algún problema de seguridad/privacidad, también podrían desalentar otros tipos de identificación de hardware. –

3

¿Por qué no utilizar la dirección Mac y, posiblemente, hash it up.

Hay una excelente Categoría UIDevice-Extensión here

- (NSString *) macaddress 
{ 
    int     mib[6]; 
    size_t    len; 
    char    *buf; 
    unsigned char  *ptr; 
    struct if_msghdr *ifm; 
    struct sockaddr_dl *sdl; 

    mib[0] = CTL_NET; 
    mib[1] = AF_ROUTE; 
    mib[2] = 0; 
    mib[3] = AF_LINK; 
    mib[4] = NET_RT_IFLIST; 

    if ((mib[5] = if_nametoindex("en0")) == 0) { 
     printf("Error: if_nametoindex error\n"); 
     return NULL; 
    } 

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { 
     printf("Error: sysctl, take 1\n"); 
     return NULL; 
    } 

    if ((buf = malloc(len)) == NULL) { 
     printf("Could not allocate memory. error!\n"); 
     return NULL; 
    } 

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { 
     printf("Error: sysctl, take 2"); 
     return NULL; 
    } 

    ifm = (struct if_msghdr *)buf; 
    sdl = (struct sockaddr_dl *)(ifm + 1); 
    ptr = (unsigned char *)LLADDR(sdl); 
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
          *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; 
    // NSString *outstring = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X", 
    //      *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; 
    free(buf); 

    return outstring; 
} 

Usted podría reconsiderar esto con el modelo?

+0

Tal vez esté malinterpretando la pregunta o su respuesta, pero esto parece ser el * opuesto * de lo que se desea, que es una identificación que puede representar a otro usuario que * no * está vinculado a ese dispositivo (y por lo tanto vendido junto con el teléfono, incluso si se ha borrado, etc.). – Nicole

+0

¡Pidió algo para reemplazar el UDID que estaba vinculado al dispositivo! –

+0

No veo eso en ninguna parte. Lo que veo es una pregunta para un identificador único, y luego una declaración que interpreto que dice que el OP * no * quiere que se transfiera el ID cuando se vende el teléfono. – Nicole

1

UUID se acaba de depreciar y por lo tanto estará por un tiempo, Apple no ha dicho mucho acerca de esta depreciación mucho todavía, esperaría hasta que tengan más que decir al respecto y tal vez la ofrecerá alguna alternativa.

0

Una solución sería hacer que la aplicación emita una compra gratuita desde la aplicación.

Esta compra sería:

  1. rastreable, con un número de serie único (compra) que fueran significativos sólo para su aplicación.

  2. complementaria, si la persona cambia dispositivos

  3. recuperables, si se elimina la aplicación (o el teléfono se limpia y vuelve a cargar) - las compras en la aplicación pueden ser restaurados.

0

documentación de Apple dice:

"No utilizar la propiedad uniqueIdentifier Para crear un identificador único específico para su aplicación, puede llamar a la función CFUUIDCreate para crear un UUID, y escribir. a la base de datos por defecto usando la clase NSUserDefaults."

He aquí un fragmento rápida:

CFUUIDRef udid = CFUUIDCreate(NULL); 

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid); 
+0

Lamentablemente, el UUID devuelto no es uniforme en todas las instalaciones de la aplicación. (es decir, elimine la aplicación, vuelva a instalarla y obtendrá un UUID completamente diferente) – lorean

+0

Consulte mi respuesta a continuación que usa UserDefaults para almacenar un UUID después de la creación. – GoZoner

2

Como ya he hecho esta mañana en this post, hay alguna alternativa:

1- En primer lugar, como recommands de Apple, se identifican por instalación en lugar de indentifying . por dispositivo por lo tanto, puede utilizar CFUUIDRef Ejemplo:.

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

2- Si le importa un identificador único a nivel mundial, entonces puede almacenar este identificador en iCloud.

3- Por fin, si realmente necesita un identificador que permanezca después de la reinstalación de la aplicación (eso no ocurre con tanta frecuencia), puede usar Llaveros (Apple's keychain doc). Pero, ¿le gustará a Apple?

+1

FYI Una copia directa de este código no funciona cuando se usa ARC – djskinner

+0

Consulte aquí para ARC: http://stackoverflow.com/questions/8594721/nsmakecollectable-and-arc-doesnt-work – djskinner

1

De esta manera:

@interface UIDevice (UIDeviceAppIdentifier) 
@property (readonly) NSString *deviceApplicationIdentifier; 
@end 

@implementation UIDevice (UIDeviceAppIdentifier) 
- (NSString *) deviceApplicationIdentifier 
{ 
    static NSString  *name = @"theDeviceApplicationIdentifier"; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString    *value  = [defaults objectForKey: name]; 

    if (!value) 
    { 
     value = (NSString *) CFUUIDCreateString (NULL, CFUUIDCreate(NULL));  
     [defaults setObject: value forKey: name]; 
     [defaults synchronize]; 
    } 
    return value; 
} 
@end 

la documentación IOS describe más o menos uso de CFUUIDCreate() para crear un identificador y sugiere el uso de UserDefaults para almacenarlo.

Cuestiones relacionadas