Es hat sich gerade herausgestellt, dass die Eigenschaft uniqueIdentifier von UIDevice in iOS 5 veraltet und in iOS 7 und höher nicht verfügbar ist. Es scheint keine alternative Methode oder Eigenschaft verfügbar oder verfügbar zu sein.
Viele unserer vorhandenen Apps sind stark von dieser Eigenschaft abhängig, um ein bestimmtes Gerät eindeutig zu identifizieren. Wie könnten wir dieses Problem in Zukunft behandeln?
Der Vorschlag aus der Dokumentation in 2011-2012 war:
Besondere Überlegungen
Verwenden Sie nicht die Eigenschaft uniqueIdentifier. Um eine eindeutige Kennung für Ihre App
CFUUIDCreate
zu erstellen , können Sie die Funktion zum Erstellen einer Kennung aufrufenUUID
und diese mithilfe derNSUserDefaults
Klasse in die Standarddatenbank schreiben .
Dieser Wert ist jedoch nicht identisch, wenn ein Benutzer die App deinstalliert und neu installiert.
quelle
Antworten:
Eine von erstellte UUID
CFUUIDCreate
ist eindeutig, wenn ein Benutzer die App deinstalliert und neu installiert: Sie erhalten jedes Mal eine neue.Möglicherweise möchten Sie jedoch, dass es nicht eindeutig ist, dh, es sollte gleich bleiben, wenn der Benutzer die App deinstalliert und neu installiert. Dies erfordert ein wenig Aufwand, da die MAC-Adresse die zuverlässigste Kennung pro Gerät zu sein scheint. Sie können den MAC abfragen und als UUID verwenden.Bearbeiten: Man muss natürlich immer den MAC derselben Schnittstelle abfragen. Ich denke, die beste Wette ist miten0
. Der MAC ist immer vorhanden, auch wenn die Schnittstelle keine IP hat / nicht verfügbar ist.Bearbeiten 2: Wie von anderen erwähnt, ist die bevorzugte Lösung seit iOS 6 - [UIDevice identifierForVendor] . In den meisten Fällen sollten Sie es als Ersatz für die alte verwenden können
-[UIDevice uniqueIdentifier]
(aber eine UUID, die beim ersten Start der App erstellt wird, scheint von Apple gewünscht zu werden).Bearbeiten 3: Damit dieser wichtige Punkt nicht im Kommentarrauschen verloren geht: Verwenden Sie den MAC nicht als UUID, sondern erstellen Sie einen Hash mit dem MAC . Dieser Hash führt jedes Mal zum gleichen Ergebnis, auch bei Neuinstallationen und Apps (wenn das Hashing auf die gleiche Weise durchgeführt wird). Heutzutage (2013) ist dies nicht mehr erforderlich, es sei denn, Sie benötigen eine "stabile" Gerätekennung unter iOS <6.0.Bearbeiten 4: In iOS 7 gibt Apple jetzt immer einen festen Wert zurück, wenn der MAC abgefragt wird, um den MAC als Basis für ein ID- Schema gezielt zu vereiteln . Sie sollten jetzt also wirklich - [UIDevice identifierForVendor] verwenden oder eine UUID pro Installation erstellen.
quelle
Sie können Ihre Alternative bereits für Apple verwenden
UDID
. Freundlicher Kerl gekitz schrieb eine Kategorie, aufUIDevice
der eine ArtUDID
basierend auf der Mac-Adresse des Geräts und der Bundle- ID generiert wird .Sie finden Code auf Github
quelle
02:00:00:00:00:00
wenn Sie auf einem beliebigen Gerät nach der MAC-Adresse fragen. Überprüfen Sie hier: developer.apple.com/library/prerelease/ios/releasenotes/General/…Basierend auf dem von @moonlight vorgeschlagenen Link habe ich mehrere Tests durchgeführt und es scheint die beste Lösung zu sein. Wie @DarkDust sagt, überprüft
en0
die Methode, welche immer verfügbar ist.Es gibt zwei Optionen:
uniqueDeviceIdentifier
(MD5 von MAC + CFBundleIdentifier)und
uniqueGlobalDeviceIdentifier
(MD5 von MAC), diese geben immer die gleichen Werte zurück.Unter den Tests, die ich durchgeführt habe (mit dem realen Gerät):
Hoffe es ist nützlich.
BEARBEITEN:
Wie andere betonten, ist diese Lösung in iOS 7 nicht mehr nützlich, da sie
uniqueIdentifier
nicht mehr verfügbar ist und die Abfrage der MAC-Adresse jetzt immer 02: 00: 00: 00: 00: 00 zurückgibtquelle
Schau dir das an,
Wir können Schlüsselbund anstelle von
NSUserDefaults
Klasse verwenden, um vonUUID
erstellte zu speichernCFUUIDCreate
.Auf diese Weise könnten wir
UUID
bei einer Neuinstallation eine Neuerstellung vermeiden undUUID
für dieselbe Anwendung immer dasselbe erhalten, selbst wenn der Benutzer deinstalliert und erneut installiert.UUID
wird nur neu erstellt, wenn das Gerät vom Benutzer zurückgesetzt wird.Ich habe diese Methode mit SFHFKeychainUtils ausprobiert und sie funktioniert wie ein Zauber.
quelle
kSecAttrAccessibleAlwaysThisDeviceOnly
. Dadurch wird sichergestellt, dass Ihre UUID nicht auf ein anderes Gerät migriert wird. Verwenden Sie denkSecAttrAccessGroup
Schlüssel , um von anderen Apps aus auf Ihre UUID zuzugreifen .Erstellen Sie Ihre eigene UUID und speichern Sie sie im Schlüsselbund. Somit bleibt es auch dann bestehen, wenn Ihre App deinstalliert wird. In vielen Fällen bleibt es auch dann bestehen, wenn der Benutzer zwischen Geräten migriert (z. B. vollständige Sicherung und Wiederherstellung auf einem anderen Gerät).
Tatsächlich wird es für Sie zu einer eindeutigen Benutzer- ID. (sogar besser als Gerätekennung ).
Beispiel:
Ich definiere eine benutzerdefinierte Methode zum Erstellen eines
UUID
als:Sie können es dann
KEYCHAIN
beim ersten Start Ihrer App speichern . Damit wir es nach dem ersten Start einfach über den Schlüsselbund verwenden können, müssen wir es nicht neu generieren. Der Hauptgrund für die Verwendung des Schlüsselbunds zum Speichern ist: Wenn SieUUID
den Schlüsselbund festlegen, bleibt er auch dann bestehen, wenn der Benutzer die App vollständig deinstalliert und anschließend erneut installiert. . Dies ist also die permanente Art der Speicherung, was bedeutet, dass der Schlüssel vollständig eindeutig ist.Geben Sie beim Start der Anwendung den folgenden Code an:
Laden Sie die Dateien SSKeychain.m und .h von sskeychain herunter und ziehen Sie die Dateien SSKeychain.m und .h in Ihr Projekt. Fügen Sie Ihrem Projekt "Security.framework" hinzu. Um die UUID anschließend zu verwenden, verwenden Sie einfach:
quelle
Vielleicht können Sie verwenden:
In der Dokumentation von Apple wird identifierForVender wie folgt beschrieben:
Der Wert dieser Eigenschaft ist für Apps gleich, die von demselben Anbieter stammen, der auf demselben Gerät ausgeführt wird. Für Apps auf demselben Gerät, die von verschiedenen Anbietern stammen, und für Apps auf verschiedenen Geräten, unabhängig vom Anbieter, wird ein anderer Wert zurückgegeben.
quelle
Möglicherweise möchten Sie in Betracht ziehen,
OpenUDID
einen Ersatz für die veralteten zu verwendenUDID
.Grundsätzlich sind
UDID
folgende Funktionen erforderlich, um die Anforderungen zu erfüllen:OpenUDID
erfüllt die oben genannten Anforderungen und verfügt sogar über einen integrierten Opt-Out-Mechanismus für spätere Überlegungen.Überprüfen Sie http://OpenUDID.org, es zeigt auf den entsprechenden GitHub. Hoffe das hilft!
Als Randnotiz würde ich jede MAC-Adressalternative scheuen. Während die MAC-Adresse wie eine verlockende und universelle Lösung erscheint, stellen Sie sicher, dass diese niedrig hängende Frucht vergiftet ist. Die MAC-Adresse ist sehr vertraulich, und Apple kann den Zugriff auf diese Adresse möglicherweise ablehnen, bevor Sie überhaupt "DIESE APP SENDEN" sagen können. Die MAC-Netzwerkadresse wird zur Authentifizierung bestimmter Geräte in privaten LANs (WLANs) oder anderen virtuellen privaten Netzwerken verwendet Netzwerke (VPNs). .. es ist noch empfindlicher als die frühere UDID!
quelle
Ich bin sicher, Apple hat viele Leute mit dieser Änderung geärgert. Ich entwickle eine Buchhaltungs-App für iOS und habe einen Onlinedienst zum Synchronisieren von Änderungen, die auf verschiedenen Geräten vorgenommen wurden. Der Dienst verwaltet eine Datenbank aller Geräte und der Änderungen, die an diese weitergegeben werden müssen. Daher ist es wichtig zu wissen, welche Geräte welche sind. Ich verfolge Geräte mit dem UIDevice uniqueIdentifier und für das, was es wert ist, sind hier meine Gedanken.
Eine UUID generieren und in den Benutzerstandards speichern? Nicht gut, da dies nicht anhält, wenn der Benutzer die App löscht. Wenn sie später erneut installiert werden, sollte der Onlinedienst keinen neuen Gerätedatensatz erstellen, da dies Ressourcen auf dem Server verschwenden und eine Liste von Geräten erstellen würde, die zwei oder mehr Mal dasselbe enthalten. Benutzer würden mehr als ein "Bob's iPhone" aufgelistet sehen, wenn sie die App neu installieren würden.
Eine UUID generieren und im Schlüsselbund speichern? Dies war mein Plan, da er auch dann bestehen bleibt, wenn die App deinstalliert wird. Beim Wiederherstellen eines iTunes-Backups auf einem neuen iOS-Gerät wird der Schlüsselbund jedoch übertragen, wenn das Backup verschlüsselt ist. Dies kann dazu führen, dass zwei Geräte dieselbe 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 aufgeführt werden, auch wenn der Gerätename identisch ist.
Einen Hash der MAC-Adresse und der Bundle-ID generieren? Dies scheint die beste Lösung für das zu sein, was ich brauche. Durch Hashing mit der Bundle-ID kann das Gerät aufgrund der generierten Geräte-ID nicht über Apps hinweg verfolgt werden, und ich erhalte eine eindeutige ID für die Kombination aus App und Gerät.
Es ist interessant festzustellen, dass sich Apples eigene Dokumentation auf die Validierung von Mac App Store-Belegen bezieht, indem ein Hash der System-MAC-Adresse sowie die Bundle-ID und -Version berechnet werden. Dies scheint also aus politischen Gründen zulässig zu sein, ob es eine App-Überprüfung durchläuft, die ich noch nicht kenne.
quelle
kSecAttrAccessibleAlwaysThisDeviceOnly
. Dadurch wird sichergestellt, dass Ihre UUID nicht auf anderen Geräten wiederhergestellt wird, selbst wenn die Sicherung verschlüsselt ist.Es sieht so aus, als würde Apple für iOS 6 die Verwendung der NSUUID-Klasse empfehlen .
Aus der Nachricht jetzt in den UIDevice- Dokumenten für
uniqueIdentifier
Eigenschaft:quelle
Kann helfen: Verwenden Sie den folgenden Code, der immer eindeutig ist, außer wenn Sie Ihr Gerät löschen (formatieren).
quelle
Ich würde auch über empfehlen Wechsel
uniqueIdentifier
zu dieser Open - Source - Bibliothek (2 einfache Kategorien wirklich) , dass das Geräts der MAC - Adresse zusammen mit dem App Bundle Identifier verwendet eine eindeutige ID in Ihren Anwendungen zu erzeugen , die als UDID Ersatz verwendet werden können.Beachten Sie, dass diese Nummer im Gegensatz zur UDID für jede App unterschiedlich ist.
Sie müssen lediglich die enthaltenen
NSString
undUIDevice
Kategorien importieren und[[UIDevice currentDevice] uniqueDeviceIdentifier]
wie folgt aufrufen :Sie finden es auf Github hier:
UIDevice mit UniqueIdentifier für iOS 5
Hier sind die Kategorien (nur die .m-Dateien - überprüfen Sie das Github-Projekt auf die Header):
quelle
Mit diesem Code können Sie Folgendes erreichen: UIDevice-with-UniqueIdentifier-for-iOS-5
quelle
Die MAC-Adresse kann gefälscht werden, wodurch ein solcher Ansatz unbrauchbar wird, um Inhalte an bestimmte Benutzer zu binden oder Sicherheitsfunktionen wie Blacklists zu implementieren.
Nach einigen weiteren Nachforschungen scheint es mir, dass wir ab sofort keine richtige Alternative mehr haben. Ich hoffe ernsthaft, dass Apple ihre Entscheidung überdenken wird.
Vielleicht wäre es eine gute Idee, Apple eine E-Mail zu diesem Thema zu senden und / oder eine Fehler- / Funktionsanfrage zu diesem Thema einzureichen, da sie möglicherweise nicht einmal die vollständigen Konsequenzen für Entwickler kennen.
quelle
UIDevice identifierForVendor
in iOS 6 eingeführt würde für Ihre Zwecke funktionieren.identifierForVendor
ist eine alphanumerische Zeichenfolge, die ein Gerät gegenüber dem Anbieter der App eindeutig identifiziert. (schreibgeschützt)Der Wert dieser Eigenschaft ist für Apps gleich, die von demselben Anbieter stammen, der auf demselben Gerät ausgeführt wird. Für Apps auf demselben Gerät, die von verschiedenen Anbietern stammen, und für Apps auf verschiedenen Geräten, die vom Anbieter stammen, wird ein anderer Wert zurückgegeben.
Verfügbar in iOS 6.0 und höher und deklariert in
UIDevice.h
Für iOS 5 siehe diesen Link UIDevice-with-UniqueIdentifier-for-iOS-5
quelle
Verwendung der oben genannten SSKeychain und des Codes. Hier ist Code zum Kopieren / Einfügen (SSKeychain-Modul hinzufügen):
}}
quelle
Der folgende Code hilft beim Abrufen der UDID:
quelle
Dies ist der Code, mit dem ich die ID für iOS 5 und iOS 6, 7 erhalte:
quelle
PerformSelector may cause a leak because its selector is unknown
?Ab iOS 6 haben wir eine
NSUUID
Klasse, die RFC4122 entsprichtApple Link: apple_ref für NSUUID
quelle
iOS 11 hat das DeviceCheck-Framework eingeführt. Es verfügt über eine vollständige Lösung zur eindeutigen Identifizierung des Geräts.
quelle
Ein funktionierender Weg, um UDID zu erhalten:
Ein Beispiel mit RoutingHTTPServer :
Hier sind die Inhalte von
udid.mobileconfig
:Die Profilinstallation schlägt fehl (ich habe mich nicht darum gekümmert, eine erwartete Antwort zu implementieren, siehe Dokumentation ), aber die App erhält eine korrekte UDID. Und Sie sollten auch die mobileconfig unterschreiben .
quelle
Für Swift 3.0 verwenden Sie bitte den folgenden Code.
quelle
Sie können verwenden
Welches ist für das Gerät in allen Anwendungen einzigartig.
quelle
Apple hat in iOS 11 ein neues Framework namens DeviceCheck hinzugefügt, mit dem Sie die eindeutige Kennung ganz einfach abrufen können. Lesen Sie dieses Formular für weitere Informationen. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d
quelle
Wenn jemand auf diese Frage stößt, wenn er nach einer Alternative sucht. Ich habe diesen Ansatz im
IDManager
Unterricht verfolgt. Dies ist eine Sammlung verschiedener Lösungen. KeyChainUtil ist ein Wrapper zum Lesen aus dem Schlüsselbund. Sie können diehashed MAC address
ID auch als eine Art eindeutige ID verwenden.quelle
quelle
Wir können identifierForVendor für ios7 verwenden,
--Wichtige Notiz ---
UDID und identifierForVendor unterscheiden sich: ---
quelle
Apple hat die UDID ab iOS 7 vor allen öffentlichen APIs verborgen. Jede UDID, die mit FFFF beginnt, ist eine gefälschte ID. Die zuvor funktionierenden "UDID senden" -Apps können nicht mehr zum Sammeln von UDIDs für Testgeräte verwendet werden. (Seufzer!)
Die UDID wird angezeigt, wenn ein Gerät mit XCode verbunden ist (im Organizer) und wenn das Gerät mit iTunes verbunden ist (obwohl Sie auf "Seriennummer" klicken müssen, um die Kennung anzuzeigen.
Wenn Sie die UDID für ein Gerät zum Hinzufügen zu einem Bereitstellungsprofil benötigen und dies in XCode nicht selbst tun können, müssen Sie sie durch die Schritte zum Kopieren / Einfügen aus iTunes führen.
Gibt es seit (Veröffentlichung von iOS 7) eine Möglichkeit, die UDID zu erhalten, ohne iTunes auf einem PC / Mac zu verwenden?
quelle
Ich hatte auch ein Problem und die Lösung ist einfach:
quelle
Eine nicht perfekte, aber eine der besten und am nächsten gelegenen Alternativen zu UDID (in Swift mit iOS 8.1 und Xcode 6.1):
Generieren einer zufälligen UUID
Und verwenden Sie die KeychainWrapper- Bibliothek:
Fügen Sie dem Schlüsselbund einen Zeichenfolgenwert hinzu:
Rufen Sie einen Zeichenfolgenwert aus dem Schlüsselbund ab:
Entfernen Sie einen Zeichenfolgenwert aus dem Schlüsselbund:
Diese Lösung verwendet den Schlüsselbund, sodass der im Schlüsselbund gespeicherte Datensatz auch nach der Deinstallation und Neuinstallation der App erhalten bleibt. Die einzige Möglichkeit, diesen Datensatz zu löschen, besteht darin, alle Inhalte und Einstellungen des Geräts zurückzusetzen. Aus diesem Grund habe ich erwähnt, dass diese Substitutionslösung nicht perfekt ist, sondern eine der besten Lösungen für den Ersatz von UDID unter iOS 8.1 mit Swift bleibt.
quelle
NSLog (@ "% @", [[UIDevice currentDevice] identifierForVendor]);
quelle