2013-07-16 13 views
11

Desidero ottenere l'identificativo univoco che dovrebbe supportare tutte le versioni di iOS .. Nessuno mi può aiutare su questo problema. Come sapete che Apple è deprecato del metodo UDID, quindi c'è la possibilità di generare un ID univoco usando l'indirizzo wifi-mac. Ma Apple sta per rimuovere l'indirizzo MAC wifi nella versione iOS7. Quindi il mio requisito è di generare un nuovo codice univoco che dovrebbe funzionare in tutte le versioni iOS. Grazie in anticipo.Come generare un identificativo univoco che dovrebbe funzionare in tutte le versioni di iOS?

Nota: non modificare l'UDID dopo aver riavviato il dispositivo o reinstallato l'applicazione.

+0

C'è una ragione per cui sono deprecando questi tipi di ID univoci. Crea e archivia il tuo UUID ('CFUUIDCreate') o usa l'identificatore del venditore –

risposta

38

Stavo aggiornando la mia applicazione che funzionava basandosi solo su Identificatore univoco che supportava iOS 4.3 e versioni successive. Così,

1) non ho potuto usare [UIDevice currentDevice].uniqueIdentifier; in quanto non era più disponibile

2) non ho potuto usare [UIDevice currentDevice].identifierForVendor.UUIDString perché era disponibile in iOS 6.0 e versioni successive ed è stato in grado di utilizzare per iOS più bassi versioni.

3) l'indirizzo MAC non era un'opzione in quanto non era permesso in iOS-7

4) OpenUDID era deprecated qualche tempo fa e ha avuto anche problemi con iOS-6.

identificatori 5) Pubblicità erano inoltre non è disponibile per iOS 5 e sotto

Infine questo era quello che ho fatto

a) Aggiunto SFHFKeychainUtils al progetto

b) Generato chiave CFUUID Stringa

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); 
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 

c) Salvato in chiave catena Utils altrimenti verrà generato un nuovo univoco ogni volta

codice finale

+ (NSString *)GetDeviceID { 
    NSString *udidString; 
    udidString = [self objectForKey:@"deviceID"]; 
    if(!udidString) 
    { 
    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); 
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 
    CFRelease(cfuuid); 
     [self setObject:udidString forKey:@"deviceID"]; 
    } 
    return udidString; 
} 

+(void) setObject:(NSString*) object forKey:(NSString*) key 
{ 
    NSString *objectString = object; 
    NSError *error = nil; 
    [SFHFKeychainUtils storeUsername:key 
         andPassword:objectString 
         forServiceName:@"LIB" 
         updateExisting:YES 
           error:&error]; 

    if(error) 
     NSLog(@"%@", [error localizedDescription]); 
} 

+(NSString*) objectForKey:(NSString*) key 
{ 
    NSError *error = nil; 
    NSString *object = [SFHFKeychainUtils getPasswordForUsername:key 
                andServiceName:@"LIB" 
                  error:&error]; 
    if(error) 
     NSLog(@"%@", [error localizedDescription]); 

    return object; 
} 

enter image description here

For further Details

+1

Grazie per questo. Si prega di notare che il creatore di SFHFKeychainUtils dice che dovrebbe essere considerato deprecato e si dovrebbe usare invece i suoi STUtil. Inoltre, dovrebbe anche aggiungere 'CFRelease (cfuuid);' al metodo 'GetDeviceID' qui sopra per prevenire perdite di memoria. – ghr

+0

@ghr. Sì, dice che dovrebbe essere considerato deprecato comunque lo sto usando. in molte applicazioni senza un problema. per il secondo grazie per quello in qualche modo l'ho saltato. –

+0

@ NSQuamber.java, questo ID generato verrà modificato dopo la disinstallazione dell'app? Ho un requisito che afferma che l'ID deve essere unico e verrà inviato al server. Anche l'utente disinstalla/reinstalla l'app, dovrei avere lo stesso id. È possibile con la tua soluzione? Inoltre, è ancora valido per iOS 8.4? – shamaleyte

-3

Non ho accesso al codice adesso (posso postare in poche ore se ne hai ancora bisogno) ma quello che ho fatto è creare un metodo statico 'deviceIdentifier' in una classe helper.

il metodo esegue un controllo di base per l'attuale versione di iOS, ritorna UDID se al di sotto 6.0 e uniqueIdentifier altrimenti

fammi sapere se vuoi il codice per questo e vi posterò quando posso. .sono solo 10-15 righe o così se ricordo bene, ma fa una grande differenza, quindi puoi semplicemente chiamare "[myHelper deviceIdentifier]" ovunque ti serva un ID dispositivo e non devi preoccuparti di quale versione iOS stanno utilizzando

+0

Grazie mille per le tue informazioni rapide. Come sai che Apple è obsoleto del metodo UDID, Così ho implementato per generare un identificatore univoco usando l'indirizzo Mac. Ma Apple rimuoverà l'indirizzo MAC wifi nella versione iOS7. Quindi ho bisogno di generare un nuovo codice univoco che dovrebbe funzionare in tutte le versioni incluso iOS7.Puoi condividere la tua logica in modo che mi aiuti molto .. Ancora una volta grazie .. – Ganesh

+0

Ciao Gahesh - ho appena controllato il mio codice e mi sono ricordato che ho preso il codice pre-identificatore perVendor completamente solo per garantire la conformità con le linee guida di Apple, penso che siano piuttosto rigidi sulle persone che usano UDID nelle nuove app, anche solo per supportare le versioni precedenti di iiOS –

+0

Quindi sto usando identifierForVendor che capisco non soddisfi il tuo requisito che deve rimanere costante anche nella disinstallazione delle app –

1

Ora Device Identifier passa a UUID. È possibile ottenere UUID con l'aiuto del seguente codice:

- (NSString *)getUUID 
{ 
    NSString *UUID = [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueID"]; 
    if (!UUID) { 
     CFUUIDRef theUUID = CFUUIDCreate(NULL); 
     CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
     CFRelease(theUUID); 
     UUID = [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""]; 
     [[NSUserDefaults standardUserDefaults] setValue:UUID forKey:@"uniqueID"]; 
    } 
    return UUID; 
} 

Funziona su tutte le versioni iOS.

+1

cambierà dopo l'applicazione di disinstallazione e reinstallare .... !!! –

+0

Sì, l'UDID viene modificato dopo aver reinstallato l'applicazione. Questa logica non è completa per soddisfare le mie esigenze. In ogni caso Grazie per la tua logica. – Ganesh