it-swarm.com.de

Eindeutige Identifizierung eines iOS-Benutzers

Ich möchte ein Benutzerkonto auf dem Server für neue Benutzer einer App erstellen, aber ich möchte auch nicht, dass der Benutzer etwas eingibt. Im Idealfall möchte ich, dass dies automatisch erfolgt, wie beim Game Center.

Aber ich frage mich, ob es möglich ist. Kann ich irgendetwas zur eindeutigen Identifizierung des Benutzers verwenden? Es ist höchst unwahrscheinlich, dass ich die Apple-ID des Benutzers herausfinden kann. Außerdem identifiziert die Geräte-ID eindeutig das Gerät und nicht den Benutzer. Es wäre also sinnlos, wenn der Benutzer mehr Geräte hat ...

Kann ich noch etwas gebrauchen?

Informationen zum Datenschutz - Ich möchte nichts hinter dem Rücken des Benutzers erfahren. Ich habe absolut kein Problem damit, den Benutzer nach dem Zugriff auf seine Informationen zu fragen (und wenn es eine API gibt, die mir diese Informationen gewährt, wäre es toll, wenn die API diese selbst auffordert). Wie Steve Jobs selbst sagte, handelt es sich bei diesem Thema um Datenschutz. Erzwingt, dass Apps den Benutzer um Erlaubnis fragen, bevor sie etwas mit ihren privaten Daten anfangen.

36
rid

Die richtige Lösung ist die Verwendung des iCloud Key-Value Store , in dem Sie eine eindeutige Benutzer-ID speichern können, ohne dass eine Authentifizierung oder Benutzerinformationen wie eine E-Mail-Adresse erforderlich sind. 

Das Endergebnis ist eine zufällige UUID (nichts, was den Benutzer tatsächlich identifiziert), die für jeden Benutzer unterschiedlich ist, aber den gleichen Wert für mehrere Geräte hat, die unter demselben iTunes-Konto registriert sind.

Wir definieren ein Feld in unserem iCloud KV Store, nennen wir es userID. Wenn die App gestartet wird, überprüfen wir zunächst die Benutzer-ID. Wenn dies der Fall ist, haben wir die eindeutige ID unseres Benutzers. Wenn nicht, ist dies das erste Mal, dass wir für diesen Benutzer laufen. Wir generieren eine zufällige UUID und speichern sie im KV Store unter userID. Das ist alles dazu.

Unsere Erfahrung zeigt, dass diese UUID für jedes iTunes-Konto eindeutig ist. Wenn Ihre Endbenutzer die Familienfreigabe verwenden, werden diesen Konten unterschiedliche UUIDs zugewiesen (dies kann wünschenswert sein oder auch nicht, aber Sie können nichts dagegen tun). Bei einer beliebigen Anzahl von Geräten, die unter demselben iTunes-Konto gestartet werden, wird dieselbe UUID angezeigt.

Dieser Ansatz ist absolut legitim und sollte ohne Probleme von Apple genehmigt werden.

Natürlich müssen Sie den iCloud-Schlüsselwertspeicher für Xcode unter Capabilities aktivieren. Aktivieren Sie dazu einfach den iCloud-Switch.

Hier ist eine einfache Klasse, die dieses Konzept in Objective-C implementiert:

@implementation EEUserID

+ (NSUUID *) getUUID
{
    NSUUID *uuid = nil;
    NSString *uuidString = [[NSUbiquitousKeyValueStore defaultStore] stringForKey: @"EEUserID"];
    if (uuidString == nil)
    {
        // This is our first launch for this iTunes account, so we generate random UUID and store it in iCloud:
        uuid = [NSUUID UUID];
        [[NSUbiquitousKeyValueStore defaultStore] setString: uuid.UUIDString forKey: @"EEUserID"];
        [[NSUbiquitousKeyValueStore defaultStore] synchronize];
    }
    else
    {
        uuid = [[NSUUID alloc] initWithUUIDString: uuidString];
    }

    return uuid;
}

+ (NSString *) getUUIDString
{
    NSUUID *uuid = [self getUUID];
    if (uuid != nil)
        return uuid.UUIDString;
    else
        return nil;
}

+ (void) load
{
    // get changes that might have happened while this
    // instance of your app wasn't running
    [[NSUbiquitousKeyValueStore defaultStore] synchronize];
}

@end

Und für die Header-Datei:

#import <Foundation/Foundation.h>

@interface EEUserID : NSObject

+ (NSUUID *) getUUID;
+ (NSString *) getUUIDString;

@end

Um es zu benutzen, müssen Sie nur Folgendes aufrufen:

NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString];

Genießen.

23
ldoogy

Generieren Sie eine UUID mit diesem:

NSString *UUID() {
    CFUUIDRef cfuuid = CFUUIDCreate(NULL); 
    NSString *uuid =  (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfuuid); 
    CFRelease(cfuuid);
    return uuid;
}

Nichts wird hier von Apple missbilligt oder missbilligt - in der Tat ist es die Art und Weise, wie sie es vorschlagen. Speichern Sie die generierte UUID im Schlüsselbund und sie wird dort angezeigt - auch wenn der Benutzer Ihre App deinstalliert und neu installiert hat. Die UUID ist für das Gerät und den Zeitpunkt, zu dem es generiert wurde, eindeutig.

Sie können dann verschiedene Schemata verwenden, um die Benutzer ihre Geräte zusammenfassen zu lassen - iCloud oder eine Art Schlüssel, den Sie vom Server erhalten.

Viel Glück!

Zusatz:

So speichere ich es im Schlüsselbund, verwende die uuid als Benutzernamen und generiere ein zufälliges Passwort:

uuid = UUID();
[keychainItemWrapper setObject:uuid forKey:(__bridge_transfer id)kSecAttrAccount];
NSString *pass_token = randomString(10);
[keychainItemWrapper setObject:pass_token forKey:(__bridge_transfer id)kSecValueData];

Beachten Sie, dass dies alles ohne Eingaben des Benutzers erfolgen kann.

Update:

MCSMKeychainItem bietet eine hervorragende Lösung für die UUID-Generierung und -Speicherung mit [MCSMApplicationUUIDKeychainItem applicationUUID]. Die Bibliothek hat auch [MCSMGenericKeychainItem genericKeychainItemWithService:service username:username password:password]. Zusammen sorgen diese Funktionen für alles, was oben erwähnt wurde. Einfach zu installieren mit CocoaPods .

22
Erik

Radu

Ausgezeichnete Frage. Wir haben das von Ihnen beschriebene Problem durch die Integration von Urban Airship (urbanairship.com) in unsere Apps gelöst. Urban Airship bietet zahlreiche Funktionen, um In-App-Käufe, Belegbestätigung, Wiederherstellung von Abonnements, Bereitstellung von Inhalten und Apple Push-Benachrichtigung zu unterstützen.

Eine der besten Eigenschaften von Urban Airship ist die Möglichkeit, einen "Benutzer" zu identifizieren, nicht ein Gerät, sondern einen "Benutzer" anhand der E-Mail-Adresse. Es ist nicht wirklich ein beworbenes "Feature" ... eher ein Nebenprodukt seiner beabsichtigten Funktionalität.

Folgendes haben wir gefunden und wie wir Urban Airship einsetzen können, um Ihr Problem zu lösen.

Wenn ein Benutzer Ihre App installiert, in die Urban Airship integriert ist, generiert UA irgendwie eine UDID-artige Nummer, die das Gerät momentan nur identifiziert. 

Wenn Sie jedoch die Abonnement-Wiederherstellungskomponenten von Urban Airship nutzen, können Sie den Benutzer dazu veranlassen, eine E-Mail-Adresse einzugeben. Sobald der Benutzer seine E-Mail-Adresse auf dem ersten Gerät eingegeben hat, wird die generierte ID zur Hauptmethode der Benutzeridentifizierung und mit dieser E-Mail-Adresse verknüpft. Wenn sie ihre E-Mail-Adresse auf nachfolgenden Geräten eingeben, löst Urban Airship einen E-Mail-Validierungsprozess aus. Sobald der Benutzer den Überprüfungsvorgang abgeschlossen hat, aktualisiert er die ID auf dem neuen Gerät, sodass sie mit der ID des ersten Geräts übereinstimmt und so weiter. Das Beste daran ist ... es ist alles Auto-Magie! Sie integrieren einfach die Komponenten und lassen den Benutzer seine E-Mail-Adresse eingeben. Sie sollten in der Lage sein, alles innerhalb einer Stunde zum Laufen zu bringen.

Es bietet auch Funktionen, mit denen der Benutzer die E-Mail-Adresse aller seiner Geräte ändern kann.

Wir haben es tatsächlich umgesetzt und es funktioniert sehr gut!

HINWEIS: Ab dem 1. Juli 2013 stellt Urban Airship die Abonnement- und Wiederherstellungsfunktion ein

4
radesix

Die Erzeugung einer UUID, wie Erik es vorgeschlagen hat, ist definitiv eine solide Lösung. Der einzige (kleine) Nachteil ist, dass bei einer vollständigen Wiederherstellung von iDevice der Schlüsselbund auch gelöscht wird. Die Anwendung generiert in diesem Szenario eine neue UUID, und das iDevice kann nicht mehr mit einem vorhandenen Benutzer verknüpft werden.

Ein anderer Ansatz, ein iDevice eindeutig zu identifizieren, besteht darin, eine eindeutige ID basierend auf der MAC-Adresse der Netzwerkschnittstelle zu generieren und diese mit der App-Bundle-ID zu kombinieren. Diese Methode liefert eine eindeutige ID, die anwendungsspezifisch und dauerhaft ist. Dies ändert sich nicht, wenn das iDevice gelöscht, wiederhergestellt oder die App entfernt und erneut installiert wird. Aus diesem Grund muss diese ID nicht im Schlüsselbund gespeichert werden.

Glücklicherweise gibt es bereits einige Leute, die eine kleine Bibliothek erstellt haben, um dies zu erreichen. Der Code ist auf GitHub zu finden:

https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5

1
Bas Peters

Swift3/4 +

Verwenden der iCloud-Datensatz-ID (CKRecordID). Diese ID ist für das iTunes-Konto eindeutig.

let container = CKContainer.default()
container.fetchUserRecordID() {
    recordID, error in

    if let err = error {
        print(err.localizedDescription)
    }
    else if recID = recordID {
        print("fetched ID \(recID.recordName ?? "NA")")
    }
}

Bei automatisch erstellten Datensätzen basiert die ID-Namenszeichenfolge auf einer UUID und ist daher garantiert eindeutig.

Wie wäre es, wenn Sie Game Center und iCloud zusammen verwenden, um Benutzer zu identifizieren?

Es ist weniger wahrscheinlich, dass ein Benutzer kein Spiel spielt und seine Daten nicht synchronisiert.

0
Mickey

Sie können Lösungen von Drittanbietern wie SECUREUDID verwenden, oder auch auschecken dies

0
msk

Heute wurde unsere App aufgrund der Identifizierung des Game Centers abgelehnt. Es befindet sich in den App Store-Richtlinien: https://developer.Apple.com/appstore/resources/approval/guidelines.html

Sie können keine einzige Game Center-ID im Format G: verwenden.

Der einzige Weg für uns ist jetzt die Verwendung der iOS6-Facebook-Integration.

UPDATE: Unsere neue Version mit automatischer FB-Anmeldung hat den Überprüfungsprozess bestanden und ist im App Store (Slovni Duel) verfügbar. Verwendet auch ein mit dem FB-Profil verknüpftes inApp-Abonnement.

0
Lubomir

Dies ist keine absolut sichere Lösung (und funktioniert nur, wenn iCloud aktiviert ist), aber es ist sehr einfach zu implementieren: Einmalige eindeutige ID (wie UUID) generieren und im iCloud-Schlüsselwertspeicher ablegen.

Das einzige Problem ist, dass fortgeschrittene Benutzer wissen, wie Inhalte aus der iCloud gelöscht werden.

Um zu verhindern, dass der Benutzer nur die in iCloud gespeicherte eindeutige ID mit einer anderen ID bearbeitet, können Sie ein Geheimnis hinzufügen.

0
miho

Eine Alternative zu Eriks Vorschlag ist eine Drittanbieter-Bibliothek namens OpenUDID . Sie können eine eindeutige Kennung pro Gerät generieren, und das ist denkbar einfach: 

#include "OpenUDID.h"
NSString* openUDID = [OpenUDID value];
0
Anthony