2015-05-28 14 views
12

Ogni volta che la mia app viene aggiornata dall'App Store, un numero esiguo di utenti ottiene un nuovo identificatore per il motivo. I miei utenti non si registrano o non effettuano l'accesso. Sono tutti anonimi, quindi ho bisogno di separarli tramite i loro ID del fornitore.Perché iOS ottiene un nuovo identificatore per gli aggiornamenti delle app?

Ho pensato che lo spazio su alcuni dispositivi potrebbe essere insufficiente, con conseguente eliminazione e reinstallazione dell'app, ma non è il caso dato che nell'ultimo aggiornamento un mio amico aveva oltre 2 GB di spazio vuoto.

So che l'identificatore ForVendor viene modificato per un utente che elimina e reinstalla l'app. Ma non è questo il caso, visto che l'app è appena stata aggiornata.

Quale potrebbe essere il problema? La parte strana è che questo non è ancora avvenuto per i dispositivi del team di sviluppo. Oppure ci sono ancora utenti che non hanno riscontrato questo errore dopo innumerevoli aggiornamenti delle app, aggiornamenti del sistema operativo, ecc. Questo succede solo a una piccola percentuale di utenti. Tutti gli utenti sono iOS7 + e succede per diversi modelli di dispositivi e versioni iOS.

Io uso questo codice per ottenere il loro ID:

static let DeviceId = UIDevice.currentDevice().identifierForVendor.UUIDString 

Poi li salva in NSUserDefaults:

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "User" + DeviceId) 
NSUserDefaults.standardUserDefaults().synchronize() 

Poi controllo se esiste l'utente, ad ogni nuova login:

static func doesUserExist() -> Bool { 
    var userDefaultValue: AnyObject? = NSUserDefaults.standardUserDefaults().valueForKey("User" + DeviceId) 

    if defaultValue == true { 
     println("Userdefaults already has this guy, moving on") 
     FirstTime = false 
     return true 
    } else { 
     println("First time in the app!") 
     FirstTime = true 
     return false 
    } 
} 

Se l'utente esiste, avvia la procedura di accesso. Se l'utente non esiste mostra loro la procedura di registrazione. Sto usando Parse.com come backend e il deviceID è usato come username. Quando questa piccola quantità di utenti sperimenta questo bug, vedo un nuovo nome utente e un nuovo account creato.

+0

https://discussions.apple.com/thread/5114517?tstart=0 trovato anche questo – Esqarrouth

+0

mai scoperto il perché cambia? Ho anche lo stesso problema in cui le persone si aggiornano e hanno un ID fornitore diverso –

+0

Ma ma queste sembrano alcune delle possibilità che sto testando: aggiornamenti del sistema operativo, spazio di archiviazione cache app, aggiornamenti app, utente che cambia paese, firma su icloud o nuovo servizio Apple – Esqarrouth

risposta

0

Salva il vendorID nel KeyChain, che verrà mantenuto dopo l'eliminazione o qualsiasi aggiornamento.

-(NSString *)getUniqueDeviceIdentifierAsString 
{ 

NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; 

NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"]; 
if (strApplicationUUID == nil) 
{ 
    strApplicationUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"]; 
} 

return strApplicationUUID; 
} 

Disclaimer: ha preso il codice da qualche altro SO rispondere a qualche tempo fa, in modo da non mi ricordo chi di lodare, ma alla fine non sono io
@Jonny trovato il source

+2

grazie per il codice. aiuterà a risolvere questo problema. tuttavia questo post è focalizzato più su quale potrebbe essere il problema, anziché su una soluzione. – Esqarrouth

+1

Come menzionato nei commenti a questa risposta: http://stackoverflow.com/a/21878670/129202 la sincronizzazione del portachiavi usando iCloud rompe questo. – Jonny

+0

@Jonny: puoi risolvere questo problema aggiungendo alcune informazioni sul dispositivo alla chiave. Ma per la domanda qui, non è necessario, in quanto si tratta solo di identificare un utente - dubito che ci siano molti utenti che condividono il proprio iCloud ... – dogsgod

5

Si è verificato un errore nel calcolo dell'identificatoreForVendor durante l'aggiornamento di un'app dall'app store tra maggio e luglio. Apple ha affermato di aver già risolto il problema e di dover eseguire un altro aggiornamento per ripristinare il valore originale prima della data critica. Riferimento: https://openradar.appspot.com/22677034

Prendere nota che alcuni utenti hanno ancora osservato questo problema anche l'aggiornamento settimane dopo luglio. Quindi è ancora possibile che il bug sia ancora lì per alcuni o potrebbe riemergere in qualsiasi momento in futuro. Quindi, se si utilizzano questi dati come parte della crittografia, è meglio salvare questo nel portachiavi.

0

Sono confuso perché si sta salvando l'IFV in NSUserDefaults prima e quindi si verifica se quella chiave esiste. Penso che dovresti...

1) controllare NSUserDefaults prima di vedere se la chiave IFV creato esiste

2) Se la chiave NSUserDefaults esiste, grande fare quello che ti serve con esso, il profilo di questo utente esiste già

3) se chiave non esiste, ottenere l'IFV e salvarlo NSUserDefaults

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if ([defaults valueForKey:@"IFV"]) { 
    //this user already exists, do what you need to do next with IFV 
} 

else{ 
    //this is their first time using the app 
    NSString *ifvString = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    [defaults setValue:ifvString forKey:@"IFV"]; 

    //do what you need to do next with IFV 
}