Jak používat klientskou knihovnu pro iOS pro Azure Mobile Apps

Přehled

Tato příručka vás naučí provádět běžné scénáře pomocí nejnovější sady Azure Mobile Apps SDK pro iOS. Pokud s Azure Mobile Apps teprve začínáte, nejprve dokončete rychlý start azure Mobile Apps a vytvořte back-end, vytvořte tabulku a stáhněte si předem vytvořený projekt IOS Xcode. V této příručce se zaměříme na sadu SDK na straně klienta. Další informace o sadě SDK na straně serveru pro back-end najdete v tématu Postupy sad SDK serveru.

Referenční dokumentace

Referenční dokumentace ke klientské sadě SDK pro iOS najdete tady: Referenční informace ke klientovi Azure Mobile Apps pro iOS.

Podporované platformy

Sada iOS SDK podporuje projekty Objective-C, projekty Swift 2.2 a projekty Swift 2.3 pro iOS verze 8.0 nebo novější.

Ověřování "server-flow" používá pro prezentované uživatelské rozhraní WebView. Pokud zařízení nemůže prezentovat uživatelské rozhraní WebView, je vyžadována jiná metoda ověřování, která je mimo rozsah produktu. Tato sada SDK proto není vhodná pro zařízení typu Watch nebo podobně omezená.

Nastavení a požadavky

Tato příručka předpokládá, že jste vytvořili back-end s tabulkou. Tato příručka předpokládá, že tabulka má stejné schéma jako tabulky v těchto kurzech. Tato příručka také předpokládá, že v kódu odkazujete MicrosoftAzureMobile.framework a importujete MicrosoftAzureMobile/MicrosoftAzureMobile.h.

Postupy: Vytvoření klienta

Pokud chcete v projektu získat přístup k back-endu Azure Mobile Apps, vytvořte soubor MSClient. Nahraďte AppUrl adresou URL aplikace. Můžete odejít gatewayURLString a applicationKey vyprázdnit. Pokud nastavíte bránu pro ověřování, naplníte gatewayURLString adresou URL brány.

Objective-C:

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

Swift:

let client = MSClient(applicationURLString: "AppUrl")

Postupy: Vytvoření odkazu na tabulku

Pro přístup k datům a jejich aktualizaci vytvořte odkaz na back-endovou tabulku. Nahraďte TodoItem názvem vaší tabulky.

Objective-C:

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

Swift:

let table = client.tableWithName("TodoItem")

Postupy: Dotazování na data

Pokud chcete vytvořit databázový dotaz, zadejte dotaz na MSTable objekt. Následující dotaz získá všechny položky a TodoItem zaprotokoluje text každé položky.

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

Postupy: Filtrování vrácených dat

Pokud chcete filtrovat výsledky, existuje mnoho dostupných možností.

Chcete-li filtrovat pomocí predikátu, použijte a NSPredicatereadWithPredicate. Následující filtry vrátily data, aby našly jenom neúplné položky úkolů.

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

Postupy: Použití MSQuery

Pokud chcete provést složitý dotaz (včetně řazení a stránkování), vytvořte MSQuery objekt přímo nebo pomocí predikátu:

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 umožňuje řídit několik chování dotazů.

  • Určení pořadí výsledků
  • Omezit, která pole se mají vrátit
  • Omezení počtu vrácených záznamů
  • Určení celkového počtu v odpovědi
  • Zadání vlastních parametrů řetězce dotazu v požadavku
  • Použití dalších funkcí

MSQuery Spusťte dotaz voláním readWithCompletion objektu.

Postupy: Řazení dat pomocí MSQuery

Pokud chcete výsledky seřadit, podívejme se na příklad. Pokud chcete řadit podle pole text vzestupně, pak podle "complete" sestupně, vyvoláte MSQuery takto:

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

Postupy: Omezení polí a rozbalení parametrů řetězce dotazu pomocí MSQuery

Chcete-li omezit pole, která mají být vrácena v dotazu, zadejte názvy polí ve vlastnosti selectFields . Tento příklad vrátí pouze textová a dokončená pole:

Objective-C:

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

Swift:

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

Pokud chcete do požadavku serveru zahrnout další parametry řetězce dotazu (například proto, že je používá vlastní skript na straně serveru), vyplňte query.parameters je takto:

Objective-C:

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

Swift:

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

Postupy: Konfigurace velikosti stránky

Velikost stránky v Azure Mobile Apps řídí počet záznamů, které se najednou načítají z back-endových tabulek. Volání pull dat pak vysáhnou data na základě této velikosti stránky, dokud nebudou k dispozici žádné další záznamy, které by bylo potřeba načíst.

Velikost stránky je možné nakonfigurovat pomocí msPullSettings , jak je znázorněno níže. Výchozí velikost stránky je 50 a následující příklad ho změní na 3.

Z důvodů výkonu můžete nakonfigurovat jinou velikost stránky. Pokud máte velký počet malých datových záznamů, vysoká velikost stránky zmenšuje počet odezvy serveru.

Toto nastavení řídí pouze velikost stránky na straně klienta. Pokud klient požádá o větší velikost stránky, než podporuje back-end Mobile Apps, je velikost stránky omezena na maximální velikost back-endu, která je nakonfigurovaná tak, aby podporovala.

Toto nastavení je také počet datových záznamů, nikoli velikost bajtu.

Pokud zvětšíte velikost stránky klienta, měli byste také zvětšit velikost stránky na serveru. Postup najdete v tématu Postupy: Úprava velikosti stránkování tabulky .

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

Postupy: Vložení dat

Chcete-li vložit nový řádek tabulky, vytvořte NSDictionary a vyvoláte table insert. Pokud je povolené dynamické schéma, Azure App Service mobilní back-end automaticky vygeneruje nové sloupce na NSDictionaryzákladě .

Pokud id není k dispozici, back-end automaticky vygeneruje nové jedinečné ID. Jako ID zadejte vlastní id e-mailové adresy, uživatelská jména nebo vlastní hodnoty. Poskytnutí vlastního ID může usnadnit spojení a logiku databáze orientované na firmu.

Obsahuje result novou položku, která byla vložena. V závislosti na logice serveru může mít další nebo upravená data v porovnání s tím, co bylo předáno serveru.

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

Postupy: Úprava dat

Pokud chcete aktualizovat existující řádek, upravte položku a volání update:

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

Případně zadejte ID řádku a aktualizované pole:

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

Při provádění aktualizací musí být atribut nastaven minimálně id .

Postupy: Odstranění dat

Pokud chcete odstranit položku, vyvoláte delete ji s položkou:

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

Případně můžete odstranit zadáním ID řádku:

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

Při odstraňování musí být atribut nastaven minimálně id .

Postupy: Volání vlastního rozhraní API

Pomocí vlastního rozhraní API můžete zveřejnit všechny funkce back-endu. Nemusí se namapovat na operaci tabulky. Nejen že získáte větší kontrolu nad zasíláním zpráv, můžete dokonce číst nebo nastavit hlavičky a změnit formát textu odpovědi.

Pokud chcete volat vlastní rozhraní API, zavolejte .MSClient.invokeAPI Obsah požadavku a odpovědi se považuje za JSON. Chcete-li použít jiné typy médií, použijte jiné přetížení invokeAPI. Pokud chcete vytvořit GET požadavek místo POST požadavku, nastavte parametr HTTPMethod na "GET" hodnotu a parametr body na nil (protože požadavky GET nemají tělo zpráv.) Pokud vaše vlastní rozhraní API podporuje další příkazy HTTP, změňte HTTPMethod je odpovídajícím způsobem.

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

Postupy: Registrace nabízených šablon pro odesílání oznámení mezi platformami

Pokud chcete zaregistrovat šablony, předejte šablony pomocí metody client.push registerDeviceToken v klientské aplikaci.

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

Vaše šablony jsou typu NSDictionary a mohou obsahovat více šablon v následujícím formátu:

Objective-C:

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

Swift:

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

Všechny značky jsou odstraněny z žádosti o zabezpečení. Pokud chcete přidat značky do instalací nebo šablon v rámci instalací, přečtěte si téma Práce se sadou SDK back-endového serveru .NET pro Azure Mobile Apps. Pokud chcete odesílat oznámení pomocí těchto registrovaných šablon, pracujte s rozhraními API Notification Hubs.

Postupy: Zpracování chyb

Při volání Azure App Service mobilního back-endu obsahuje NSError blok dokončení parametr. Pokud dojde k chybě, tento parametr není nil. V kódu byste měli zkontrolovat tento parametr a podle potřeby zpracovat chybu, jak je znázorněno v předchozích fragmentech kódu.

<WindowsAzureMobileServices/MSError.h> Soubor definuje konstanty MSErrorResponseKey, MSErrorRequestKeya MSErrorServerItemKey. Získání dalších dat souvisejících s chybou:

Objective-C:

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

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

Kromě toho soubor definuje konstanty pro každý kód chyby:

Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

Postupy: Ověřování uživatelů pomocí knihovny Active Directory Authentication Library

Knihovnu ADAL (Active Directory Authentication Library) můžete použít k přihlášení uživatelů k aplikaci pomocí Azure Active Directory. Ověřování toku klienta pomocí sady SDK zprostředkovatele identity je vhodnější použít metodu loginWithProvider:completion: . Ověřování toku klienta poskytuje nativní uživatelské prostředí a umožňuje další přizpůsobení.

  1. Nakonfigurujte back-end mobilní aplikace pro přihlášení AAD podle postupu konfigurace App Service pro přihlášení ke službě Active Directory. Nezapomeňte dokončit volitelný krok registrace nativní klientské aplikace. Pro iOS doporučujeme, aby identifikátor URI přesměrování byl ve formuláři <app-scheme>://<bundle-id>. Další informace najdete v rychlém startu k ADAL pro iOS.

  2. Nainstalujte ADAL pomocí Cocoapods. Upravte soubor Podfile tak, aby obsahoval následující definici a nahraďte VÁŠ-PROJECT názvem projektu Xcode:

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

    a pod:

     pod 'ADALiOS'
    
  3. Pomocí terminálu spusťte pod install z adresáře obsahujícího váš projekt a otevřete vygenerovaný pracovní prostor Xcode (ne projekt).

  4. Do aplikace přidejte následující kód podle jazyka, který používáte. V každém z nich proveďte tyto nahrazení:

    • Nahraďte INSERT-AUTHORITY-HERE názvem tenanta, ve kterém jste aplikaci zřídili. Formát by měl být https://login.microsoftonline.com/contoso.onmicrosoft.com. Tuto hodnotu můžete zkopírovat z karty Doména ve službě Azure Active Directory v Azure Portal.
    • Nahraďte INSERT-RESOURCE-ID-HERE ID klienta back-endu mobilní aplikace. ID klienta můžete získat na kartě Upřesnit v části Nastavení služby Azure Active Directory na portálu.
    • Nahraďte INSERT-CLIENT-ID-HERE ID klienta, které jste zkopírovali z nativní klientské aplikace.
    • Nahraďte INSERT-REDIRECT-URI-HERE koncovým bodem /.auth/login/done vašeho webu pomocí schématu HTTPS. Tato hodnota by měla být podobná https://contoso.azurewebsites.net/.auth/login/done.

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

Postupy: Ověřování uživatelů pomocí sady Facebook SDK pro iOS

K přihlášení uživatelů k aplikaci pomocí Facebooku můžete použít sadu Sdk pro iOS. Použití ověřování toku klienta je vhodnější než použití loginWithProvider:completion: metody. Ověřování toku klienta poskytuje nativní uživatelské prostředí a umožňuje další přizpůsobení.

  1. Nakonfigurujte back-end mobilní aplikace pro přihlášení k Facebooku podle postupu konfigurace App Service pro přihlášení k Facebooku.

  2. Nainstalujte sadu Facebook SDK pro iOS podle sady Facebook SDK pro iOS – Začínáme dokumentaci. Místo vytváření aplikace můžete k existující registraci přidat platformu pro iOS.

  3. Dokumentace k Facebooku obsahuje kód Objective-C v delegátovi aplikace. Pokud používáte Swift, můžete použít následující překlady pro 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. Kromě přidání FBSDKCoreKit.framework do projektu také přidejte odkaz FBSDKLoginKit.framework stejným způsobem.

  5. Do aplikace přidejte následující kód podle jazyka, který používáte.

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

Postupy: Ověřování uživatelů pomocí Twitter Fabric pro iOS

Prostředky infrastruktury pro iOS můžete použít k přihlášení uživatelů k aplikaci pomocí Twitteru. Ověřování toku klienta je vhodnější použít metodu loginWithProvider:completion: , protože poskytuje nativní uživatelské prostředí a umožňuje další přizpůsobení.

  1. Nakonfigurujte back-end mobilní aplikace pro přihlášení k Twitteru podle postupu konfigurace App Service pro přihlášení k Twitteru.

  2. Přidejte do projektu prostředky infrastruktury pro iOS – Začínáme dokumentaci a nastavení TwitterKitu.

    Poznámka

    Fabric pro vás ve výchozím nastavení vytvoří aplikaci Twitter. Vytvoření aplikace se můžete vyhnout registrací klíče příjemce a tajného kódu, který jste vytvořili dříve, pomocí následujících fragmentů kódu. Alternativně můžete nahradit hodnoty Consumer Key a Consumer Secret, které zadáte pro App Service hodnotami, které vidíte na řídicím panelu Prostředků infrastruktury. Pokud zvolíte tuto možnost, nezapomeňte nastavit adresu URL zpětného volání na hodnotu zástupného symbolu, například https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    Pokud se rozhodnete použít tajné kódy, které jste vytvořili dříve, přidejte do delegáta aplikace následující kód:

    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. Do aplikace přidejte následující kód podle jazyka, který používáte.

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

Postupy: Ověřování uživatelů pomocí sady Google Sign-In SDK pro iOS

Pomocí sady Google Sign-In SDK pro iOS můžete uživatele přihlásit k aplikaci pomocí účtu Google. Google nedávno oznámil změny svých zásad zabezpečení OAuth. Tyto změny zásad budou v budoucnu vyžadovat použití sady Google SDK.

  1. Nakonfigurujte back-end mobilní aplikace pro přihlášení Google podle postupu konfigurace App Service pro přihlášení Google.

  2. Nainstalujte sadu Google SDK pro iOS podle google Sign-In pro iOS – Začněte integrovat dokumentaci. Část Ověření pomocí back-endového serveru můžete přeskočit.

  3. Do metody delegáta signIn:didSignInForUser:withError: přidejte následující kód podle jazyka, který používáte.

    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. Ujistěte se, že do delegáta aplikace přidáte následující application:didFinishLaunchingWithOptions: položky a nahradíte "SERVER_CLIENT_ID" stejným ID, které jste použili ke konfiguraci App Service v kroku 1.

    Objective-C:

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

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Do aplikace přidejte následující kód v UIViewController, který implementuje GIDSignInUIDelegate protokol podle jazyka, který používáte. Před opětovným přihlášením jste odhlasováni a i když znovu nemusíte zadávat přihlašovací údaje, zobrazí se dialogové okno souhlasu. Tuto metodu zavolejte pouze v případě, že vypršela platnost tokenu relace.

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