iOS-clientbibliotheek gebruiken voor Azure Mobile Apps

Overzicht

In deze handleiding leert u algemene scenario's uit te voeren met behulp van de nieuwste Azure Mobile Apps iOS SDK. Als u nog geen gebruik maakt van Azure Mobile Apps, voltooit u eerst de Quick Start van Azure Mobile Apps om een back-end te maken, maakt u een tabel en downloadt u een vooraf gebouwd iOS Xcode-project. In deze handleiding richten we ons op de iOS SDK aan de clientzijde. Zie de HOWTOs voor server-SDK voor meer informatie over de SDK aan de serverzijde voor de back-end.

Referentiedocumentatie

De referentiedocumentatie voor de iOS-client-SDK bevindt zich hier: Azure Mobile Apps iOS-clientreferentie.

Ondersteunde platformen

De iOS SDK ondersteunt Objective-C-projecten, Swift 2.2-projecten en Swift 2.3-projecten voor iOS-versies 8.0 of hoger.

De verificatie 'serverstroom' maakt gebruik van een WebView voor de gepresenteerde gebruikersinterface. Als het apparaat geen WebView-gebruikersinterface kan presenteren, is een andere verificatiemethode vereist die buiten het bereik van het product valt. Deze SDK is dus niet geschikt voor watch-type of vergelijkbare beperkte apparaten.

Installatie en vereisten

In deze handleiding wordt ervan uitgegaan dat u een back-end met een tabel hebt gemaakt. In deze handleiding wordt ervan uitgegaan dat de tabel hetzelfde schema heeft als de tabellen in deze zelfstudies. In deze handleiding wordt ook ervan uitgegaan dat u in uw code verwijst MicrosoftAzureMobile.framework en importeert MicrosoftAzureMobile/MicrosoftAzureMobile.h.

Procedure: Client maken

Als u toegang wilt krijgen tot een back-end van Azure Mobile Apps in uw project, maakt u een MSClient. Vervang AppUrl deze door de URL van de app. U mag weggaan en applicationKey leeg zijngatewayURLString. Als u een gateway instelt voor verificatie, vult u gatewayURLString de gateway-URL in.

Objective-C:

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

Swift:

let client = MSClient(applicationURLString: "AppUrl")

Procedure: Tabelreferentie maken

Maak een verwijzing naar de back-endtabel als u gegevens wilt bekijken of bijwerken. Vervang TodoItem door de naam van uw tabel

Objective-C:

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

Swift:

let table = client.tableWithName("TodoItem")

Procedure: query's uitvoeren op gegevens

Als u een databasequery wilt maken, voert u een query uit op het MSTable object. De volgende query haalt alle items in TodoItem en registreert de tekst van elk item.

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

Procedure: Geretourneerde gegevens filteren

Als u resultaten wilt filteren, zijn er veel beschikbare opties.

Als u wilt filteren met een predicaat, gebruikt u een NSPredicate en readWithPredicate. Met de volgende filters worden gegevens geretourneerd om alleen onvolledige taken te vinden.

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

Procedure: MSQuery gebruiken

Als u een complexe query wilt uitvoeren (inclusief sorteren en pageren), maakt u een MSQuery object rechtstreeks of met behulp van een predicaat:

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 hiermee kunt u verschillende querygedrag beheren.

  • Volgorde van resultaten opgeven
  • Beperken welke velden moeten worden geretourneerd
  • Beperken hoeveel records moeten worden geretourneerd
  • Totaalaantal in antwoord opgeven
  • Aangepaste queryreeksparameters opgeven in aanvraag
  • Aanvullende functies toepassen

Voer een MSQuery query uit door het object aan te roepen readWithCompletion .

Procedure: Gegevens sorteren met MSQuery

Laten we een voorbeeld bekijken om resultaten te sorteren. Als u wilt sorteren op veld 'tekst' oplopend en vervolgens op aflopend ' voltooid', roept u MSQuery als volgt aan:

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

Procedure: Velden beperken en queryreeksparameters uitbreiden met MSQuery

Als u wilt beperken dat velden worden geretourneerd in een query, geeft u de namen op van de velden in de eigenschap selectFields . In dit voorbeeld worden alleen de tekst- en voltooide velden geretourneerd:

Objective-C:

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

Swift:

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

Als u aanvullende queryreeksparameters wilt opnemen in de serveraanvraag (bijvoorbeeld omdat een aangepast script aan de serverzijde deze gebruikt), vult query.parameters u als volgt:

Objective-C:

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

Swift:

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

Procedure: Paginaformaat configureren

Met Azure Mobile Apps bepaalt het paginaformaat het aantal records dat tegelijk uit de back-endtabellen wordt opgehaald. Bij een aanroep naar pull gegevens worden vervolgens gegevens in batches opgeslagen, op basis van dit paginaformaat, totdat er geen records meer zijn om op te halen.

Het is mogelijk om een paginaformaat te configureren met behulp van MSPullSettings , zoals hieronder wordt weergegeven. Het standaardpaginaformaat is 50 en in het onderstaande voorbeeld wordt dit gewijzigd in 3.

U kunt om prestatieredenen een ander paginaformaat configureren. Als u een groot aantal kleine gegevensrecords hebt, vermindert een groot paginaformaat het aantal retouren van de server.

Met deze instelling bepaalt u alleen het paginaformaat aan de clientzijde. Als de client vraagt om een groter paginaformaat dan de back-end van Mobile Apps ondersteunt, wordt het paginaformaat beperkt tot het maximum dat de back-end is geconfigureerd voor ondersteuning.

Deze instelling is ook het aantal gegevensrecords, niet de bytegrootte.

Als u het paginaformaat van de client vergroot, moet u ook het paginaformaat op de server vergroten. Zie 'Procedure: De grootte van de tabelpaginering aanpassen' voor de stappen om dit te doen.

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

Procedure: Gegevens invoegen

Als u een nieuwe tabelrij wilt invoegen, maakt u een NSDictionary en roept u deze aan table insert. Als dynamisch schema is ingeschakeld, genereert de Azure App Service mobiele back-end automatisch nieuwe kolommen op basis van de NSDictionary.

Als id dit niet wordt opgegeven, genereert de back-end automatisch een nieuwe unieke id. Geef uw eigen id e-mailadressen, gebruikersnamen of uw eigen aangepaste waarden op als id. Door uw eigen id op te geven, kunnen joins en bedrijfsgerichte databaselogica gemakkelijker worden gemaakt.

Het result bevat het nieuwe item dat is ingevoegd. Afhankelijk van uw serverlogica kunnen er aanvullende of gewijzigde gegevens zijn vergeleken met wat is doorgegeven aan de server.

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

Procedure: Gegevens wijzigen

Als u een bestaande rij wilt bijwerken, wijzigt u een item en roept u het volgende updateaan:

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

U kunt ook de rij-id en het bijgewerkte veld opgeven:

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

Het kenmerk moet minimaal worden ingesteld bij het id maken van updates.

Procedure: Gegevens verwijderen

Als u een item wilt verwijderen, roept u delete het item aan:

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

U kunt ook verwijderen door een rij-id op te geven:

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

Het kenmerk moet minimaal worden ingesteld bij het id maken van verwijderingen.

Procedure: Aangepaste API aanroepen

Met een aangepaste API kunt u elke back-endfunctionaliteit beschikbaar maken. Het hoeft niet toe te wijzen aan een tabelbewerking. Niet alleen krijgt u meer controle over berichten, u kunt zelfs kopteksten lezen/instellen en de indeling van de antwoordtekst wijzigen.

Als u een aangepaste API wilt aanroepen, roept u aan MSClient.invokeAPI. De inhoud van de aanvraag en het antwoord wordt behandeld als JSON. Als u andere mediatypen wilt gebruiken, gebruikt u de andere overbelasting van invokeAPI. Als u een GET aanvraag wilt indienen in plaats van een POST aanvraag, stelt u de parameter HTTPMethod"GET" in op en parameter body op nil (omdat GET-aanvragen geen berichtteksten hebben.) Als uw aangepaste API ondersteuning biedt voor andere HTTP-woorden, wijzigt u HTTPMethod deze op de juiste manier.

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

Procedure: Pushsjablonen registreren om platformoverschrijdende meldingen te verzenden

Als u sjablonen wilt registreren, geeft u sjablonen door met de methode client.push registerDeviceToken in uw 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)
    }
})

Uw sjablonen zijn van het type NSDictionary en kunnen meerdere sjablonen in de volgende indeling bevatten:

Objective-C:

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

Swift:

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

Alle tags worden verwijderd uit de aanvraag voor beveiliging. Zie Werken met de SDK voor .NET-back-endservers voor Azure Mobile Apps om tags toe te voegen aan installaties of sjablonen binnen installaties. Als u meldingen wilt verzenden met behulp van deze geregistreerde sjablonen, werkt u met Notification Hubs-API's.

Procedure: Fouten verwerken

Wanneer u een Azure App Service mobiele back-end aanroept, bevat het voltooiingsblok een NSError parameter. Wanneer er een fout optreedt, is deze parameter niet-nul. In uw code moet u deze parameter controleren en de fout zo nodig afhandelen, zoals wordt weergegeven in de voorgaande codefragmenten.

Het bestand <WindowsAzureMobileServices/MSError.h> definieert de constanten MSErrorResponseKeyen MSErrorRequestKeyMSErrorServerItemKey. Meer gegevens met betrekking tot de fout ophalen:

Objective-C:

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

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

Daarnaast definieert het bestand constanten voor elke foutcode:

Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

Procedure: Gebruikers verifiëren met de Active Directory-verificatiebibliotheek

U kunt de Active Directory Authentication Library (ADAL) gebruiken om gebruikers aan te melden bij uw toepassing met behulp van Azure Active Directory. Verificatie van clientstromen met behulp van een ID-provider-SDK verdient de voorkeur aan het gebruik van de loginWithProvider:completion: methode. Clientstroomverificatie biedt een meer systeemeigen UX-gevoel en biedt extra aanpassingen.

  1. Configureer de back-end van uw mobiele app voor AAD-aanmelding door de zelfstudie App Service configureren voor Active Directory-aanmelding. Zorg ervoor dat u de optionele stap voor het registreren van een systeemeigen clienttoepassing voltooit. Voor iOS raden we aan dat de omleidings-URI van het formulier <app-scheme>://<bundle-id>is. Zie de quickstart voor ADAL iOS voor meer informatie.

  2. Installeer ADAL met Cocoapods. Bewerk uw Podfile om de volgende definitie op te nemen, waarbij u YOUR-PROJECT vervangt door de naam van uw Xcode-project:

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

    en de pod:

     pod 'ADALiOS'
    
  3. Voer de Terminal uit pod install vanuit de map met uw project en open vervolgens de gegenereerde Xcode-werkruimte (niet het project).

  4. Voeg de volgende code toe aan uw toepassing, afhankelijk van de taal die u gebruikt. Breng in elk van deze vervangingen de volgende vervangingen aan:

    • Vervang INSERT-AUTHORITY-HERE door de naam van de tenant waarin u uw toepassing hebt ingericht. De indeling moet zijn https://login.microsoftonline.com/contoso.onmicrosoft.com. Deze waarde kan worden gekopieerd van het tabblad Domein in uw Azure Active Directory in de Azure Portal.
    • Vervang INSERT-RESOURCE-ID-HERE door de client-id voor de back-end van uw mobiele app. U kunt de client-id ophalen op het tabblad Geavanceerd onder Azure Active Directory-instellingen in de portal.
    • Vervang INSERT-CLIENT-ID-HERE door de client-id die u hebt gekopieerd uit de systeemeigen clienttoepassing.
    • Vervang INSERT-REDIRECT-URI-HERE door het eindpunt /.auth/login/done van uw site met behulp van het HTTPS-schema. Deze waarde moet vergelijkbaar zijn met 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)
            }
        }
}

Procedure: Gebruikers verifiëren met de Facebook SDK voor iOS

U kunt de Facebook SDK voor iOS gebruiken om gebruikers aan te melden bij uw toepassing met behulp van Facebook. Het gebruik van een clientstroomverificatie verdient de voorkeur aan het gebruik van de loginWithProvider:completion: methode. De verificatie van de clientstroom biedt een meer systeemeigen UX-gevoel en maakt extra aanpassingen mogelijk.

  1. Configureer de back-end van uw mobiele app voor Facebook-aanmelding door de zelfstudie App Service configureren voor Aanmelding bij Facebook te volgen.

  2. Installeer de Facebook SDK voor iOS door de Facebook SDK voor iOS te volgen Aan de slag documentatie. In plaats van een app te maken, kunt u het iOS-platform toevoegen aan uw bestaande registratie.

  3. De documentatie van Facebook bevat enkele Objective-C-code in de App Delegate. Als u Swift gebruikt, kunt u de volgende vertalingen voor AppDelegate.swift gebruiken:

    // 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. Naast het toevoegen FBSDKCoreKit.framework aan uw project, voegt u ook op dezelfde manier een verwijzing toe FBSDKLoginKit.framework .

  5. Voeg de volgende code toe aan uw toepassing, afhankelijk van de taal die u gebruikt.

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

Procedure: Gebruikers verifiëren met Twitter Fabric voor iOS

U kunt Fabric voor iOS gebruiken om gebruikers aan te melden bij uw toepassing via Twitter. Client Flow-verificatie verdient de voorkeur aan het gebruik van de loginWithProvider:completion: methode, omdat deze een systeemeigen UX-gevoel biedt en extra aanpassingen mogelijk maakt.

  1. Configureer de back-end van uw mobiele app voor Twitter-aanmelding door de zelfstudie App Service configureren voor Twitter-aanmelding te volgen.

  2. Voeg Fabric toe aan uw project door de Documentatie voor Fabric voor iOS te volgen Aan de slag en TwitterKit in te stellen.

    Notitie

    Fabric maakt standaard een Twitter-toepassing voor u. U kunt voorkomen dat u een toepassing maakt door het consumentensleutel- en consumentengeheim te registreren dat u eerder hebt gemaakt met behulp van de volgende codefragmenten. U kunt ook de waarden voor consumentensleutels en consumentengeheimen die u opgeeft, vervangen door App Service door de waarden die u ziet in het Infrastructuurdashboard. Als u deze optie kiest, moet u de callback-URL instellen op een tijdelijke aanduiding, zoals https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    Als u ervoor kiest om de geheimen te gebruiken die u eerder hebt gemaakt, voegt u de volgende code toe aan uw app-gemachtigde:

    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. Voeg de volgende code toe aan uw toepassing, afhankelijk van de taal die u gebruikt.

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

Procedure: Gebruikers verifiëren met de Google Sign-In SDK voor iOS

U kunt de Google Sign-In SDK voor iOS gebruiken om gebruikers aan te melden bij uw toepassing met behulp van een Google-account. Google heeft onlangs wijzigingen aangekondigd in hun OAuth-beveiligingsbeleid. Voor deze beleidswijzigingen is het gebruik van de Google SDK in de toekomst vereist.

  1. Configureer de back-end van uw mobiele app voor Google-aanmelding door de zelfstudie App Service configureren voor Google-aanmelding te volgen.

  2. Installeer de Google SDK voor iOS door de Google Sign-In voor iOS te volgen: begin met het integreren van documentatie. U kunt de sectie Verifiëren met een back-endserver overslaan.

  3. Voeg het volgende toe aan de methode van signIn:didSignInForUser:withError: uw gedelegeerde, afhankelijk van de taal die u gebruikt.

    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. Zorg ervoor dat u ook het volgende toevoegt aan application:didFinishLaunchingWithOptions: uw app-gemachtigde, waarbij u 'SERVER_CLIENT_ID' vervangt door dezelfde id die u hebt gebruikt om App Service in stap 1 te configureren.

    Objective-C:

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

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Voeg de volgende code toe aan uw toepassing in een UIViewController waarmee het GIDSignInUIDelegate protocol wordt geïmplementeerd, volgens de taal die u gebruikt. U bent afgemeld voordat u opnieuw bent aangemeld en hoewel u uw referenties niet opnieuw hoeft in te voeren, ziet u een toestemmingsdialoogvenster. Roep deze methode alleen aan wanneer het sessietoken is verlopen.

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