Utilisation de la bibliothèque cliente iOS pour Azure Mobile AppsHow to Use iOS Client Library for Azure Mobile Apps

Notes

Visual Studio App Center investit dans des services nouveaux et intégrés, essentiels au développement d’applications mobiles.Visual Studio App Center is investing in new and integrated services central to mobile app development. Les développeurs peuvent utiliser les services Build, Test et Distribute pour configurer le pipeline de livraison et d’intégration continues.Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. Une fois l’application déployée, les développeurs peuvent superviser l’état et l’utilisation de leur application à l’aide des services Analytics et Diagnostics, puis interagir avec les utilisateurs à l’aide du service Push.Once the app is deployed, developers can monitor the status and usage of their app using the Analytics and Diagnostics services, and engage with users using the Push service. Les développeurs peuvent aussi utiliser Auth pour authentifier leurs utilisateurs ainsi que le service Data pour conserver et synchroniser les données d’application dans le cloud.Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud. Découvrez App Center dès aujourd’hui.Check out App Center today.

Vue d'ensembleOverview

Ce guide indique le déroulement de scénarios courants dans le cadre de l’utilisation du dernier SDK iOS Azure Mobile Apps.This guide teaches you to perform common scenarios using the latest Azure Mobile Apps iOS SDK. Si vous ne connaissez pas Azure Mobile Apps, consultez d’abord la section Démarrage rapide d’Azure Mobile Apps pour créer un backend, créer une table et télécharger un projet Xcode iOS prédéfini.If you are new to Azure Mobile Apps, first complete Azure Mobile Apps Quick Start to create a backend, create a table, and download a pre-built iOS Xcode project. Dans ce guide, nous nous concentrons sur le SDK iOS côté client.In this guide, we focus on the client-side iOS SDK. Pour en savoir plus sur le Kit de développement logiciel (SDK) côté serveur, consultez les procédures du SDK Server.To learn more about the server-side SDK for the backend, see the Server SDK HOWTOs.

Documentation de référenceReference documentation

La documentation de référence du SDK du client iOS se trouve ici : Informations de référence sur le client iOS Azure Mobile Apps.The reference documentation for the iOS client SDK is located here: Azure Mobile Apps iOS Client Reference.

Plateformes prises en chargeSupported Platforms

Le Kit de développement logiciel (SDK) iOS prend en charge les projets Objective-C, Swift 2.2 et Swift 2.3 pour iOS 8.0 ou versions ultérieures.The iOS SDK supports Objective-C projects, Swift 2.2 projects, and Swift 2.3 projects for iOS versions 8.0 or later.

L’authentification « serveur flux » utilise un mode d’affichage WebView pour l’interface utilisateur présentée.The "server-flow" authentication uses a WebView for the presented UI. Si l’appareil n’est pas en mesure de présenter une interface utilisateur WebView, une autre méthode d’authentification est alors nécessaire, ce qui sort du cadre de ce produit.If the device is not able to present a WebView UI, then another method of authentication is required that is outside the scope of the product.
Ce SDK ne convient donc pas au type Watch ou d’autres appareils restreints similaires.This SDK is thus not suitable for Watch-type or similarly restricted devices.

Configuration et conditions préalablesSetup and Prerequisites

Ce guide part du principe que vous avez créé un serveur principal avec une table.This guide assumes that you have created a backend with a table. Ce guide suppose que la table a le même schéma que les tables dans ces didacticiels.This guide assumes that the table has the same schema as the tables in those tutorials. Ce guide suppose également que dans votre code, vous référencez MicrosoftAzureMobile.framework et importez MicrosoftAzureMobile/MicrosoftAzureMobile.h.This guide also assumes that in your code, you reference MicrosoftAzureMobile.framework and import MicrosoftAzureMobile/MicrosoftAzureMobile.h.

Procédure : Créer un clientHow to: Create Client

Pour accéder à un backend Azure Mobile Apps dans votre projet, créez un MSClient.To access an Azure Mobile Apps backend in your project, create an MSClient. Remplacez AppUrl par l’URL de l’application.Replace AppUrl with the app URL. Vous pouvez laisser gatewayURLString et applicationKey vides.You may leave gatewayURLString and applicationKey empty. Si vous avez configuré une passerelle pour l’authentification, renseignez gatewayURLString avec l’URL de la passerelle.If you set up a gateway for authentication, populate gatewayURLString with the gateway URL.

Objective-C:Objective-C:

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

Swift:Swift:

let client = MSClient(applicationURLString: "AppUrl")

Procédure : Créer une référence de tableHow to: Create Table Reference

Pour accéder aux données ou les mettre à jour, créez une référence à la table principale.To access or update data, create a reference to the backend table. Remplacez TodoItem par le nom de votre table.Replace TodoItem with the name of your table

Objective-C:Objective-C:

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

Swift:Swift:

let table = client.tableWithName("TodoItem")

Procédure : Données de requêteHow to: Query Data

Pour créer une requête de base de données, interrogez l'objet MSTable .To create a database query, query the MSTable object. La requête suivante obtient tous les éléments dans TodoItem et enregistre le texte de chaque élément.The following query gets all the items in TodoItem and logs the text of each item.

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

Procédure : Filtrer les données renvoyéesHow to: Filter Returned Data

Pour filtrer les résultats, il existe de nombreuses options.To filter results, there are many available options.

Pour filtrer à l'aide d'un prédicat, utilisez un NSPredicate et readWithPredicate.To filter using a predicate, use an NSPredicate and readWithPredicate. Les filtres suivants retournent des données pour rechercher uniquement les éléments Todo incomplets.The following filters returned data to find only incomplete Todo items.

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

Procédure : Utiliser MSQueryHow to: Use MSQuery

Pour effectuer une requête complexe (y compris le tri et la pagination), créez un objet MSQuery , directement ou en utilisant un prédicat :To perform a complex query (including sorting and paging), create an MSQuery object, directly or by using a predicate:

Objective-C:Objective-C:

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

Swift:Swift:

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

MSQuery vous permet de contrôler plusieurs comportements de requête.MSQuery lets you control several query behaviors.

  • Spécifier l’ordre des résultatsSpecify order of results
  • Limiter les champs à renvoyerLimit which fields to return
  • Limiter le nombre d’enregistrements à renvoyerLimit how many records to return
  • Spécifier le nombre total dans la réponseSpecify total count in response
  • Spécifier des paramètres de chaîne de requête personnalisés dans la requêteSpecify custom query string parameters in request
  • Appliquer des fonctions supplémentairesApply additional functions

Exécutez une requête MSQuery en appelant readWithCompletion sur l’objet.Execute an MSQuery query by calling readWithCompletion on the object.

Procédure : Trier des données avec MSQueryHow to: Sort Data with MSQuery

Pour trier les résultats, examinons un exemple.To sort results, let's look at an example. Pour trier selon le champ ’text’ par ordre croissant, puis selon ’complete’ par ordre décroissant, vous devez appeler MSQuery , comme suit :To sort by field 'text' ascending, then by 'complete' descending, invoke MSQuery like so:

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

Procédure : Limiter les champs et développer les paramètres de chaîne de requête avec MSQueryHow to: Limit Fields and Expand Query String Parameters with MSQuery

Pour limiter les champs à retourner dans une requête, spécifiez les noms des champs dans la propriété selectFields .To limit fields to be returned in a query, specify the names of the fields in the selectFields property. Cet exemple renvoie uniquement les champs text et completed :This example returns only the text and completed fields:

Objective-C:Objective-C:

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

Swift:Swift:

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

Pour inclure des paramètres de chaîne de requête supplémentaires dans la demande serveur (par exemple, si un script côté serveur personnalisé les utilise), remplissez query.parameters comme suit :To include additional query string parameters in the server request (for example, because a custom server-side script uses them), populate query.parameters like so:

Objective-C:Objective-C:

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

Swift:Swift:

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

Procédure : Configurer le format de pageHow to: Configure Page Size

Avec Azure Mobile Apps, le format de page contrôle le nombre d’enregistrements extraits à la fois des tables du backend.With Azure Mobile Apps, the page size controls the number of records that are pulled at a time from the backend tables. Un appel des données pull entraînerait la création de lots de données en fonction du format de page, jusqu'à ce qu’il n’y a plus aucun enregistrement à extraire.A call to pull data would then batch up data, based on this page size, until there are no more records to pull.

Il est possible de configurer un format de page à l’aide de MSPullSettings comme indiqué ci-dessous.It's possible to configure a page size using MSPullSettings as shown below. Le format de page par défaut est 50, et il est paramétré dans l’exemple ci-dessous sur 3.The default page size is 50, and the example below changes it to 3.

Vous pouvez configurer un autre format de page pour des raisons de performances.You could configure a different page size for performance reasons. Si vous avez un grand nombre d’enregistrements de données de petite taille, une taille de page élevée permet de réduire le nombre d’allers-retours avec le serveur.If you have a large number of small data records, a high page size reduces the number of server round-trips.

Ce paramètre contrôle uniquement le format de page côté client.This setting controls only the page size on the client side. Si le client demande un format de page plus grand que le backend Mobile Apps prend en charge, le format de page est limitée à la valeur maximale que configurée prise en charge par le serveur.If the client asks for a larger page size than the Mobile Apps backend supports, the page size is capped at the maximum the backend is configured to support.

Ce paramètre correspond également au nombre d’enregistrements de données, non à la taille en octets.This setting is also the number of data records, not the byte size.

Si vous augmentez le format de page côté client, vous devez également augmenter le format de page sur le serveur.If you increase the client page size, you should also increase the page size on the server. Consultez « Procédure : Ajuster la taille de pagination des tables » pour connaître les étapes à suivre.See "How to: Adjust the table paging size" for the steps to do this.

Objective-C: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:Swift:

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

Procédure : Insérer des donnéesHow to: Insert Data

Pour insérer une nouvelle ligne de table, créez un NSDictionary et appelez table insert.To insert a new table row, create a NSDictionary and invoke table insert. Si le schéma dynamique est activé, le backend mobile Azure App Service génère automatiquement de nouvelles colonnes basées sur le NSDictionary.If Dynamic Schema is enabled, the Azure App Service mobile backend automatically generates new columns based on the NSDictionary.

Si id n'est pas fourni, le backend génère automatiquement un nouvel ID unique.If id is not provided, the backend automatically generates a new unique ID. Fournissez votre propre id pour utiliser les adresses de messagerie électronique, les noms d'utilisateurs, ou vos propres valeurs personnalisées sous la forme d'ID.Provide your own id to use email addresses, usernames, or your own custom values as ID. Fournir son propre ID peut faciliter les jointures et la logique de base de données orientée métier.Providing your own ID may ease joins and business-oriented database logic.

L’élément result contient le nouvel élément qui a été inséré.The result contains the new item that was inserted. Selon la logique du serveur, il peut afficher des données supplémentaires ou modifiées par rapport à ce qui a été transmis au serveur.Depending on your server logic, it may have additional or modified data compared to what was passed to the server.

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

Procédure : Modifier des donnéesHow to: Modify Data

Pour mettre à jour une ligne existante, modifiez un élément et appelez update:To update an existing row, modify an item and call update:

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

Vous pouvez également fournir l'ID de la ligne et le champ mis à jour :Alternatively, supply the row ID and the updated field:

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

Au minimum, l'attribut id doit être défini quand vous effectuez des mises à jour.At minimum, the id attribute must be set when making updates.

Procédure : Supprimer des donnéesHow to: Delete Data

Pour supprimer un élément, appelez delete avec l'élément :To delete an item, invoke delete with the item:

Objective-C:Objective-C:

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

Swift:Swift:

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

Vous pouvez également effectuer la suppression en fournissant un ID de ligne :Alternatively, delete by providing a row ID:

Objective-C: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:Swift:

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

Au minimum, l'attribut id doit être défini quand vous effectuez des suppressions.At minimum, the id attribute must be set when making deletes.

Procédure : Appeler une API personnaliséeHow to: Call Custom API

Une API personnalisée vous permet d’exposer toutes les fonctionnalités du serveur principal.With a custom API, you can expose any backend functionality. Il n’est pas nécessaire de la mapper à une opération de table.It doesn't have to map to a table operation. Non seulement vous avez davantage de contrôle sur la messagerie, mais vous pouvez également lire/définir des en-têtes et modifier le format du corps de réponse.Not only do you gain more control over messaging, you can even read/set headers and change the response body format.

Pour appeler une API personnalisée, appelez MSClient.invokeAPI.To call a custom API, call MSClient.invokeAPI. Le contenu de la requête et de la réponse est traité au format JSON.The request and response content are treated as JSON. Pour utiliser d’autres types de média, utilisez l’autre surcharge de invokeAPI.To use other media types, use the other overload of invokeAPI. Pour exécuter une requête GET à la place d’une requête POST, définissez le paramètre HTTPMethod sur "GET" et le paramètre body sur nil (étant donné que les requêtes GET ne comportent pas de corps de message). Si votre API personnalisée prend en charge les autres verbes HTTP, modifiez HTTPMethod en conséquence.To make a GET request instead of a POST request, set parameter HTTPMethod to "GET" and parameter body to nil (since GET requests do not have message bodies.) If your custom API supports other HTTP verbs, change HTTPMethod appropriately.

Objective-C: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: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
                }
        }

Procédure : Inscrire des modèles Push pour envoyer des notifications multiplateformeHow to: Register push templates to send cross-platform notifications

Pour inscrire des modèles, transmettez-les avec votre méthode client.push registerDeviceToken dans votre application cliente.To register templates, pass templates with your client.push registerDeviceToken method in your client app.

Objective-C:Objective-C:

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

Swift:Swift:

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

Vos modèles sont de type NSDictionary et peuvent contenir plusieurs modèles au format suivant :Your templates are of type NSDictionary and can contain multiple templates in the following format:

Objective-C:Objective-C:

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

Swift:Swift:

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

Toutes les balises sont supprimées de la demande pour des raisons de sécurité.All tags are stripped from the request for security. Pour ajouter des balises à des installations ou des modèles dans des installations, consultez Utiliser le Kit de développement logiciel (SDK) de serveur principal .NET pour Azure Mobile Apps.To add tags to installations or templates within installations, see Work with the .NET backend server SDK for Azure Mobile Apps. Pour envoyer des notifications à l’aide de ces modèles inscrits, utilisez les API Notification Hubs.To send notifications using these registered templates, work with Notification Hubs APIs.

Procédure : Gérer les erreursHow to: Handle Errors

Quand vous appelez un backend mobile Azure App Service, le bloc completion contient un paramètre NSError .When you call an Azure App Service mobile backend, the completion block contains an NSError parameter. Si une erreur se produit, ce paramètre est non-nil.When an error occurs, this parameter is non-nil. Vous devez vérifier ce paramètre dans votre code et gérer les erreurs, le cas échéant, comme indiqué dans les extraits de code précédents.In your code, you should check this parameter and handle the error as needed, as demonstrated in the preceding code snippets.

Le fichier <WindowsAzureMobileServices/MSError.h> définit les constantes MSErrorResponseKey, MSErrorRequestKey et MSErrorServerItemKey.The file <WindowsAzureMobileServices/MSError.h> defines the constants MSErrorResponseKey, MSErrorRequestKey, and MSErrorServerItemKey. Pour obtenir plus d’informations sur l’erreur :To get more data related to the error:

Objective-C:Objective-C:

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

Swift:Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

En outre, le fichier définit des constantes pour chaque code d'erreur :In addition, the file defines constants for each error code:

Objective-C:Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:Swift:

if (error.code == MSErrorPreconditionFailed) {

Procédure : Authentifier des utilisateurs avec la bibliothèque ADAL (Active Directory Authentication Library)How to: Authenticate users with the Active Directory Authentication Library

Vous pouvez utiliser la bibliothèque d’authentification Active Directory (ADAL) pour authentifier des utilisateurs dans votre application à l’aide d’Azure Active Directory.You can use the Active Directory Authentication Library (ADAL) to sign users into your application using Azure Active Directory. L’authentification par flux client à l’aide d’un SDK de fournisseur d’identité est préférable à l’utilisation de la méthode loginWithProvider:completion: .Client flow authentication using an identity provider SDK is preferable to using the loginWithProvider:completion: method. L’authentification par client flux offre une interface UX native plus simple et permet une personnalisation supplémentaire.Client flow authentication provides a more native UX feel and allows for additional customization.

  1. Si vous souhaitez configurer le backend de votre application mobile pour utiliser la connexion AAD, suivez le didacticiel Configurer votre application App Service pour utiliser la connexion Azure Active Directory .Configure your mobile app backend for AAD sign-in by following the How to configure App Service for Active Directory login tutorial. Bien que cette étape soit facultative, veillez à inscrire une application cliente native.Make sure to complete the optional step of registering a native client application. Pour iOS, il est recommandé d’utiliser une URI de redirection de type <app-scheme>://<bundle-id>.For iOS, we recommend that the redirect URI is of the form <app-scheme>://<bundle-id>. Pour plus d’informations, consultez le démarrage rapide d’ADAL pour iOS.For more information, see the ADAL iOS quickstart.

  2. Installez la bibliothèque ADAL à l’aide de Cocoapods.Install ADAL using Cocoapods. Modifiez votre podfile pour inclure la définition suivante, en remplaçant YOUR-PROJECT par le nom de votre projet Xcode :Edit your Podfile to include the following definition, replacing YOUR-PROJECT with the name of your Xcode project:

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

    et le pod :and the Pod:

     pod 'ADALiOS'
    
  3. À l’aide du Terminal, exécutez pod install à partir du répertoire contenant votre projet, puis ouvrez l’espace de travail Xcode généré (et non le projet).Using the Terminal, run pod install from the directory containing your project, and then open the generated Xcode workspace (not the project).

  4. Ajoutez le code suivant à votre application, en fonction du langage utilisé.Add the following code to your application, according to the language you are using. Vérifiez à chaque fois ces remplacements :In each, make these replacements:

    • Remplacez INSERT-AUTHORITY-HERE par le nom du client dans lequel vous avez approvisionné votre application.Replace INSERT-AUTHORITY-HERE with the name of the tenant in which you provisioned your application. Le format doit être https://login.microsoftonline.com/contoso.onmicrosoft.com.The format should be https://login.microsoftonline.com/contoso.onmicrosoft.com. Cette valeur peut être copiée depuis l’onglet Domaine de votre Azure Active Directory dans le Portail Azure.This value can be copied from the Domain tab in your Azure Active Directory in the Azure portal.
    • Remplacez INSERT-RESOURCE-ID-HERE par l’ID client du serveur principal de votre application mobile.Replace INSERT-RESOURCE-ID-HERE with the client ID for your mobile app backend. Vous pouvez obtenir l’ID client sur le portail, sous l’onglet Avancé du menu Paramètres Azure Active Directory.You can obtain the client ID from the Advanced tab under Azure Active Directory Settings in the portal.
    • Remplacez INSERT-CLIENT-ID-HERE par l’ID client que vous avez copié depuis l’application cliente native.Replace INSERT-CLIENT-ID-HERE with the client ID you copied from the native client application.
    • Remplacez INSERT-REDIRECT-URI-HERE par le point de terminaison /.auth/login/done de votre site, en utilisant le modèle HTTPS.Replace INSERT-REDIRECT-URI-HERE with your site's /.auth/login/done endpoint, using the HTTPS scheme. Cette valeur doit être similaire à https://contoso.azurewebsites.net/.auth/login/done .This value should be similar to https://contoso.azurewebsites.net/.auth/login/done.

Objective-C: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: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)
            }
        }
}

Procédure : Authentifier des utilisateurs avec le kit de développement logiciel (SDK) Facebook pour iOSHow to: Authenticate users with the Facebook SDK for iOS

Vous pouvez utiliser le kit de développement logiciel (SDK) Facebook pour iOS pour identifier les utilisateurs sur votre application utilisant Facebook.You can use the Facebook SDK for iOS to sign users into your application using Facebook. L’authentification par flux client est préférable à l’utilisation de la méthode loginWithProvider:completion: .Using a client flow authentication is preferable to using the loginWithProvider:completion: method. L’authentification par client flux offre une interface UX native plus simple et permet une personnalisation supplémentaire.The client flow authentication provides a more native UX feel and allows for additional customization.

  1. Si vous souhaitez configurer le backend d’application mobile pour la connexion Facebook, suivez le didacticiel Guide pratique pour configurer votre application App Service pour la connexion Facebook.Configure your mobile app backend for Facebook sign-in by following the How to configure App Service for Facebook login tutorial.

  2. Installez le SDK Facebook pour iOS en suivant la documentation Kit SDK Facebook pour iOS – Prise en main.Install the Facebook SDK for iOS by following the Facebook SDK for iOS - Getting Started documentation. Au lieu de créer une application, vous pouvez ajouter la plateforme iOS à votre inscription existante.Instead of creating an app, you can add the iOS platform to your existing registration.

  3. La documentation de Facebook comprend du code en Objective-C dans le délégué de l’application.Facebook's documentation includes some Objective-C code in the App Delegate. Si vous utilisez Swift, vous pouvez vous servir des conversions suivantes pour AppDelegate.swift :If you are using Swift, you can use the following translations for 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. En plus d’ajouter FBSDKCoreKit.framework à votre projet, ajoutez également une référence à FBSDKLoginKit.framework de la même façon.In addition to adding FBSDKCoreKit.framework to your project, also add a reference to FBSDKLoginKit.framework in the same way.

  5. Ajoutez le code suivant à votre application, en fonction du langage utilisé.Add the following code to your application, according to the language you are using.

    Objective-C: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: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)
            }
        }
    }
    

Procédure : Authentifier des utilisateurs avec Twitter Fabric pour iOSHow to: Authenticate users with Twitter Fabric for iOS

Vous pouvez utiliser Twitter Fabric pour iOS pour identifier les utilisateurs sur votre application utilisant Twitter.You can use Fabric for iOS to sign users into your application using Twitter. L’authentification par flux client est souvent préférable à l’utilisation de la méthode loginWithProvider:completion: , car elle offre une interface UX native plus simple et permet une personnalisation supplémentaire.Client Flow authentication is preferable to using the loginWithProvider:completion: method, as it provides a more native UX feel and allows for additional customization.

  1. Si vous souhaitez configurer le backend de votre application mobile pour utiliser la connexion Twitter, suivez le didacticiel Configurer votre application App Service pour utiliser la connexion Twitter .Configure your mobile app backend for Twitter sign-in by following the How to configure App Service for Twitter login tutorial.

  2. Ajoutez Fabric à votre projet en suivant la documentation Fabric pour iOS : prise en main (en anglais) et en configurant TwitterKit.Add Fabric to your project by following the Fabric for iOS - Getting Started documentation and setting up TwitterKit.

    Notes

    Par défaut, Fabric crée une application Twitter pour vous.By default, Fabric creates a Twitter application for you. Vous pouvez éviter de créer une application en enregistrant la clé et la clé secrète du client que vous avez créées plus tôt avec les extraits de code suivants.You can avoid creating an application by registering the Consumer Key and Consumer Secret you created earlier using the following code snippets. Vous pouvez également remplacer les valeurs de clé et de clé secrète du client que vous fournissez à App Service avec les valeurs que vous voyez dans le Tableau de bord de Fabric.Alternatively, you can replace the Consumer Key and Consumer Secret values that you provide to App Service with the values you see in the Fabric Dashboard. Si vous choisissez cette option, veillez à définir l’URL de rappel sur une valeur d’espace réservé, par exemple https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.If you choose this option, be sure to set the callback URL to a placeholder value, such as https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    Si vous choisissez d’utiliser les clés secrètes que vous avez créées précédemment, ajoutez le code suivant à votre délégué d’application :If you choose to use the secrets you created earlier, add the following code to your App Delegate:

    Objective-C: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: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. Ajoutez le code suivant à votre application, en fonction du langage utilisé.Add the following code to your application, according to the language you are using.

    Objective-C: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: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)
            }
        }
    }
    

Procédure : Authentifier des utilisateurs avec le kit de développement logiciel (SDK) Google Sign-In pour iOSHow to: Authenticate users with the Google Sign-In SDK for iOS

Vous pouvez utiliser le kit de développement logiciel (SDK) Google Sign-In pour iOS pour identifier les utilisateurs sur votre application utilisant un compte Google.You can use the Google Sign-In SDK for iOS to sign users into your application using a Google account. Google a récemment annoncé que des modifications avaient été apportées à ses stratégies de sécurité OAuth.Google recently announced changes to their OAuth security policies. Ces modifications de stratégie nécessiteront l’utilisation du SDK Google à l’avenir.These policy changes will require the use of the Google SDK in the future.

  1. Si vous souhaitez configurer le backend de votre application mobile pour utiliser la connexion Google, suivez le didacticiel Configurer votre application App Service pour utiliser la connexion Google .Configure your mobile app backend for Google sign-in by following the How to configure App Service for Google login tutorial.

  2. Installez le SDK Google pour iOS en suivant les instructions figurant dans la documentation Google Sign-In for iOS - Start integrating (Google Sign-In pour iOS - Démarrer l’intégration).Install the Google SDK for iOS by following the Google Sign-In for iOS - Start integrating documentation. Vous pouvez ignorer la section « Authentification avec un serveur principal ».You may skip the "Authenticate with a Backend Server" section.

  3. Ajoutez ce qui suit à la méthode signIn:didSignInForUser:withError: de votre délégué, en fonction du langage que vous utilisez.Add the following to your delegate's signIn:didSignInForUser:withError: method, according to the language you are using.

    Objective-C:Objective-C:

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

    Swift:Swift:

    let payload: [String: String] = ["id_token": user.authentication.idToken, "authorization_code": user.serverAuthCode]
    client.loginWithProvider("google", token: payload) { (user, error) in
        // ...
    }
    
  4. Assurez-vous que vous ajoutez également le code suivant à application:didFinishLaunchingWithOptions: dans votre délégué d’application, en remplaçant « SERVER_CLIENT_ID » par le même ID utilisé pour configurer App Service à l’étape 1.Make sure you also add the following to application:didFinishLaunchingWithOptions: in your app delegate, replacing "SERVER_CLIENT_ID" with the same ID that you used to configure App Service in step 1.

    Objective-C:Objective-C:

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

    Swift:Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Ajoutez le code suivant à votre application dans un UIViewController qui implémente le protocole GIDSignInUIDelegate , en fonction du langage que vous utilisez.Add the following code to your application in a UIViewController that implements the GIDSignInUIDelegate protocol, according to the language you are using. Vous êtes déconnecté avant d’être connecté à nouveau, et même si vous n’avez pas à entrer ses informations d’identification, une boîte de dialogue de consentement s’affiche.You are signed out before being signed in again, and although you don't need to enter your credentials again, you see a consent dialog. Appelez uniquement cette méthode lorsque le jeton de session a expiré.Only call this method when the session token has expired.

    Objective-C:Objective-C:

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

    Swift:Swift:

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