511 Stimmen

UIDevice uniqueIdentifier veraltet - Was ist jetzt zu tun?

Es ist gerade bekannt geworden, dass die Eigenschaft UIDevice uniqueIdentifier ist veraltet en iOS 5 und ist in iOS 7 und höher nicht verfügbar. Es scheint keine alternative Methode oder Eigenschaft zur Verfügung zu stehen oder geplant zu sein.

Viele unserer bestehenden Anwendungen sind eng mit dieser Eigenschaft verbunden, um ein bestimmtes Gerät eindeutig zu identifizieren. Wie könnten wir dieses Problem in Zukunft angehen?

Die Anregung von die Dokumentation im Zeitraum 2011-2012 war:

Besondere Überlegungen

Verwenden Sie nicht die Eigenschaft uniqueIdentifier. Um einen eindeutigen Bezeichner speziell für für Ihre Anwendung zu erstellen, können Sie die CFUUIDCreate Funktion zur Erstellung einer UUID und schreiben in die Standarddatenbank unter Verwendung der NSUserDefaults Klasse.

Dieser Wert bleibt jedoch nicht derselbe, wenn ein Benutzer die Anwendung deinstalliert und erneut installiert.

16voto

diadyne Punkte 3878

Vielleicht können Sie das verwenden:

[UIDevice currentDevice].identifierForVendor.UUIDString

Die Dokumentation von Apple beschreibt identifierForVender wie folgt:

Der Wert dieser Eigenschaft ist für Anwendungen desselben Herstellers, die auf demselben Gerät laufen, gleich. Für Apps auf demselben Gerät, die von verschiedenen Anbietern stammen, und für Apps auf verschiedenen Geräten wird unabhängig vom Anbieter ein anderer Wert zurückgegeben.

14voto

ylechelle Punkte 157

Vielleicht sollten Sie Folgendes in Erwägung ziehen OpenUDID die einen sofortigen Ersatz für die veraltete UDID .

Im Grunde genommen, um die UDID sind die folgenden Merkmale erforderlich:

  1. eindeutig oder ausreichend eindeutig (eine Kollision mit geringer Wahrscheinlichkeit ist wahrscheinlich sehr akzeptabel)
  2. Beständigkeit bei Neustarts, Wiederherstellungen und Deinstallationen
  3. verfügbar über Apps verschiedener Anbieter (nützlich, um Nutzer über CPI-Netzwerke zu gewinnen) -

OpenUDID erfüllt die oben genannten Anforderungen und verfügt sogar über einen eingebauten Opt-Out-Mechanismus für eine spätere Berücksichtigung.

Siehe http://OpenUDID.org verweist er auf das entsprechende GitHub. Ich hoffe, das hilft!

Nebenbei bemerkt, würde ich vor jeder MAC-Adressen-Alternative zurückschrecken. Die MAC-Adresse scheint zwar eine verlockende und universelle Lösung zu sein, aber seien Sie sicher, dass diese niedrig hängende Frucht vergiftet ist. Die MAC-Adresse ist sehr empfindlich, und Apple könnte den Zugang zu ihr sehr wohl verweigern, bevor Sie überhaupt sagen können: "SUBMIT THIS APP"... die MAC-Netzwerkadresse wird verwendet, um bestimmte Geräte in privaten Lans (WLANs) oder anderen virtuellen privaten Netzwerken (VPNs) zu authentifizieren... sie ist sogar noch empfindlicher als die frühere UDID!

11voto

Mathew Waters Punkte 486

Ich bin sicher, dass Apple mit dieser Änderung viele Leute verärgert hat. Ich entwickle eine Buchhaltungs-App für iOS und verfügen über einen Online-Dienst zur Synchronisierung von Änderungen, die auf verschiedenen Geräten vorgenommen wurden. Der Dienst unterhält eine Datenbank mit allen Geräten und den Änderungen, die an sie weitergegeben werden müssen. Daher ist es wichtig zu wissen, welche Geräte welche sind. Ich verfolge die Geräte mit dem UIDevice uniqueIdentifier, und hier sind meine Gedanken dazu.

  • Eine UUID generieren und in den Benutzervorgaben speichern? Nicht gut, denn dies bleibt nicht bestehen, wenn der Benutzer die Anwendung löscht. Bei einer späteren Neuinstallation sollte der Online-Dienst keinen neuen Gerätedatensatz erstellen, da dies Ressourcen auf dem Server verschwenden und eine Liste von Geräten ergeben würde, die zwei oder mehr Mal dasselbe Gerät enthalten. Benutzer würden mehr als ein "Bobs iPhone" sehen, wenn sie die App erneut installieren.

  • Eine UUID generieren und im Schlüsselbund speichern? Das war mein Plan, da sie auch dann bestehen bleibt, wenn die App deinstalliert wird. Aber beim Wiederherstellen eines iTunes-Backups auf ein neues iOS-Gerät wird der Schlüsselbund übertragen, wenn das Backup verschlüsselt ist. Dies könnte dazu führen, dass zwei Geräte die gleiche Geräte-ID enthalten, wenn sowohl das alte als auch das neue Gerät in Betrieb sind. Diese sollten im Onlinedienst als zwei Geräte aufgelistet werden, auch wenn der Gerätename derselbe ist.

  • Erzeugen Sie einen Hash aus MAC-Adresse und Bündel-ID? Dies scheint die beste Lösung für meine Bedürfnisse zu sein. Durch den Hash mit der Bündel-ID wird die generierte Geräte-ID nicht dazu führen, dass das Gerät über Anwendungen hinweg verfolgt werden kann, und ich erhalte eine eindeutige ID für die Kombination aus Anwendung und Gerät.

Interessant ist, dass Apple in seiner eigenen Dokumentation auf die Validierung von Mac App-Store-Quittungen, indem ein Hash der System-MAC-Adresse sowie der Bundle-ID und -Version berechnet wird. Dies scheint also von der Richtlinie erlaubt zu sein. Ob es die App-Prüfung durchläuft, weiß ich noch nicht.

11voto

Nate Punkte 30799

Es sieht so aus, als würde Apple für iOS 6 empfehlen, die die Klasse NSUUID .

Aus der Nachricht, die jetzt im UIDevice Dokumente für uniqueIdentifier Eigentum:

Veraltet in iOS 5.0. Verwenden Sie die Eigenschaft identifierForVendor dieser Klasse oder die advertisingIdentifier-Eigenschaft der ASIdentifierManager Klasse, oder verwenden Sie die UUID-Methode der NSUUID Klasse, um eine UUID zu erstellen und sie in die Datenbank mit den Benutzervorgaben zu schreiben.

10voto

Ashvin A Punkte 7293

Kann helfen: Verwenden Sie den untenstehenden Code, er wird immer einzigartig sein, außer Sie löschen (formatieren) Ihr Gerät.

Objektiv-C :

Option 1: Dies wird bei jeder Installation geändert

UIDevice *uuid = [NSUUID UUID].UUIDString;

Option 2: Diese Option ist pro Anbieter/Entwickler und Apple-Konto eindeutig.

UIDevice *myDevice = [UIDevice currentDevice];
NSString *uuid = [[myDevice identifierForVendor] UUIDString];

Swift 5.X :

Option 1: Dies wird bei jeder Installation geändert

let uuid = UUID().uuidString

Option 2: Diese Option ist pro Anbieter/Entwickler und Apple-Konto eindeutig.

let myDevice = UIDevice.current
let uuid = myDevice.identifierForVendor?.uuidString

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X