Freigeben über


So verwenden Sie die iOS-Clientbibliothek für Azure Mobile Apps

Überblick

In diesem Leitfaden erfahren Sie, wie Sie gängige Szenarien mit dem neuesten Azure Mobile Apps iOS SDK ausführen. Wenn Sie mit Azure Mobile Apps noch nicht vertraut sind, führen Sie zuerst den Schnellstart für Azure Mobile Apps aus, um ein Back-End zu erstellen, eine Tabelle zu erstellen und ein vordefiniertes iOS Xcode-Projekt herunterzuladen. In diesem Leitfaden konzentrieren wir uns auf das clientseitige iOS SDK. Weitere Informationen zum serverseitigen SDK für das Back-End finden Sie im Server SDK HOWTOs.

Referenzdokumentation

Die Referenzdokumentation für das iOS-Client-SDK befindet sich hier: Azure Mobile Apps iOS-Clientreferenz.

Unterstützte Plattformen

Das iOS SDK unterstützt Objective-C Projekte, Swift 2.2-Projekte und Swift 2.3-Projekte für iOS-Versionen 8.0 oder höher.

Die "Server-Flow"-Authentifizierung verwendet ein WebView für die angezeigte Benutzeroberfläche. Wenn das Gerät keine WebView-Benutzeroberfläche präsentieren kann, ist eine andere Authentifizierungsmethode erforderlich, die sich außerhalb des Bereichs des Produkts befindet. Dieses SDK eignet sich daher nicht für Watch-Type- oder ähnlich eingeschränkte Geräte.

Einrichtung und Voraussetzungen

In diesem Leitfaden wird davon ausgegangen, dass Sie ein Back-End mit einer Tabelle erstellt haben. In diesem Leitfaden wird davon ausgegangen, dass die Tabelle dasselbe Schema wie die Tabellen in diesen Lernprogrammen aufweist. In diesem Handbuch wird auch davon ausgegangen, dass Sie in Ihrem Code auf MicrosoftAzureMobile.framework verweisen und MicrosoftAzureMobile/MicrosoftAzureMobile.h importieren.

So erstellen Sie einen Client

Um auf ein Azure Mobile Apps-Back-End in Ihrem Projekt zuzugreifen, erstellen Sie eine MSClient. Ersetzen Sie AppUrl durch die App-URL. Sie können gatewayURLString und applicationKey leer lassen. Wenn Sie ein Gateway für die Authentifizierung einrichten, füllen gatewayURLString Sie es mit der Gateway-URL auf.

Objective-C:

MSClient *client = [MSClient clientWithApplicationURLString:@"AppUrl"];

Swift:

let client = MSClient(applicationURLString: "AppUrl")

Anleitung zum Erstellen eines Tabellenverweises

Um auf Daten zuzugreifen oder diese zu aktualisieren, erstellen Sie einen Verweis auf die Back-End-Tabelle. Ersetzen sie TodoItem durch den Namen der Tabelle.

Objective-C:

MSTable *table = [client tableWithName:@"TodoItem"];

Swift:

let table = client.tableWithName("TodoItem")

Vorgehensweise: Abfragen von Daten

Um eine Datenbankabfrage zu erstellen, fragen Sie das MSTable Objekt ab. Die folgende Abfrage ruft alle Elemente in TodoItem und protokolliert den Text der einzelnen Elemente.

Objective-C:

[table readWithCompletion:^(MSQueryResult *result, NSError *error) {
        if(error) { // error is nil if no error occurred
                NSLog(@"ERROR %@", error);
        } else {
                for(NSDictionary *item in result.items) { // items is NSArray of records that match query
                        NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
                }
        }
}];

Swift:

table.readWithCompletion { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let items = result?.items {
        for item in items {
            print("Todo Item: ", item["text"])
        }
    }
}

Vorgehensweise: Filtern zurückgegebener Daten

Zum Filtern von Ergebnissen gibt es viele verfügbare Optionen.

Um mithilfe eines Prädikats zu filtern, verwenden Sie ein NSPredicate und readWithPredicate. Mit den folgenden Filtern werden Daten gefiltert, um ausschließlich unvollständige Todo-Aufgaben zu finden.

Objective-C:

// Create a predicate that finds items where complete is false
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"complete == NO"];
// Query the TodoItem table
[table readWithPredicate:predicate completion:^(MSQueryResult *result, NSError *error) {
        if(error) {
                NSLog(@"ERROR %@", error);
        } else {
                for(NSDictionary *item in result.items) {
                        NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
                }
        }
}];

Swift:

// Create a predicate that finds items where complete is false
let predicate =  NSPredicate(format: "complete == NO")
// Query the TodoItem table
table.readWithPredicate(predicate) { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let items = result?.items {
        for item in items {
            print("Todo Item: ", item["text"])
        }
    }
}

Vorgehensweise: Verwenden von MSQuery

Um eine komplexe Abfrage (einschließlich Sortierung und Paging) auszuführen, erstellen Sie ein MSQuery Objekt direkt oder mithilfe eines Prädikats:

Objective-C:

MSQuery *query = [table query];
MSQuery *query = [table queryWithPredicate: [NSPredicate predicateWithFormat:@"complete == NO"]];

Swift:

let query = table.query()
let query = table.queryWithPredicate(NSPredicate(format: "complete == NO"))

MSQuery ermöglicht ihnen die Steuerung mehrerer Abfrageverhalten.

  • Angeben der Reihenfolge der Ergebnisse
  • Einschränken, welche Felder zurückgegeben werden sollen
  • Beschränken Sie die Anzahl der zurückzugebenden Datensätze
  • Angeben der Gesamtanzahl als Antwort
  • Angeben von benutzerdefinierten Abfragezeichenfolgenparametern in Anforderung
  • Anwenden zusätzlicher Funktionen

Führen Sie eine MSQuery Abfrage aus, indem Sie readWithCompletion für das Objekt aufrufen.

Vorgehensweise: Sortieren von Daten mit MSQuery

Zum Sortieren von Ergebnissen sehen wir uns ein Beispiel an. Rufen Sie MSQuery folgendermaßen auf, um zuerst nach dem aufsteigenden Feld 'text' und dann nach dem absteigenden Feld 'complete' zu sortieren:

Objective-C:

[query orderByAscending:@"text"];
[query orderByDescending:@"complete"];
[query readWithCompletion:^(MSQueryResult *result, NSError *error) {
        if(error) {
                NSLog(@"ERROR %@", error);
        } else {
                for(NSDictionary *item in result.items) {
                        NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
                }
        }
}];

Swift:

query.orderByAscending("text")
query.orderByDescending("complete")
query.readWithCompletion { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let items = result?.items {
        for item in items {
            print("Todo Item: ", item["text"])
        }
    }
}

Vorgehensweise: Einschränken von Feldern und Erweitern von Abfragezeichenfolgenparametern mit MSQuery

Wenn Sie felder einschränken möchten, die in einer Abfrage zurückgegeben werden sollen, geben Sie die Namen der Felder in der selectFields-Eigenschaft an. In diesem Beispiel werden nur die Text- und abgeschlossenen Felder zurückgegeben:

Objective-C:

query.selectFields = @[@"text", @"complete"];

Swift:

query.selectFields = ["text", "complete"]

Um zusätzliche Abfragezeichenfolgenparameter in die Serveranforderung einzuschließen (z. B. weil ein benutzerdefiniertes serverseitiges Skript sie verwendet), füllen query.parameters Sie dies wie folgt aus:

Objective-C:

query.parameters = @{
    @"myKey1" : @"value1",
    @"myKey2" : @"value2",
};

Swift:

query.parameters = ["myKey1": "value1", "myKey2": "value2"]

Vorgehensweise: Konfigurieren des Seitenformats

Mit Azure Mobile Apps steuert die Seitengröße die Anzahl der Datensätze, die gleichzeitig aus den Back-End-Tabellen abgerufen werden. Ein Aufruf von pull Daten würde dann Daten basierend auf dieser Seitengröße stapeln, bis es keine weiteren Datensätze zum Abrufen gibt.

Es ist möglich, ein Seitenformat mithilfe von MSPullSettings wie unten dargestellt zu konfigurieren. Die Standardseitengröße ist 50, und das folgende Beispiel ändert sie in 3.

Sie können aus Leistungsgründen eine andere Seitengröße konfigurieren. Wenn Sie über eine große Anzahl kleiner Datensätze verfügen, reduziert eine hohe Seitengröße die Anzahl der Server-Roundtrips.

Diese Einstellung steuert nur die Seitengröße auf der Clientseite. Wenn der Client eine Seitengröße anfordert, die größer ist als die vom Backend der Mobile Apps unterstützte Größe, wird die Seitengröße auf das Maximum beschränkt, das das Backend unterstützt.

Diese Einstellung ist auch die Anzahl der Datensätze, nicht die Bytegröße.

Wenn Sie die Clientseitengröße erhöhen, sollten Sie auch die Seitengröße auf dem Server erhöhen. Informationen hierzu finden Sie unter "Wie man die Tabellenblättergröße anpasst".

Objective-C:

  MSPullSettings *pullSettings = [[MSPullSettings alloc] initWithPageSize:3];
  [table  pullWithQuery:query queryId:@nil settings:pullSettings
                        completion:^(NSError * _Nullable error) {
                               if(error) {
                    NSLog(@"ERROR %@", error);
                }
                           }];

Swift:

let pullSettings = MSPullSettings(pageSize: 3)
table.pullWithQuery(query, queryId:nil, settings: pullSettings) { (error) in
    if let err = error {
        print("ERROR ", err)
    }
}

Vorgehensweise: Einfügen von Daten

Um eine neue Tabellenzeile einzufügen, erstellen Sie ein NSDictionary und verwenden Sie table insert. Wenn dynamisches Schema aktiviert ist, generiert das mobile Azure App Service-Back-End automatisch neue Spalten basierend auf dem NSDictionary.

Wenn id nicht angegeben, generiert das Back-End automatisch eine neue eindeutige ID. Geben Sie Ihren eigenen id Namen an, um E-Mail-Adressen, Benutzernamen oder eigene benutzerdefinierte Werte als ID zu verwenden. Durch die Bereitstellung Ihrer eigenen ID können Verknüpfungen und geschäftsorientierte Datenbanklogik erleichtert werden.

Das result enthält das neue Element, das eingefügt wurde. Je nach Serverlogik können zusätzliche oder geänderte Daten im Vergleich zu den Daten vorhanden sein, die an den Server übergeben wurden.

Objective-C:

NSDictionary *newItem = @{@"id": @"custom-id", @"text": @"my new item", @"complete" : @NO};
[table insert:newItem completion:^(NSDictionary *result, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
    }
}];

Swift:

let newItem = ["id": "custom-id", "text": "my new item", "complete": false]
table.insert(newItem) { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let item = result {
        print("Todo Item: ", item["text"])
    }
}

Vorgehensweise: Ändern von Daten

Um eine vorhandene Zeile zu aktualisieren, ändern Sie ein Element und rufen Sie update auf.

Objective-C:

NSMutableDictionary *newItem = [oldItem mutableCopy]; // oldItem is NSDictionary
[newItem setValue:@"Updated text" forKey:@"text"];
[table update:newItem completion:^(NSDictionary *result, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
    }
}];

Swift:

if let newItem = oldItem.mutableCopy() as? NSMutableDictionary {
    newItem["text"] = "Updated text"
    table2.update(newItem as [NSObject: AnyObject], completion: { (result, error) -> Void in
        if let err = error {
            print("ERROR ", err)
        } else if let item = result {
            print("Todo Item: ", item["text"])
        }
    })
}

Geben Sie alternativ die Zeilen-ID und das aktualisierte Feld an:

Objective-C:

[table update:@{@"id":@"custom-id", @"text":"my EDITED item"} completion:^(NSDictionary *result, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
    }
}];

Swift:

table.update(["id": "custom-id", "text": "my EDITED item"]) { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let item = result {
        print("Todo Item: ", item["text"])
    }
}

Das id Attribut muss mindestens festgelegt werden, wenn Aktualisierungen vorgenommen werden.

Vorgehensweise: Löschen von Daten

Um ein Element zu löschen, verwenden Sie delete mit dem Element.

Objective-C:

[table delete:item completion:^(id itemId, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item ID: %@", itemId);
    }
}];

Swift:

table.delete(newItem as [NSObject: AnyObject]) { (itemId, error) in
    if let err = error {
        print("ERROR ", err)
    } else {
        print("Todo Item ID: ", itemId)
    }
}

Alternativ können Sie löschen, indem Sie eine Zeilen-ID angeben:

Objective-C:

[table deleteWithId:@"37BBF396-11F0-4B39-85C8-B319C729AF6D" completion:^(id itemId, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item ID: %@", itemId);
    }
}];

Swift:

table.deleteWithId("37BBF396-11F0-4B39-85C8-B319C729AF6D") { (itemId, error) in
    if let err = error {
        print("ERROR ", err)
    } else {
        print("Todo Item ID: ", itemId)
    }
}

Zumindest muss das Attribut id beim Durchführen von Löschvorgängen festgelegt werden.

Anleitung: Aufrufen einer benutzerdefinierten API

Mit einer benutzerdefinierten API können Sie jede Back-End-Funktionalität verfügbar machen. Es muss keinem Tabellenvorgang zugeordnet werden. Nicht nur erhalten Sie mehr Kontrolle über Messaging, Sie können sogar Kopfzeilen lesen/festlegen und das Antworttextformat ändern.

Rufen Sie zum Aufrufen einer benutzerdefinierten API auf MSClient.invokeAPI. Der Anforderungs- und Antwortinhalt wird als JSON behandelt. Um andere Medientypen zu verwenden, verwenden Sie die andere Überladung von invokeAPI. Wenn Sie eine GET Anforderung anstelle einer POST Anforderung stellen möchten, legen Sie Parameter HTTPMethod auf "GET" und Parameter body auf nil fest, da GET-Anforderungen keine Nachrichtentexte enthalten. Wenn Ihre benutzerdefinierte API andere HTTP-Verben unterstützt, ändern Sie HTTPMethod entsprechend.

Objective-C:

[self.client invokeAPI:@"sendEmail"
                  body:@{ @"contents": @"Hello world!" }
            HTTPMethod:@"POST"
            parameters:@{ @"to": @"bill@contoso.com", @"subject" : @"Hi!" }
               headers:nil
            completion: ^(NSData *result, NSHTTPURLResponse *response, NSError *error) {
                if(error) {
                    NSLog(@"ERROR %@", error);
                } else {
                    // Do something with result
                }
            }];

Swift:

client.invokeAPI("sendEmail",
            body: [ "contents": "Hello World" ],
            HTTPMethod: "POST",
            parameters: [ "to": "bill@contoso.com", "subject" : "Hi!" ],
            headers: nil)
            {
                (result, response, error) -> Void in
                if let err = error {
                    print("ERROR ", err)
                } else if let res = result {
                          // Do something with result
                }
        }

Vorgehensweise: Registrieren von Pushvorlagen zum Senden plattformübergreifender Benachrichtigungen

Um Vorlagen zu registrieren, übergeben Sie Vorlagen mit Ihrer Client.push registerDeviceToken-Methode in Ihrer Client-App.

Objective-C:

[client.push registerDeviceToken:deviceToken template:iOSTemplate completion:^(NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    }
}];

Swift:

client.push?.registerDeviceToken(NSData(), template: iOSTemplate, completion: { (error) in
    if let err = error {
        print("ERROR ", err)
    }
})

Ihre Vorlagen sind vom Typ "NSDictionary" und können mehrere Vorlagen im folgenden Format enthalten:

Objective-C:

NSDictionary *iOSTemplate = @{ @"templateName": @{ @"body": @{ @"aps": @{ @"alert": @"$(message)" } } } };

Swift:

let iOSTemplate = ["templateName": ["body": ["aps": ["alert": "$(message)"]]]]

Alle Tags werden aus der Anfrage aus Sicherheitsgründen entfernt. Informationen zum Hinzufügen von Tags zu Installationen oder Vorlagen in Installationen finden Sie unter "Arbeiten mit dem .NET-Back-End-Server-SDK für Azure Mobile Apps". Um Benachrichtigungen mithilfe dieser registrierten Vorlagen zu senden, arbeiten Sie mit Notification Hubs-APIs.

Vorgehensweise: Behandeln von Fehlern

Wenn Sie ein mobiles Azure App Service-Back-End aufrufen, enthält der Abschlussblock einen NSError Parameter. Wenn ein Fehler auftritt, ist dieser Parameter nicht nil. In Ihrem Code sollten Sie diesen Parameter überprüfen und den Fehler nach Bedarf behandeln, wie in den vorherigen Codeausschnitten gezeigt.

Die Datei <WindowsAzureMobileServices/MSError.h> definiert die Konstanten MSErrorResponseKey, MSErrorRequestKeyund MSErrorServerItemKey. So rufen Sie weitere Daten im Zusammenhang mit dem Fehler ab:

Objective-C:

NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

Darüber hinaus definiert die Datei Konstanten für jeden Fehlercode:

Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

Vorgehensweise: Authentifizieren von Benutzern mit der Active Directory-Authentifizierungsbibliothek

Nutzen Sie die Active Directory-Authentifizierungsbibliothek (Active Directory Authentication Library, ADAL), um Benutzer mithilfe von Azure Active Directory bei Ihrer Anwendung anzumelden. Die Clientflussauthentifizierung mit einem Identitätsanbieter-SDK ist der Verwendung der loginWithProvider:completion: Methode vorzuziehen. Die Clientfluss-Authentifizierung bietet ein nativeres UX-Erlebnis und ermöglicht zusätzliche Anpassungen.

  1. Konfigurieren Sie Ihr mobiles App-Back-End für die AAD-Anmeldung, indem Sie dem Lernprogramm zum Konfigurieren des App Service für Active Directory folgen . Schließen Sie auch den optionalen Schritt zur Registrierung einer nativen Clientanwendung ab. Für iOS wird empfohlen, dass der Umleitungs-URI dem Formular <app-scheme>://<bundle-id>entspricht. Weitere Informationen finden Sie in der ADAL iOS-Schnellstartanleitung.

  2. Installieren Sie ADAL mit Cocoapods. Bearbeiten Sie Ihre Podfile so, dass sie die folgende Definition enthält, und ersetzen Sie YOUR-PROJECT durch den Namen Ihres Xcode-Projekts:

     source 'https://github.com/CocoaPods/Specs.git'
     link_with ['YOUR-PROJECT']
     xcodeproj 'YOUR-PROJECT'
    

    und der Pod:

     pod 'ADALiOS'
    
  3. Führen Sie den Befehl pod install im Terminal im Verzeichnis aus, das Ihr Projekt enthält, und öffnen Sie dann den generierten Xcode-Arbeitsbereich (nicht das Projekt).

  4. Fügen Sie Ihrer Anwendung gemäß der verwendeten Sprache den folgenden Code hinzu. Nehmen Sie in jedem die folgenden Ersetzungen vor:

    • Ersetzen Sie INSERT-AUTHORITY-HERE durch den Namen des Mandanten, in dem Sie Ihre Anwendung bereitgestellt haben. Das Format muss https://login.microsoftonline.com/contoso.onmicrosoft.com sein. Dieser Wert kann im Tab „Domäne“ in Ihrem Azure Active Directory im Azure-Portal kopiert werden.
    • Ersetzen Sie INSERT-RESOURCE-ID-HERE durch die Client-ID für Ihr mobiles App-Back-End. Sie können die Client-ID über die Registerkarte "Erweitert " unter "Azure Active Directory-Einstellungen " im Portal abrufen.
    • Ersetzen Sie INSERT-CLIENT-ID-HERE durch die Client-ID, die Sie aus der systemeigenen Clientanwendung kopiert haben.
    • Ersetzen Sie INSERT-REDIRECT-URI-HERE durch den /.auth/login/done-Endpunkt Ihrer Website, indem Sie das HTTPS-Schema verwenden. Dieser Wert sollte https://contoso.azurewebsites.net/.auth/login/done ähnlich sein.

Objective-C:

#import <ADALiOS/ADAuthenticationContext.h>
#import <ADALiOS/ADAuthenticationSettings.h>
// ...
- (void) authenticate:(UIViewController*) parent
            completion:(void (^) (MSUser*, NSError*))completionBlock;
{
    NSString *authority = @"INSERT-AUTHORITY-HERE";
    NSString *resourceId = @"INSERT-RESOURCE-ID-HERE";
    NSString *clientId = @"INSERT-CLIENT-ID-HERE";
    NSURL *redirectUri = [[NSURL alloc]initWithString:@"INSERT-REDIRECT-URI-HERE"];
    ADAuthenticationError *error;
    ADAuthenticationContext *authContext = [ADAuthenticationContext authenticationContextWithAuthority:authority error:&error];
    authContext.parentController = parent;
    [ADAuthenticationSettings sharedInstance].enableFullScreen = YES;
    [authContext acquireTokenWithResource:resourceId
                                    clientId:clientId
                                redirectUri:redirectUri
                            completionBlock:^(ADAuthenticationResult *result) {
                                if (result.status != AD_SUCCEEDED)
                                {
                                    completionBlock(nil, result.error);;
                                }
                                else
                                {
                                    NSDictionary *payload = @{
                                                            @"access_token" : result.tokenCacheStoreItem.accessToken
                                                            };
                                    [client loginWithProvider:@"aad" token:payload completion:completionBlock];
                                }
                            }];
}

Swift:

// add the following imports to your bridging header:
//        #import <ADALiOS/ADAuthenticationContext.h>
//        #import <ADALiOS/ADAuthenticationSettings.h>

func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
    let authority = "INSERT-AUTHORITY-HERE"
    let resourceId = "INSERT-RESOURCE-ID-HERE"
    let clientId = "INSERT-CLIENT-ID-HERE"
    let redirectUri = NSURL(string: "INSERT-REDIRECT-URI-HERE")
    var error: AutoreleasingUnsafeMutablePointer<ADAuthenticationError?> = nil
    let authContext = ADAuthenticationContext(authority: authority, error: error)
    authContext.parentController = parent
    ADAuthenticationSettings.sharedInstance().enableFullScreen = true
    authContext.acquireTokenWithResource(resourceId, clientId: clientId, redirectUri: redirectUri) { (result) in
            if result.status != AD_SUCCEEDED {
                completion(nil, result.error)
            }
            else {
                let payload: [String: String] = ["access_token": result.tokenCacheStoreItem.accessToken]
                client.loginWithProvider("aad", token: payload, completion: completion)
            }
        }
}

Vorgehensweise: Authentifizieren von Benutzern mit dem Facebook SDK für iOS

Sie können das Facebook SDK für iOS verwenden, um Benutzer mit Facebook bei Ihrer Anwendung anzumelden. Die Verwendung einer Clientflussauthentifizierung ist der Verwendung der loginWithProvider:completion: Methode vorzuziehen. Die Authentifizierung im Clientfluss bietet ein natürlicheres UX-Erlebnis und ermöglicht zusätzliche Anpassungen.

  1. Konfigurieren Sie Ihr mobiles App-Back-End für die Facebook-Anmeldung, indem Sie dem Lernprogramm zum Konfigurieren des App-Diensts für Facebook folgen .

  2. Installieren Sie das Facebook SDK für iOS, indem Sie dem Facebook SDK für iOS folgen – Dokumentation "Erste Schritte ". Anstatt eine App zu erstellen, können Sie ihrer vorhandenen Registrierung die iOS-Plattform hinzufügen.

  3. Facebooks Dokumentation enthält einigen Objective-C-Code im App-Delegat. Wenn Sie Swift verwenden, können Sie die folgenden Übersetzungen für AppDelegate.swift verwenden:

    // Add the following import to your bridging header:
    //        #import <FBSDKCoreKit/FBSDKCoreKit.h>
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
        // Add any custom logic here.
        return true
    }
    
    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
        let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
        // Add any custom logic here.
        return handled
    }
    
  4. Fügen Sie zusätzlich zum Hinzufügen von FBSDKCoreKit.framework zu Ihrem Projekt auch auf die gleiche Weise einen Verweis auf FBSDKLoginKit.framework hinzu.

  5. Fügen Sie Ihrer Anwendung gemäß der verwendeten Sprache den folgenden Code hinzu.

    Objective-C:

    #import <FBSDKLoginKit/FBSDKLoginKit.h>
    #import <FBSDKCoreKit/FBSDKAccessToken.h>
    // ...
    - (void) authenticate:(UIViewController*) parent
                completion:(void (^) (MSUser*, NSError*)) completionBlock;
    {
        FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
        [loginManager
            logInWithReadPermissions: @[@"public_profile"]
            fromViewController:parent
            handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                if (error) {
                    completionBlock(nil, error);
                } else if (result.isCancelled) {
                    completionBlock(nil, error);
                } else {
                    NSDictionary *payload = @{
                                            @"access_token":result.token.tokenString
                                            };
                    [client loginWithProvider:@"facebook" token:payload completion:completionBlock];
                }
            }];
    }
    

    Swift:

    // Add the following imports to your bridging header:
    //        #import <FBSDKLoginKit/FBSDKLoginKit.h>
    //        #import <FBSDKCoreKit/FBSDKAccessToken.h>
    
    func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
        let loginManager = FBSDKLoginManager()
        loginManager.logInWithReadPermissions(["public_profile"], fromViewController: parent) { (result, error) in
            if (error != nil) {
                completion(nil, error)
            }
            else if result.isCancelled {
                completion(nil, error)
            }
            else {
                let payload: [String: String] = ["access_token": result.token.tokenString]
                client.loginWithProvider("facebook", token: payload, completion: completion)
            }
        }
    }
    

Vorgehensweise: Authentifizieren von Benutzern mit Twitter Fabric für iOS

Sie können Fabric für iOS verwenden, um Benutzer mit Twitter bei Ihrer Anwendung anzumelden. Die Client-Flow-Authentifizierung ist der Verwendung der loginWithProvider:completion: Methode vorzuziehen, da sie ein nativeres UX-Erlebnis bietet und zusätzliche Anpassungen ermöglicht.

  1. Konfigurieren Sie Ihr mobiles App-Back-End für die Twitter-Anmeldung, indem Sie dem Lernprogramm zum Konfigurieren von App Service für Twitter folgen .

  2. Fügen Sie Fabric zu Ihrem Projekt hinzu, indem Sie der Dokumentation "Fabric für iOS – Erste Schritte " folgen und TwitterKit einrichten.

    Hinweis

    Standardmäßig erstellt Fabric eine Twitter-Anwendung für Sie. Sie können das Erstellen einer Anwendung vermeiden, indem Sie den Zuvor erstellten Consumer Key und Consumer Secret registrieren, indem Sie die folgenden Codeausschnitte verwenden. Alternativ können Sie die Werte "Consumer Key" und "Consumer Secret" ersetzen, die Sie für App Service bereitstellen, durch die Werte, die im Fabric-Dashboard angezeigt werden. Wenn Sie diese Option auswählen, stellen Sie sicher, dass Sie die Rückruf-URL auf einen Platzhalterwert festlegen, z https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback. B. .

    Wenn Sie die zuvor erstellten geheimen Schlüssel verwenden möchten, fügen Sie Ihrem App-Delegaten den folgenden Code hinzu:

    Objective-C:

    #import <Fabric/Fabric.h>
    #import <TwitterKit/TwitterKit.h>
    // ...
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [[Twitter sharedInstance] startWithConsumerKey:@"your_key" consumerSecret:@"your_secret"];
        [Fabric with:@[[Twitter class]]];
        // Add any custom logic here.
        return YES;
    }
    

    Swift:

    import Fabric
    import TwitterKit
    // ...
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        Twitter.sharedInstance().startWithConsumerKey("your_key", consumerSecret: "your_secret")
        Fabric.with([Twitter.self])
        // Add any custom logic here.
        return true
    }
    
  3. Fügen Sie Ihrer Anwendung gemäß der verwendeten Sprache den folgenden Code hinzu.

    Objective-C:

    #import <TwitterKit/TwitterKit.h>
    // ...
    - (void)authenticate:(UIViewController*)parent completion:(void (^) (MSUser*, NSError*))completionBlock
    {
        [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
            if (session) {
                NSDictionary *payload = @{
                                            @"access_token":session.authToken,
                                            @"access_token_secret":session.authTokenSecret
                                        };
                [client loginWithProvider:@"twitter" token:payload completion:completionBlock];
            } else {
                completionBlock(nil, error);
            }
        }];
    }
    

    Swift:

    import TwitterKit
    // ...
    func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
        let client = self.table!.client
        Twitter.sharedInstance().logInWithCompletion { session, error in
            if (session != nil) {
                let payload: [String: String] = ["access_token": session!.authToken, "access_token_secret": session!.authTokenSecret]
                client.loginWithProvider("twitter", token: payload, completion: completion)
            } else {
                completion(nil, error)
            }
        }
    }
    

Vorgehensweise: Authentifizieren von Benutzern mit dem Google Sign-In SDK für iOS

Sie können das Google Sign-In SDK für iOS verwenden, um Benutzer mit einem Google-Konto bei Ihrer Anwendung anzumelden. Google hat kürzlich Änderungen an ihren OAuth-Sicherheitsrichtlinien angekündigt. Diese Richtlinienänderungen erfordern die Nutzung des Google SDK in Zukunft.

  1. Konfigurieren Sie Ihr mobiles App-Back-End für die Google-Anmeldung, indem Sie dem Lernprogramm zum Konfigurieren des App-Diensts für Google folgen .

  2. Installieren Sie das Google SDK für iOS, indem Sie der Google-Sign-In für iOS – Integration starten Dokumentation folgen. Sie können den Abschnitt "Authentifizieren mit einem Back-End-Server" überspringen.

  3. Fügen Sie Folgendes zur Methode des Delegaten signIn:didSignInForUser:withError: hinzu, entsprechend der verwendeten Sprache.

    Objective-C:

    NSDictionary *payload = @{
                                @"id_token":user.authentication.idToken,
                                @"authorization_code":user.serverAuthCode
                                };
    
    [client loginWithProvider:@"google" token:payload completion:^(MSUser *user, NSError *error) {
        // ...
    }];
    

    Swift:

    let payload: [String: String] = ["id_token": user.authentication.idToken, "authorization_code": user.serverAuthCode]
    client.loginWithProvider("google", token: payload) { (user, error) in
        // ...
    }
    
  4. Stellen Sie sicher, dass Sie auch das Folgende zu application:didFinishLaunchingWithOptions: in Ihrem App-Delegierten hinzufügen, indem Sie "SERVER_CLIENT_ID" durch dieselbe ID ersetzen, die Sie zum Konfigurieren des App-Service in Schritt 1 verwendet haben.

    Objective-C:

    [GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";
    

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Fügen Sie Ihrer Anwendung den folgenden Code in einem UIViewController hinzu, der das GIDSignInUIDelegate Protokoll gemäß der verwendeten Sprache implementiert. Sie sind vor der erneuten Anmeldung abgemeldet, und obwohl Sie Ihre Anmeldeinformationen nicht erneut eingeben müssen, wird ein Zustimmungsdialogfeld angezeigt. Rufen Sie diese Methode nur auf, wenn das Sitzungstoken abgelaufen ist.

    Objective-C:

    #import <Google/SignIn.h>
    // ...
    - (void)authenticate
    {
            [GIDSignIn sharedInstance].uiDelegate = self;
            [[GIDSignIn sharedInstance] signOut];
            [[GIDSignIn sharedInstance] signIn];
    }
    

    Swift:

    // ...
    func authenticate() {
        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().signOut()
        GIDSignIn.sharedInstance().signIn()
    }