Jak używać biblioteki klienta systemu iOS dla usługi Azure Mobile Apps

Omówienie

Ten przewodnik zawiera instrukcje dotyczące wykonywania typowych scenariuszy przy użyciu najnowszego zestawu SDK systemu iOS usługi Azure Mobile Apps. Jeśli dopiero zaczynasz korzystać z usługi Azure Mobile Apps, najpierw ukończ przewodnik Szybki start dotyczący usługi Azure Mobile Apps , aby utworzyć zaplecze, utworzyć tabelę i pobrać wstępnie utworzony projekt Xcode systemu iOS. W tym przewodniku skoncentrujemy się na zestawie SDK systemu iOS po stronie klienta. Aby dowiedzieć się więcej na temat zestawu SDK po stronie serwera dla zaplecza, zobacz Instrukcje dotyczące zestawu SDK serwera.

Dokumentacja referencyjna

Dokumentacja referencyjna zestawu SDK klienta systemu iOS znajduje się tutaj: Dokumentacja klienta usługi Azure Mobile Apps dla systemu iOS.

Obsługiwane platformy

Zestaw SDK systemu iOS obsługuje projekty Objective-C, projekty Swift 2.2 i projekty Swift 2.3 dla systemu iOS w wersji 8.0 lub nowszej.

Uwierzytelnianie "server-flow" używa elementu WebView dla prezentowanego interfejsu użytkownika. Jeśli urządzenie nie może przedstawić interfejsu użytkownika elementu WebView, wymagana jest inna metoda uwierzytelniania spoza zakresu produktu. W związku z tym ten zestaw SDK nie jest odpowiedni dla urządzeń typu watch lub podobnie ograniczonych.

Konfiguracja i wymagania wstępne

W tym przewodniku założono, że utworzono zaplecze z tabelą. W tym przewodniku przyjęto założenie, że tabela ma ten sam schemat co tabele w tych samouczkach. W tym przewodniku założono również, że w kodzie odwołujesz się MicrosoftAzureMobile.framework do elementu i importujesz MicrosoftAzureMobile/MicrosoftAzureMobile.hplik .

Instrukcje: tworzenie klienta

Aby uzyskać dostęp do zaplecza usługi Azure Mobile Apps w projekcie, utwórz element MSClient. Zastąp AppUrl element adresem URL aplikacji. Możesz pozostawić gatewayURLString i applicationKey opróżnić. Jeśli skonfigurujesz bramę na potrzeby uwierzytelniania, wypełnij gatewayURLString adres URL bramy.

Cel-C:

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

Swift:

let client = MSClient(applicationURLString: "AppUrl")

Instrukcje: tworzenie odwołania do tabeli

Aby uzyskać dostęp do danych lub je zaktualizować, utwórz odwołanie do tabeli zaplecza. Zastąp ciąg TodoItem nazwą tabeli

Cel-C:

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

Swift:

let table = client.tableWithName("TodoItem")

Instrukcje: wykonywanie zapytań o dane

Aby utworzyć zapytanie bazy danych, wykonaj zapytanie dotyczące MSTable obiektu . Poniższe zapytanie pobiera wszystkie elementy w TodoItem elemencie i rejestruje tekst każdego elementu.

Cel-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"])
        }
    }
}

Instrukcje: filtrowanie zwróconych danych

Aby filtrować wyniki, dostępnych jest wiele opcji.

Aby filtrować przy użyciu predykatu, użyj elementu i NSPredicatereadWithPredicate. Następujące filtry zwróciły dane, aby znaleźć tylko niekompletne elementy zadań do wykonania.

Cel-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"])
        }
    }
}

Instrukcje: korzystanie z zapytania MSQuery

Aby wykonać złożone zapytanie (w tym sortowanie i stronicowanie), utwórz MSQuery obiekt bezpośrednio lub przy użyciu predykatu:

Cel-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 umożliwia kontrolowanie kilku zachowań zapytań.

  • Określanie kolejności wyników
  • Ogranicz, które pola mają być zwracane
  • Ogranicz liczbę rekordów do zwrócenia
  • Określanie łącznej liczby w odpowiedzi
  • Określanie niestandardowych parametrów ciągu zapytania w żądaniu
  • Stosowanie dodatkowych funkcji

MSQuery Wykonaj zapytanie, wywołując readWithCompletion obiekt .

Instrukcje: sortowanie danych za pomocą zapytania MSQuery

Aby posortować wyniki, przyjrzyjmy się przykładowi. Aby posortować według pola "text" rosnąco, a następnie według "complete" malejąco, wywołaj MSQuery polecenie w następujący sposób:

Cel-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"])
        }
    }
}

Instrukcje: ograniczanie pól i rozszerzanie parametrów ciągu zapytania przy użyciu zapytania MSQuery

Aby ograniczyć zwracanie pól w zapytaniu, określ nazwy pól we właściwości selectFields . W tym przykładzie zwracany jest tylko tekst i wypełnione pola:

Cel-C:

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

Swift:

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

Aby uwzględnić dodatkowe parametry ciągu zapytania w żądaniu serwera (na przykład ze względu na użycie niestandardowego skryptu po stronie serwera), wypełnij je query.parameters w następujący sposób:

Cel-C:

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

Swift:

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

Instrukcje: konfigurowanie rozmiaru strony

W usłudze Azure Mobile Apps rozmiar strony steruje liczbą rekordów pobieranych w czasie z tabel zaplecza. Wywołanie pull danych spowoduje następnie utworzenie partii danych na podstawie tego rozmiaru strony, dopóki nie będzie więcej rekordów do ściągnięcia.

Rozmiar strony można skonfigurować przy użyciu funkcji MSPullSettings , jak pokazano poniżej. Domyślny rozmiar strony to 50, a poniższy przykład zmienia go na 3.

Ze względu na wydajność można skonfigurować inny rozmiar strony. Jeśli masz dużą liczbę małych rekordów danych, duży rozmiar strony zmniejsza liczbę rund serwera.

To ustawienie steruje tylko rozmiarem strony po stronie klienta. Jeśli klient prosi o większy rozmiar strony niż obsługuje zaplecze usługi Mobile Apps, rozmiar strony jest ograniczony do maksymalnej liczby skonfigurowanych zaplecza do obsługi.

To ustawienie jest również liczbą rekordów danych, a nie rozmiarem bajtu.

W przypadku zwiększenia rozmiaru strony klienta należy również zwiększyć rozmiar strony na serwerze. Zobacz "Instrukcje: dostosowywanie rozmiaru stronicowania tabeli" , aby zapoznać się z krokami, które należy wykonać.

Cel-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)
    }
}

Instrukcje: Wstawianie danych

Aby wstawić nowy wiersz tabeli, utwórz element i wywołaj metodę NSDictionarytable insert. Jeśli schemat dynamiczny jest włączony, zaplecze mobilne Azure App Service automatycznie generuje nowe kolumny na podstawie .NSDictionary

Jeśli id nie zostanie podana, zaplecze automatycznie wygeneruje nowy unikatowy identyfikator. Podaj własne id , aby używać adresów e-mail, nazw użytkowników lub własnych wartości niestandardowych jako identyfikatora. Podanie własnego identyfikatora może ułatwić sprzężenia i logikę bazy danych zorientowaną na działalność biznesową.

Zawiera result nowy element, który został wstawiony. W zależności od logiki serwera może zawierać dodatkowe lub zmodyfikowane dane w porównaniu z danymi przekazanymi do serwera.

Cel-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"])
    }
}

Instrukcje: modyfikowanie danych

Aby zaktualizować istniejący wiersz, zmodyfikuj element i wywołaj polecenie update:

Cel-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"])
        }
    })
}

Alternatywnie podaj identyfikator wiersza i zaktualizowane pole:

Cel-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"])
    }
}

Atrybut musi być ustawiony co najmniej id podczas wprowadzania aktualizacji.

Instrukcje: usuwanie danych

Aby usunąć element, wywołaj element delete za pomocą elementu:

Cel-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)
    }
}

Możesz też usunąć, podając identyfikator wiersza:

Cel-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)
    }
}

Atrybut musi być ustawiony co najmniej id podczas usuwania.

Instrukcje: wywoływanie niestandardowego interfejsu API

Za pomocą niestandardowego interfejsu API można uwidocznić wszelkie funkcje zaplecza. Nie musi mapować na operację tabeli. Nie tylko zyskujesz większą kontrolę nad wiadomościami, możesz nawet odczytywać/ustawiać nagłówki i zmieniać format treści odpowiedzi.

Aby wywołać niestandardowy interfejs API, wywołaj metodę MSClient.invokeAPI. Zawartość żądania i odpowiedzi są traktowane jako dane JSON. Aby użyć innych typów multimediów, użyj innego przeciążenia elementu invokeAPI. Aby wysłać GET żądanie zamiast POST żądania, ustaw parametr HTTPMethod na i parametr body na "GET"nil (ponieważ żądania GET nie mają treści komunikatów). Jeśli niestandardowy interfejs API obsługuje inne czasowniki HTTP, zmień HTTPMethod odpowiednio.

Cel-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
                }
        }

Instrukcje: rejestrowanie szablonów wypychanych w celu wysyłania powiadomień międzyplatformowych

Aby zarejestrować szablony, przekaż szablony za pomocą metody client.push RegisterDeviceToken w aplikacji klienckiej.

Cel-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)
    }
})

Szablony są typu NSDictionary i mogą zawierać wiele szablonów w następującym formacie:

Cel-C:

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

Swift:

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

Wszystkie tagi są usuwane z żądania zabezpieczeń. Aby dodać tagi do instalacji lub szablonów w ramach instalacji, zobacz Praca z zestawem SDK serwera zaplecza platformy .NET dla usługi Azure Mobile Apps. Aby wysyłać powiadomienia przy użyciu tych zarejestrowanych szablonów, należy pracować z interfejsami API usługi Notification Hubs.

Instrukcje: obsługa błędów

Po wywołaniu zaplecza Azure App Service mobilnego blok uzupełniania zawiera NSError parametr . Gdy wystąpi błąd, ten parametr jest inny niż zero. W kodzie należy sprawdzić ten parametr i obsługiwać błąd zgodnie z potrzebami, jak pokazano w poprzednich fragmentach kodu.

Plik <WindowsAzureMobileServices/MSError.h> definiuje stałe MSErrorResponseKey, MSErrorRequestKeyi MSErrorServerItemKey. Aby uzyskać więcej danych związanych z błędem:

Cel-C:

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

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

Ponadto plik definiuje stałe dla każdego kodu błędu:

Cel-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

Instrukcje: uwierzytelnianie użytkowników za pomocą biblioteki uwierzytelniania usługi Active Directory

Bibliotekę uwierzytelniania usługi Active Directory (ADAL) można użyć do logowania użytkowników do aplikacji przy użyciu usługi Azure Active Directory. Uwierzytelnianie przepływu klienta przy użyciu zestawu SDK dostawcy tożsamości jest preferowane przy użyciu loginWithProvider:completion: metody . Uwierzytelnianie przepływu klienta zapewnia bardziej natywny sposób działania środowiska użytkownika i umożliwia dodatkowe dostosowanie.

  1. Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania do usługi AAD, postępując zgodnie z samouczkiem Jak skonfigurować App Service na potrzeby logowania do usługi Active Directory. Pamiętaj, aby ukończyć opcjonalny krok rejestrowania natywnej aplikacji klienckiej. W przypadku systemu iOS zalecamy, aby identyfikator URI przekierowania był w postaci <app-scheme>://<bundle-id>. Aby uzyskać więcej informacji, zobacz przewodnik Szybki start dotyczący biblioteki ADAL dla systemu iOS.

  2. Zainstaluj bibliotekę ADAL przy użyciu narzędzia Cocoapods. Edytuj plik Podfile, aby uwzględnić następującą definicję, zastępując ciąg YOUR-PROJECT nazwą projektu Xcode:

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

    i zasobnik:

     pod 'ADALiOS'
    
  3. Za pomocą terminalu uruchom polecenie pod install z katalogu zawierającego projekt, a następnie otwórz wygenerowany obszar roboczy programu Xcode (a nie projekt).

  4. Dodaj następujący kod do aplikacji zgodnie z używanym językiem. W każdym z nich należy wykonać następujące zamiany:

    • Zastąp ciąg INSERT-AUTHORITY-HERE nazwą dzierżawy, w której zainicjowano obsługę administracyjną aplikacji. Format powinien mieć wartość https://login.microsoftonline.com/contoso.onmicrosoft.com. Tę wartość można skopiować z karty Domena w usłudze Azure Active Directory w Azure Portal.
    • Zastąp ciąg INSERT-RESOURCE-ID-HERE identyfikatorem klienta zaplecza aplikacji mobilnej. Identyfikator klienta można uzyskać z karty Zaawansowane w obszarze Ustawienia usługi Azure Active Directory w portalu.
    • Zastąp ciąg INSERT-CLIENT-ID-HERE identyfikatorem klienta skopiowanym z natywnej aplikacji klienckiej.
    • Zastąp ciąg INSERT-REDIRECT-URI-HERE punktem końcowym /.auth/login/done witryny przy użyciu schematu HTTPS. Ta wartość powinna być podobna do https://contoso.azurewebsites.net/.auth/login/done.

Cel-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)
            }
        }
}

Instrukcje: uwierzytelnianie użytkowników za pomocą zestawu Sdk usługi Facebook dla systemu iOS

Zestaw SDK usługi Facebook dla systemu iOS umożliwia logowanie użytkowników do aplikacji przy użyciu usługi Facebook. Użycie uwierzytelniania przepływu klienta jest preferowane przy użyciu loginWithProvider:completion: metody . Uwierzytelnianie przepływu klienta zapewnia bardziej natywny sposób działania środowiska użytkownika i umożliwia dodatkowe dostosowanie.

  1. Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania do serwisu Facebook, wykonując czynności opisane w samouczku How to configure App Service for Facebook login (Jak skonfigurować App Service na potrzeby logowania do serwisu Facebook).

  2. Zainstaluj zestaw Facebook SDK dla systemu iOS, postępując zgodnie z dokumentacją zestawu Sdk usługi Facebook dla systemu iOS — Wprowadzenie. Zamiast tworzyć aplikację, możesz dodać platformę systemu iOS do istniejącej rejestracji.

  3. Dokumentacja serwisu Facebook zawiera kod Objective-C w delegatu aplikacji. Jeśli używasz języka Swift, możesz użyć następujących tłumaczeń dla elementu AppDelegate.swift:

    // 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. Oprócz dodawania FBSDKCoreKit.framework do projektu dodaj również odwołanie do FBSDKLoginKit.framework elementu w taki sam sposób.

  5. Dodaj następujący kod do aplikacji zgodnie z używanym językiem.

    Cel-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)
            }
        }
    }
    

Instrukcje: uwierzytelnianie użytkowników za pomocą usługi Twitter Fabric dla systemu iOS

Usługa Fabric dla systemu iOS umożliwia logowanie użytkowników do aplikacji przy użyciu usługi Twitter. Uwierzytelnianie przepływu klienta jest preferowane przy użyciu loginWithProvider:completion: metody, ponieważ zapewnia bardziej natywny sposób działania środowiska użytkownika i umożliwia dodatkowe dostosowanie.

  1. Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania w usłudze Twitter, postępując zgodnie z samouczkiem How to configure App Service for Twitter login (Jak skonfigurować App Service na potrzeby logowania do usługi Twitter).

  2. Dodaj sieć szkieletową do projektu, postępując zgodnie z dokumentacją fabric for iOS — Wprowadzenie i konfigurując zestaw TwitterKit.

    Uwaga

    Domyślnie sieć szkieletowa tworzy aplikację twitterową. Możesz uniknąć tworzenia aplikacji, rejestrując wcześniej utworzony klucz klienta i wpis tajny użytkownika przy użyciu poniższych fragmentów kodu. Alternatywnie możesz zastąpić wartości Klucz klienta i Klucz tajny klienta podane w celu App Service wartościami widocznymi na pulpicie nawigacyjnym sieci szkieletowej. Jeśli wybierzesz tę opcję, pamiętaj, aby ustawić adres URL wywołania zwrotnego na wartość symbolu zastępczego, taką jak https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    Jeśli zdecydujesz się użyć utworzonych wcześniej wpisów tajnych, dodaj następujący kod do delegata aplikacji:

    Cel-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. Dodaj następujący kod do aplikacji zgodnie z używanym językiem.

    Cel-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)
            }
        }
    }
    

Instrukcje: uwierzytelnianie użytkowników za pomocą zestawu Google Sign-In SDK dla systemu iOS

Zestaw Google Sign-In SDK dla systemu iOS umożliwia logowanie użytkowników do aplikacji przy użyciu konta Google. Firma Google ogłosiła niedawno zmiany w zasadach zabezpieczeń OAuth. Te zmiany zasad będą wymagać użycia zestawu Google SDK w przyszłości.

  1. Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania google, postępując zgodnie z samouczkiem How to configure App Service for Google login tutorial (Jak skonfigurować App Service na potrzeby logowania google).

  2. Zainstaluj zestaw Google SDK dla systemu iOS, postępując zgodnie z dokumentacją dotyczącą usługi Google Sign-In dla systemu iOS — rozpocznij integrowanie . Możesz pominąć sekcję "Uwierzytelnianie przy użyciu serwera zaplecza".

  3. Dodaj następujące elementy do metody delegata signIn:didSignInForUser:withError: , zgodnie z używanym językiem.

    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. Upewnij się również, że w delegowaniu aplikacji dodano następujące application:didFinishLaunchingWithOptions: elementy, zastępując ciąg "SERVER_CLIENT_ID" tym samym identyfikatorem, który został użyty do skonfigurowania App Service w kroku 1.

    Objective-C:

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

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Dodaj następujący kod do aplikacji w interfejsie UIViewController, który implementuje GIDSignInUIDelegate protokół zgodnie z używanym językiem. Użytkownik jest wylogowany przed ponownym zalogowaniem, a mimo że nie musisz ponownie wprowadzać poświadczeń, zostanie wyświetlone okno dialogowe zgody. Wywołaj tę metodę tylko wtedy, gdy token sesji wygasł.

    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()
    }