2008-10-22 10 views
31

Für eine iPhone App, die Bilder an einen Server sendet, muss ich irgendwie alle Bilder von einem bestimmten Telefon zusammenbinden. Mit jedem Beitrag möchte ich eine eindeutige Telefon-ID senden. Blick auf Eindeutige Kennung für eine iPhone App

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

aber Fehler im Simulator bekommen.

Gibt es einen Apple-sanktionierten Weg, dies zu tun?

+0

Können Sie die Seriennummer zugreifen? –

+0

wurde ein Fehler mit

[[UIDevice mainDevice] uniqueIdentifier]
aber
 [[UIDevice currentDevice] uniqueIdentifier]
scheint zu funktionieren. –

+0

Siehe http://stackoverflow.com/questions/193182/programmy-get-own-phone-number-in-iphone-os für warum SBFormattedPhoneNumber nicht mehr funktioniert. – Archie

Antwort

41

Welche Fehler werden Sie bekommen? [[UIDevice currentDevice] uniqueIdentifier] ( bearbeitet, um API zu beheben, danke Martin!) ist der offiziell empfohlene Weg, dies zu tun.

+4

*** + [UIDevice mainDevice]: nicht erkannt: aber versucht [UIDevice currentDevice] und es funktioniert in der sim –

+0

Entschuldigung, Sie haben Recht. –

+9

'[[UIDevice currentDevice] uniqueIdentifier]' ist jetzt ab iOS 5.0 veraltet - verwende es nicht. Ich habe gelesen, dass dieses GitHub Repo eine eindeutige ID mit einer Open-Source-Bibliothek produziert: https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5 –

0

Haben nicht getan, iphone Arbeit, aber wie wäre es mit einem Hash von etwas einzigartiges auf das Telefon ... oh, sag die Telefonnummer?

Getting iphone number

+0

Das funktioniert häufig, gibt aber in vielen Fällen falsche Informationen zurück. Sie erhalten eine Telefonnummer, aber es ist nicht garantiert, dass sie die Nummer des aktuellen Telefons, eine gültige Telefonnummer oder sogar eine eindeutige Nummer ist. –

+1

Wie oft hat ein iPod Touch eine Telefonnummer? –

+0

Telefonnummer ist definitiv nicht einzigartig. Es ist auch etwas, das von vielen Menschen bekannt ist, ist also eine schlechte Wahl für die Sicherung jeglicher Art von Daten hinter einem Webservice. Weiter - was passiert, wenn Sie die Telefonnummern ändern? – npellow

18

Sie können CFUUID auch verwenden, um eine UUID zu generieren. Hier einige Code:

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

Klingt cool. Ist die UUID bei jedem Aufruf gleich? –

+2

Nein, jedes Mal anders. Normalerweise würden Sie es beim ersten Start generieren und dann mit NSUserDefaults in Ihren Einstellungen speichern. –

+2

Der Nachteil besteht darin, dass wenn die App gelöscht und neu installiert wird oder wenn das Gerät aus der Sicherung wiederhergestellt wird, die gespeicherte UUID verloren geht und die Dinge nicht vom selben Gerät erkannt werden. –

13

mit Abstand einfachste und am besten geeigneter Weg, um eine eindeutige Kennung zu erhalten, ist es, die Mechanismen zu nutzen, von Apple explizit für einen Erhalt bietet - [[UIDevice currentDevice] uniqueIdentifier]. Sie können nicht garantieren, dass die Telefonnummer für das Gerät eindeutig ist oder dass das Gerät sogar eine Telefonnummer hat. Darüber hinaus ist dies eine schreckliche Idee, da es eine definitive Verletzung der Privatsphäre des Benutzers darstellt. Selbst die uniqueidentifier sollte Hashed sein, wenn Sie es in irgendeiner Weise speichern möchten.

+3

+1 für den Aufruf der Datenschutzbelange. So viele ignorieren diesen Aspekt einfach. – jmanning2k

+0

Was ist eine gute Möglichkeit, einen HASHED-Wert einer Zeichenfolge zu speichern? – Donna

+1

Wie in anderen Antworten darauf hingewiesen, ist dies ab iOS 5.0 veraltet –

2

Dies ist ein interessantes Problem, das ich auch in der Lösung suche. Hier ist ein Szenario, das ich ansprechen möchte.

Was passiert, wenn Sie Ihr Telefon an eine andere Person verkaufen ... dass die Geräte-ID dann jemand anderem gehört, also selbst wenn die App vom iPhone entfernt wird, könnte sie erneut hinzugefügt werden und alle diese Daten würden dann wieder einem neuen Benutzer zugeordnet werden ... das ist schlecht.

Die Verwendung der Telefonnummer mit der Geräte-ID MD5 wäre eine großartige Lösung. Ein anderer, den wir uns ausgedacht haben, ist eine SQL Lite DB mit einem Token Hashed mit der Device ID. Wenn die App entfernt wird, wird die Datenbank gelöscht und alle Daten werden getrennt. Ich denke, das könnte zu spröde sein.

Irgendwelche anderen Ideen?

Rob Ellis (PhoneGap/Nitobi)

+1

Oder das Telefon entwickelt ein Problem und wird im Rahmen der Garantie ersetzt - gleicher Benutzer, neues Telefon. Die in der NSUserDefaults-Lösung gespeicherte generierte UUID würde hier gewinnen, da die Prefs synchronisiert werden. – jmanning2k

0

snippit:

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

I [vor kurzem] lief diesen Code als Service-Leistung auf OS 2.2.1 [und OS 3.0].

Es funktioniert wie erwartet, wenn auf dem Gerät ausgeführt wird, und gibt meine Telefonnummer mit den vollständigen internationalen Vorwahlnummern [1 in meinem Fall] zurück.

Bei der Ausführung im Simulator ist der Wert [returned] eine Null-Zeichenfolge und funktioniert daher nur auf einem tatsächlichen iPhone-Gerät.

Ich habe es nicht auf einem iPod Touch getestet.

...

Ran diesen Code auf einem anderen Gerät in dieser Woche, und bekam einen Nullwert anstelle der Nummer.

Bei weiteren Untersuchungen scheint es, dass die Zahl, die von diesem Code-Snippit zurückgegeben wird, die Nummer ist, die in iTunes für das Gerät eingerichtet ist.

Wenn Sie die iPhone-Nummer in iTunes bei der Geräteaktivierung nicht eingegeben haben, oder vielleicht (wie in meinem Fall), wenn der Standardwert nicht die iPhone-Nummer war und Sie trotzdem auf OK geklickt haben, so dass iTunes nicht auflistet die Telefonnummer, wenn Ihr iPhone eingesteckt ist, gibt dieser Code eine leere Zeichenfolge zurück.

[Oben ist eine editierte Verkettung Kommentare Vor kurzem habe ich zu diesem Thema zu einem anderen Beitrag geschrieben http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

+0

Das ist keine gute Idee in Bezug auf Datensicherheit ... – DAS

0

Here wird einige weitere Informationen über einen Weg, um es von iTunes zu erhalten, die für Testzwecke nützlich sein können.

0

Ich hatte Erfolg mit solchen Code:

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

Sie nicht vergessen, dass in iOS 5 uniqueidentifier veraltet werden Sie CFUUID anstelle des

5

Interessanter verwenden sollte Apple die uniqueidentifier da ist veraltet in iOS 5 (wie gN0Me erwähnt). Hier ist der relevante TechCrunch Artikel: http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/

von Apple schlägt vor, dass Sie nicht mehr das Gerät eindeutig zu identifizieren, sondern identifizieren den Benutzer. In den meisten Fällen ist dies ein ausgezeichneter Ratschlag, obwohl es einige Situationen gibt, in denen noch eine eindeutige Geräte-ID global erforderlich ist. Diese Szenarien sind in der Werbung durchaus üblich. Daher habe ich eine extrem einfache Drop-In-Bibliothek geschrieben, die das bestehende Verhalten exakt nachbildet.

In einem schamlosen Stecker der Eigenwerbung, werde ich es hier in der Hoffnung verknüpfen, dass jemand es nützlich findet. Auch begrüße ich alle und jedes Feedback/Kritik: http://www.binpress.com/app/myid/591

Dennoch in Ihrer speziellen Situation würde ich die global eindeutige ID Funktionalität Überspringen berate meine Bibliothek bietet, da es ein bisschen übertrieben für Ihre Situation ist. Stattdessen würde ich eine einfache CFUUID generieren und in NSUserDefaults speichern. Diese ID wäre für Ihre Anwendung spezifisch, würde Ihnen aber erlauben, alle Fotos für diese "App-Installation" in Ihrer Datenbank zu gruppieren.

Mit anderen Worten, durch Ablehnen der Methode uniqueIdentifier schlägt Apple vor, dass Sie nicht pro Gerät, sondern pro App Installation identifizieren. Sofern Sie nicht unter bestimmten Bedingungen arbeiten, ist die Wahrscheinlichkeit, dass die per App ID Ihrem Produkt besser passt.

+0

Ihre Lösung ist nicht verfügbar. – Stas

8

Um die Unique Identifier auf Persist Sie zwischen den Installationen erstellen, können Sie den Schlüsselanhänger verwenden Made easy with SSKeychain: Einfach Ihre UUID wie folgt festgelegt:

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

und es dann wieder anrufen, wann immer Sie es brauchen:

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

Hinweis: Die Dienste und Konten müssen genau übereinstimmen.

Wenn die App dann gelöscht und neu installiert wird, wird die UUID bei der Neuinstallation beibehalten.

Wenn Sie diese UUID dann für mehrere Geräte freigeben möchten, richten Sie Ihre App für die Verwendung von iCloud ein. Sie können dann die UUID in NSUserDefaults speichern, mit KeyValueStore synchronisieren und dann die UUID im Schlüsselbund der neuen Geräte mit dem obigen Code festlegen.

Diese Antwort würde extrem lang werden, wenn ich Code für das ganze oben eintippte, aber viel Beispielcode um hier alles herauszufinden.

1
+0

Antworten, die nur Links enthalten, sind [als schlechte Praxis angesehen] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really- good-answers). Bitte fassen Sie den Inhalt hier zusammen (nicht kopieren/einfügen), damit die Antwort für sich alleine stehen kann. Wenn Sie nicht Gefahr laufen, dass Ihre Antwort entfernt wird, besonders wenn die Verbindung jemals stirbt. –

Verwandte Themen