2010-10-05 12 views
8

Wow ... guarda tutte le "storie di panico" online questa settimana riguardanti l'uso di un UDID di iPhone.Cosa usare se non "IPHONE UDID"?

[[UIDevice currentDevice] uniqueIdentifier] 

Cosa DOVREMMO noi utilizzeremo invece?

Cosa succede se il telefono viene venduto a un altro utente ... e un'app ha memorizzato alcuni dati su un server remoto, in base all'UDID del telefono?

(Naturalmente, voglio evitare i problemi con "restrizioni di crittografia" del negozio app.)

+2

Non so quali sono le storie questa settimana. E dovresti trasformare questo in una domanda specifica. Per cosa avevi intenzione di usare l'UDID? Sicuramente non una sostituzione completa delle credenziali dell'utente? – marcc

+0

cosa stai cercando di fare? Uso una versione MDDed salata dell'UDID per sapere da quali dati del dispositivo sono stati sincronizzati su un altro dispositivo. Penso che questo sia ok. Non sto segnalando nulla al mio server per vedere cosa stanno facendo le persone con la mia app. La cosa brutta non è l'uso di udid, la cosa cattiva sono quelle funzioni di "spionaggio". Tutto ciò che questi ragazzi stanno facendo con gli UDID può essere acquisito in un altro modo. –

+0

L'UDID viene utilizzato per "identificare il dispositivo o l'utente univoco" ... per "salvare e recuperare i dati" ... e sono sicuro che alcuni di essi sono MOLTO informazioni private. Cosa dovrebbe invece essere usato? Qualcosa era un utente non può fingere di essere un altro utente. Tutto senza controllare gli indirizzi e-mail o il nome utente o le password. – Patty

risposta

0

Il metodo consigliato è quello di utilizzare la generazione UUID, e socio che con qualcosa che l'utente lui/lei è disposto a fornire all'app.

Quindi, memorizzare questi dati esternamente, dove potrebbe essere recuperato di nuovo. Ci sono probabilmente altri modi per farlo facilmente, ma questo è il modo consigliato.

+0

Il problema con questo è che non sarà persistente attraverso la reinstallazione della stessa app sullo stesso dispositivo. Questo era lo scopo degli UUID del dispositivo. – gcamp

+0

Associarlo con un determinato ID utente. Non è questo lo scopo dell'identificazione? Dovrebbe essere basato sul consenso dell'utente. Se ha funzionato usando un indirizzo MAC e qualche altra combinazione, allora non è diverso dall'uso di UDID. Se non consentono l'UDID a causa di qualche problema di sicurezza/privacy, scoraggerebbero anche altri tipi di identificazione dell'hardware. –

3

Perché non utilizzare l'indirizzo Mac e, eventualmente, cancellarlo.

C'è un ottimo UIDevice-Extension Categoria 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; 
} 

Si potrebbe hash questo con il modello?

+0

Forse sto fraintendendo la domanda, o la tua risposta, ma questo sembra essere il * contrario * di ciò che si desidera - che è un ID che può rappresentare un altro utente * non * legato a quel dispositivo (e quindi venduto insieme al telefono anche se cancellato, ecc.). – Nicole

+0

Ha chiesto qualcosa per sostituire l'UDID che era legato al dispositivo! –

+0

Non lo vedo nella domanda da nessuna parte. Quello che vedo è una domanda per un identificatore univoco, e quindi una dichiarazione che interpreto dicendo che l'OP * non * vuole che l'ID venga trasferito quando il telefono viene venduto. – Nicole

1

UUID è appena ammortizzato e quindi sarà in giro per un po ', Apple non ha ancora detto molto su questo deprezzamento, aspetterei che non abbiano altro da dire su questo e forse offrirà un'alternativa.

0

Una soluzione potrebbe essere il rilascio di un acquisto in-app dell'applicazione.

Questo acquisto potrebbe essere:

  1. rintracciabile, con un numero di numero unico (acquisto) che sarebbe significativa solo per la vostra applicazione.

  2. mobile, se la persona che passa dispositivi

  3. richiamabili, se l'applicazione viene eliminato (o il telefono è cancellato e ricaricato) - gli acquisti in-app possono essere ripristinati.

0

la documentazione di Apple dice:

"Non utilizzare la proprietà uniqueIdentifier Per creare un unico identificativo specifico per la vostra applicazione, è possibile chiamare la funzione CFUUIDCreate per creare un UUID, e scrivere. al database di default usando la classe NSUserDefaults."

ecco una rapida frammento:

CFUUIDRef udid = CFUUIDCreate(NULL); 

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

Purtroppo, l'UUID restituito non è coerente tra le installazioni dell'app. (ad esempio, elimina l'app, reinstallala e otterrai un UUID completamente diverso) – lorean

+0

Vedere la mia risposta qui sotto che utilizza UserDefaults per memorizzare un UUID al momento della creazione. – GoZoner

2

Come ho chiesto questa mattina a this post, ci sono alcuni alternative:

1- prima, come recommands di Apple, identificare per installare al posto di identificando . per dispositivo Pertanto, è possibile utilizzare CFUUIDRef Esempio:.

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

2- Se ti interessa un identificatore univoco mondiale, puoi memorizzare questo identificatore su iCloud.

3- Finalmente, se è davvero necessario un identificatore che rimane dopo la reinstallazione dell'app (che non si verifica così frequentemente), è possibile utilizzare Keychains (Apple's keychain doc). Ma alla squadra di Apple piacerà?

+1

FYI Una copia dritta di questo codice non funziona quando si utilizza ARC – djskinner

+0

Vedere qui per ARC: http://stackoverflow.com/questions/8594721/nsmakecollectable-and-arc-doesnt-work – djskinner

1

Ti piace questa:

@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 documentazione iOS più o meno descrive l'uso di CFUUIDCreate() per creare un identificatore e suggerisce di usare UserDefaults per memorizzarla.

Problemi correlati