Domanda

Per un'app per iPhone che invia immagini a un server, devo in qualche modo collegare tutte le immagini di un determinato telefono. Ad ogni invio vorrei inviare un ID telefono unico. Guardato

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

ma ricevendo errori nel simulatore.

Esiste un modo sanzionato da Apple per farlo?

È stato utile?

Soluzione

Quali errori stai riscontrando? [[UIDevice currentDevice] uniqueIdentifier] ( modificato per correggere l'API, grazie Martin! ) è il modo ufficialmente raccomandato per farlo.

Altri suggerimenti

Puoi anche usare CFUUID per generare un UUID. Ecco un po 'di codice:

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

Di gran lunga il modo più semplice e appropriato per ottenere un identificatore univoco è utilizzare i meccanismi che Apple fornisce esplicitamente per ottenerne uno - [[UIDevice currentDevice] uniqueIdentifier] . Non è possibile garantire che il numero di telefono sia univoco per il dispositivo o che il dispositivo disponga anche di un numero di telefono. Oltre a ciò, farlo è un'idea orribile in quanto è una chiara invasione della privacy dell'utente. Anche l ' uniqueidentifier dovrebbe essere sottoposto a hash se lo memorizzi in qualche modo.

Per persistere nell'identificatore univoco creato tra le installazioni, è possibile utilizzare il portachiavi Semplificato con SSKeychain : basta impostare il UUID come segue:

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

e poi richiamalo ogni volta che ne hai bisogno:

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

Nota: I servizi e gli account devono corrispondere esattamente .

Quindi, se l'app viene eliminata e reinstallata, l'UUID persisterà con la reinstallazione.

Se desideri condividere questo UUID su più dispositivi, configura la tua app per utilizzare iCloud. È quindi possibile archiviare l'UUID in NSUserDefaults, sincronizzare con KeyValueStore e quindi impostare l'UUID nel nuovo portachiavi di dispositivi con il codice sopra.

Questa risposta sarebbe estremamente lunga se digitassi il codice per tutto quanto sopra, ma un sacco di codice di esempio qui intorno per capire tutto.

Non dimenticare che in iOS 5 uniqueIdentifier sarà deprecato, dovresti usare CFUUID invece di quello

È interessante notare che da allora Apple ha deprecato uniqueIdentifier in iOS 5 (come menzionato gN0Me). Ecco l'articolo TechCrunch pertinente: http://techcrunch.com/2011/08/ 19 / apple-ios-5-phasing-out-udid /

Apple suggerisce di non identificare più in modo univoco il dispositivo, ma piuttosto di identificare l'utente . Nella maggior parte dei casi, si tratta di un consiglio eccellente anche se ci sono alcune situazioni che richiedono ancora un ID dispositivo globalmente unico. Questi scenari sono abbastanza comuni nella pubblicità. Quindi, ho scritto una libreria drop-in estremamente semplice che replica esattamente il comportamento esistente.

In una spudorata presa di auto-promozione, la collegherò qui nella speranza che qualcuno la trovi utile. Inoltre, accolgo con favore tutti i feedback e le critiche: http://www.binpress.com/app/myid/591

Tuttavia, nella tua situazione particolare, ti consiglio di saltare la funzionalità di ID univoco a livello globale che la mia biblioteca fornisce in quanto è un po 'eccessiva per la tua situazione. Invece, genererei un semplice CFUUID e lo memorizzerei in NSUserDefaults. Questo ID sarebbe specifico per la tua applicazione ma ti consentirebbe di raggruppare tutte le foto per quella "installazione di app" nel tuo database.

In altre parole, deprecando il metodo uniqueIdentifier, Apple suggerisce di non identificarti per dispositivo ma per app installa . A meno che tu non stia operando in condizioni specifiche, è probabile che l'ID per app si adatti meglio al tuo prodotto.

Questo è un problema interessante che sto anche cercando di risolvere. Ecco uno scenario che vorrei affrontare.

Cosa succede quando vendi il tuo telefono a un'altra persona ... che l'ID dispositivo apparirà a qualcun altro, quindi anche se l'app viene rimossa dall'iPhone, potrebbe essere aggiunta di nuovo e tutti quei dati sarebbero associato nuovamente a un nuovo utente ... questo è male.

L'uso del numero di telefono con l'ID dispositivo MD5 sarebbe un'ottima soluzione. Un altro che ci è venuto in mente è avere un DB SQL Lite con un token con hash con l'ID dispositivo. Quindi, quando l'app viene rimossa, il DB viene ucciso e tutti i dati vengono dissociati. Penso che potrebbe essere troppo fragile.

Altre idee?

Rob Ellis (PhoneGap / Nitobi)

L'iPhone non ha funzionato, ma che ne dici di prendere un hash di qualcosa di unico per il telefono ... oh, dì il numero di telefono?

Ottenere il numero di iphone

snippit:

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

Ho [recentemente] eseguito questo codice così com'è su OS 2.2.1 [e OS 3.0].

Funziona come previsto quando eseguito sul dispositivo e restituisce il mio numero di telefono con i prefissi internazionali completi [1 nel mio caso].

Quando eseguito sul simulatore, il valore [restituito] è una stringa nulla, quindi funziona solo su un dispositivo iPhone reale.

Non l'ho provato su un iPod Touch.

...

Questa settimana ho eseguito questo codice su un dispositivo diverso e ho ottenuto un valore null anziché il numero.

Su ulteriori ricerche, sembra che il numero restituito da questo frammento di codice sia il numero impostato in iTunes per il dispositivo.

Se non hai inserito il numero di iPhone in iTunes all'attivazione del dispositivo, o forse (come nel mio caso) se il valore predefinito non era il numero di iPhone e hai comunque fatto clic su OK, in modo che iTunes non elenca il numero di telefono quando il tuo iPhone è collegato, questo codice restituirà una stringa nulla.

[Sopra c'è una concatenazione modificata di commenti che ho recentemente pubblicato in un altro articolo su questo argomento in http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

Qui sono disponibili ulteriori informazioni su modo per ottenerlo da iTunes che può essere utile a scopo di test.

Ho avuto successo con tale codice:

- (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;
}    

È possibile utilizzare l'indirizzo MAC come ID univoco. Il seguente link ti aiuterà

Come posso ottenere a livello di programmazione il MAC indirizzo di un iPhone

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top