2013-05-21 4 views
19

Ich möchte eindeutige Bezeichner Zeichenfolge für iPhone Geräte anstelle von UDID und MAC.Ich möchte eine eindeutige Kennung String, die iPhone-Gerät erkennen (genau wie UDID)?

1. Get UDID und MAC sind von Apple veraltet.
2. Wir können UUID verwenden, aber es wird nach der Neuinstallation der App ändern oder App löschen.

Ich möchte einen eindeutigen Wert des Geräts, die gleich bleiben, nachdem App neu installieren ODER löschen oder iOS-Version aktualisieren.

+1

Können Sie mir Dokumentation zeigen, wo die MAC-Adresse veraltet ist? Ich hatte das nicht gehört. –

+0

Ich denke, Ihre einzige Option ist, MAC-Adresse abzufragen und etwas damit zu tun. Es ist bereits [hier] diskutiert (http://stackoverflow.com/questions/6993325/uidevice-uniqueneidentifier-deprecated-what-to-do- jetzt), und ich denke, diese Frage ist ein Duplikat. Und ich glaube nicht, dass MAC-Adresse veraltet ist, zumindest kann ich keine Dokumentation finden – Krishnabhadra

+0

Wenn Ihr iOS-Ziel ist 6.0 und höher gibt es die '[[UIDevice currentDevice] BezeichnerForVendor];' – danypata

Antwort

21

Sie können eine eindeutige Kennung mit [[UIDevice currentDevice] identifierForVendor] oder einem anderen eindeutigen Bezeichnergenerator erhalten. Danach sollten Sie diesen Wert unter Verwendung von KeychainItemWrapper im Schlüsselbund speichern und verwenden. Sobald Sie einen Wert auf dem Schlüsselbund speichern, wird er auch nach dem Löschen und erneuten Installieren der App nicht entfernt. Hier

ist ein Leitfaden für Schlüsselbund - Link

+0

Danke für den Schlüsselbund hinzufügen. Ich wusste nichts davon. Das werde ich auch in meiner Lösung umsetzen. – badweasel

+1

Aber was ist, wenn Benutzer sein Telefon wiederherstellen? Zu dieser Zeit wurde auch der Schlüsselbund entfernt. –

0

Ich würde vorschlagen, einen Blick auf OpenUDID.

Ich glaube, darunter verwendet die MAC-Adresse, wenn Sie also richtig sagen, dass der Zugriff auf die MAC-Adresse veraltet ist, dann wird es wahrscheinlich nicht viel nutzen, aber ich denke, es wäre unangemessen von Apple zu Zugriff entfernen; die MAC-Adresse hat andere Anwendungen, die nur das Gerät für die Zwecke der UDID identifizieren

2

Wie @danypata sagte, verwenden Sie die BezeichnerForVendor wie in this answer beschrieben.

Oder alternativ können Sie möglicherweise die Werbung NSUDID als described here verwenden.

Diese können jedoch als Null zurückkommen oder im Laufe der Zeit geändert werden. Der Nutzer kann das Tracking für Werbetreibende deaktivieren. Daher rate ich davon ab, Nutzer für Ihre eigenen Zwecke zu verwenden.

Ich denke, es hängt davon ab, warum Sie ihr Gerät an erster Stelle verfolgen. Meine Einstellung ist, dass ich Benutzer Gewohnheiten für immer nicht verfolgen muss. Ich muss nur allgemeine Benutzertrends und einige DAU-Informationen verfolgen. Also erstelle ich meine eigene UDID - die sich bei jeder Installation der App ändert. In meiner nächsten Version werde ich den identifierForVendor verwenden und wenn es NIL ist, werde ich mein eigenes erstellen. Diese

ist, wie ich meine eigenen zu machen:

// this makes a device id like: UUID = 89CD872F-C9AF-4518-9E6C-A01D35AF091C 
// except that I'm going to attach some other attributes to it like the OS version, model type, etc. 
// the UUID that is stored in user defaults will be like the one above.. but the device id that gets returned 
// from this function and sent to [my online system] will have the extra info at the end of the string. 
- (void) createUUID { 
    // for collecting some data.. let's add some info about the device to the uuid 

    NSString *thisDeviceID; 
    NSString *systemVersion = [[UIDevice currentDevice]systemVersion]; 
    NSString *model = [[UIDevice currentDevice]model]; 
    NSString *retinaTag; 
    if (retina) { 
     retinaTag = @"Retina"; 
    } 
    else { 
     retinaTag = @""; 
    } 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    id uuid = [defaults objectForKey:@"uniqueID"]; 
    if (uuid) 
     thisDeviceID = (NSString *)uuid; 
    else { 
     CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL)); 
     thisDeviceID = (__bridge NSString *)cfUuid; 
     CFRelease(cfUuid); 
     [defaults setObject:thisDeviceID forKey:@"uniqueID"]; 
    } 
    //NSLog(@"UUID = %@", thisDeviceID); 

    MYthisDeviceID = [NSString stringWithFormat:@"%@-%@-%@-%@",thisDeviceID,systemVersion,retinaTag,model]; 

    //NSLog(@"UUID with info = %@", MYthisDeviceID); 

}

Dann wird die einzelne Zeichenfolge, die auf meinen Server geschickt wird sowohl eine UDID drin und Spezifikationen über das Gerät und os. Bis der Nutzer die App vollständig löscht und neu lädt, zeigt die Statistik die Nutzung auf diesem Gerät an. Um doppelte udds nicht zu erhalten, wenn sie auf ein neues os aktualisieren, können Sie nur auf den udid-Teil zuschneiden.

Ich benutze die MAC-Adresse überhaupt nicht, weil es mein Verständnis war, dass Apple uns nicht wollte. Obwohl ich keine Dokumentation finden kann, die es im Moment sagt.

UPDATE für iOS7:

ich jetzt diesen Code verwenden, der unter IO6 und IO7 arbeitet:

NSString *globalDeviceID; 

- (void) createUUID 
{ 
    NSString *thisDeviceID; 
    NSString *systemVersion = [[UIDevice currentDevice]systemVersion]; 
    NSString *model = [[UIDevice currentDevice]model]; 
    NSString *retinaTag; 

    if (retina) { 
     retinaTag = @"Retina"; 
    } 
    else { 
     retinaTag = @""; 
    } 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    id uuid = [defaults objectForKey:@"deviceID"]; 
    if (uuid) 
     thisDeviceID = (NSString *)uuid; 
    else {   
     if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { 
      thisDeviceID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
     } 
     else 
     { 
      CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL)); 
      thisDeviceID = (__bridge NSString *)cfUuid; 
      CFRelease(cfUuid); 
     } 
     [defaults setObject:thisDeviceID forKey:@"deviceID"]; 
    } 
    NSLog(@"UUID = %@", thisDeviceID); 
    globalDeviceID = [NSString stringWithFormat:@"%@-%@-%@-%@",thisDeviceID,systemVersion,retinaTag,model]; 
    NSLog(@"UUID with info = %@", globalDeviceID); 
} 
+0

Hallo, stürzt nicht dieser Code mit iOS 7 ?? Ich habe eine etwas andere Form dieses Codes implementiert und es begann in iOS7 –

+0

zu crashen Ich werde meine Antwort bearbeiten, um meine aktuelle Version dieses Codes hinzuzufügen, die ich in io7 gerade gut gebrauche. – badweasel

+0

Das einzige Problem mit Werbung NSUDID, dass Apple nach der Verwendung während der Überprüfung fragen wird, vielleicht könnte es eine andere Überprüfung oder etwas anderes bedeuten, die besser zu vermeiden sein können ... nie wissen ... – BootMaker

2

Versuchen

[[UIDevice currentDevice] identifierForVendor];

Es ist von iOS 6.

+0

aber ich don, t knoe kann Ich nehme UDID für ältere Version von ios6 – Mahesh

2

Oder verwenden Sie einfach die folgenden und speichern zu NSUserDefaults

[NSProcessInfo processInfo].globallyUniqueString 

Globale ID für den Prozess. Die ID enthält den Hostnamen, die Prozess-ID und einen Zeitstempel, der sicherstellt, dass die ID für das Netzwerk eindeutig ist.

Verwandte Themen