Uso de la biblioteca de cliente de iOS para Aplicaciones móviles de AzureHow to Use iOS Client Library for Azure Mobile Apps

Nota

Visual Studio App Center admite servicios integrados de un extremo a otro fundamentales para el desarrollo de aplicaciones móviles.Visual Studio App Center supports end to end and integrated services central to mobile app development. Los desarrolladores pueden usar los servicios de compilación, prueba y distribución para configurar la canalización de integración y entrega continuas.Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. Una vez que se ha implementado la aplicación, los desarrolladores pueden supervisar el estado y el uso de su aplicación con los servicios de análisis y diagnóstico, e interactuar con los usuarios que utilizan el servicio de Push (inserción).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. Además, los desarrolladores pueden aprovechar Auth para autenticar a los usuarios y el servicio de datos para almacenar y sincronizar los datos de la aplicación en la nube.Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud. Si está pensando en integrar Cloud Services en una aplicación móvil, regístrese en App Center App Center hoy mismo.If you are looking to integrate cloud services in your mobile application, sign up with App Center App Center today.

Información generalOverview

En esta guía se muestra cómo realizar algunas tareas comunes a través del SDK de iOS de Azure Mobile Apps.This guide teaches you to perform common scenarios using the latest Azure Mobile Apps iOS SDK. Si está familiarizado con Aplicaciones móviles de Azure, complete primero Creación de una aplicación de Apache Cordova para crear un back-end, crear una tabla y descargar un proyecto de Xcode para iOS pregenerada.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. En esta guía, nos centramos en el SDK de iOS de cliente.In this guide, we focus on the client-side iOS SDK. Para obtener más información sobre el SDK de servidor para el back-end, consulte los procedimientos del SDK de servidor.To learn more about the server-side SDK for the backend, see the Server SDK HOWTOs.

Documentación de referenciaReference documentation

La documentación de referencia para el SDK de cliente iOS se encuentra aquí: Referencia de cliente de iOS de Azure Mobile Apps.The reference documentation for the iOS client SDK is located here: Azure Mobile Apps iOS Client Reference.

Plataformas compatiblesSupported Platforms

El SDK de iOS admite proyectos de Objective-C, Swift 2.2 y Swift 2.3 para iOS 8.0 o posterior.The iOS SDK supports Objective-C projects, Swift 2.2 projects, and Swift 2.3 projects for iOS versions 8.0 or later.

La autenticación de flujo de servidor utiliza una vista web para la interfaz de usuario presentada.The "server-flow" authentication uses a WebView for the presented UI. Si el dispositivo no puede presentar una interfaz de usuario de vista web, hay que utilizar otros métodos de autenticación que están fuera del ámbito del producto.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.
Por tanto, este SDK no es adecuado para dispositivos de tipo reloj o con restricciones similares.This SDK is thus not suitable for Watch-type or similarly restricted devices.

Configuración y requisitos previosSetup and Prerequisites

En esta guía se asume que ha creado un back-end con una tabla.This guide assumes that you have created a backend with a table. En esta guía se asume que la tabla tiene el mismo esquema que las tablas de dichos tutoriales.This guide assumes that the table has the same schema as the tables in those tutorials. En esta guía también se supone que en el código se hace referencia a MicrosoftAzureMobile.framework e importa MicrosoftAzureMobile/MicrosoftAzureMobile.h.This guide also assumes that in your code, you reference MicrosoftAzureMobile.framework and import MicrosoftAzureMobile/MicrosoftAzureMobile.h.

Instrucciones: Creación del clienteHow to: Create Client

Para obtener acceso al back-end de Aplicaciones móviles de Azure en el proyecto, cree un MSClient.To access an Azure Mobile Apps backend in your project, create an MSClient. Reemplace AppUrl por la dirección URL de la aplicación.Replace AppUrl with the app URL. Puede dejar gatewayURLString y applicationKey vacías.You may leave gatewayURLString and applicationKey empty. Si configura una puerta de enlace para la autenticación, rellene gatewayURLString con la dirección URL de la puerta de enlace.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")

Instrucciones: Creación de una referencia de tablaHow to: Create Table Reference

Para acceder a los datos o actualizarlos, cree una referencia a la tabla de back-end.To access or update data, create a reference to the backend table. Reemplace TodoItem por el nombre de la tabla.Replace TodoItem with the name of your table

Objective-C:Objective-C:

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

SWIFT:Swift:

let table = client.tableWithName("TodoItem")

Instrucciones: Datos de consultaHow to: Query Data

Para crear una consulta de base de datos, consulte el objeto MSTable .To create a database query, query the MSTable object. La consulta siguiente obtiene todos los elementos de TodoItem y registra el texto de cada elemento.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"])
        }
    }
}

Instrucciones: Filtro de datos devueltosHow to: Filter Returned Data

Para filtrar los resultados, hay muchas opciones disponibles.To filter results, there are many available options.

Para filtrar mediante un predicado, use un NSPredicate y readWithPredicate.To filter using a predicate, use an NSPredicate and readWithPredicate. Los siguientes filtros devolvieron datos para buscar solo los elementos Todo incompletos.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"])
        }
    }
}

Instrucciones: Uso de MSQueryHow to: Use MSQuery

Para realizar una consulta compleja (como de ordenación y paginación), cree un objeto MSQuery directamente o mediante un predicado: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 permite controlar varios comportamientos de consulta.MSQuery lets you control several query behaviors.

  • Especificar el orden de los resultadosSpecify order of results
  • Limitar qué campos se devuelvenLimit which fields to return
  • Limitar el número de registros que se devolveránLimit how many records to return
  • Especificar el recuento total en la respuestaSpecify total count in response
  • Especificar parámetros de la cadena de consulta personalizados en la solicitudSpecify custom query string parameters in request
  • Aplicar funciones adicionalesApply additional functions

Ejecutar una consulta MSQuery llamando a readWithCompletion en el objeto.Execute an MSQuery query by calling readWithCompletion on the object.

Instrucciones: Ordenación de datos con MSQueryHow to: Sort Data with MSQuery

Para ordenar los resultados, echemos un vistazo a un ejemplo.To sort results, let's look at an example. Para ordenar por orden ascendente el campo text y, luego, por orden descendente el campo complete, invoque MSQuery de la siguiente manera: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"])
        }
    }
}

Instrucciones: Limitación de campos y expansión de los parámetros de cadena de consulta con MSQueryHow to: Limit Fields and Expand Query String Parameters with MSQuery

Para limitar los campos que se devolverán en una consulta, especifique los nombres de los campos en la propiedad selectFields .To limit fields to be returned in a query, specify the names of the fields in the selectFields property. En este ejemplo solamente se devuelven los campos de texto y aquellos que se hayan rellenado:This example returns only the text and completed fields:

Objective-C:Objective-C:

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

SWIFT:Swift:

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

Para incluir parámetros de cadena de consulta adicionales en la solicitud al servidor (por ejemplo, porque los utiliza un script de servidor personalizado), introduzca query.parameters :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"]

Instrucciones: Configuración del tamaño de páginaHow to: Configure Page Size

Con Azure Mobile Apps, el tamaño de página controla el número de registros que se extraen de las tablas de back-end al mismo tiempo.With Azure Mobile Apps, the page size controls the number of records that are pulled at a time from the backend tables. Luego, una llamada a los datos de pull enviaría dichos datos en lotes, basándose en este tamaño de página, hasta que no haya más registros para extraer.A call to pull data would then batch up data, based on this page size, until there are no more records to pull.

Es posible configurar un tamaño de página con MSPullSettings tal como se muestra a continuación.It's possible to configure a page size using MSPullSettings as shown below. El tamaño de página predeterminado es 50 y en el ejemplo siguiente se cambia a 3.The default page size is 50, and the example below changes it to 3.

Para mejorar el rendimiento es posible configurar otro tamaño de página.You could configure a different page size for performance reasons. Si tiene un gran número de registros de datos pequeños, un tamaño de página elevado reduce el número de idas y vueltas del servidor.If you have a large number of small data records, a high page size reduces the number of server round-trips.

Este valor controla el tamaño de página en el cliente.This setting controls only the page size on the client side. Si el cliente pide un tamaño de página mayor que el que admite el back-end de Mobile Apps, se limita al máximo que el back-end está configurado para admitir.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.

Este valor es también el número de registros de datos, no el tamaño en bytes.This setting is also the number of data records, not the byte size.

Si aumenta el tamaño de página del cliente, también debe aumentar el tamaño de página en el servidor.If you increase the client page size, you should also increase the page size on the server. Consulte "Instrucciones: Cómo ajustar el tamaño de paginación de la tabla" para saber qué pasos debe dar para hacerlo.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)
    }
}

Instrucciones: Inserción de datosHow to: Insert Data

Para insertar una nueva fila en la tabla, cree un elemento NSDictionary e invoque table insert.To insert a new table row, create a NSDictionary and invoke table insert. Si el esquema dinámico está habilitado, el back-end móvil de Azure App Service genera automáticamente columnas nuevas basadas en NSDictionary.If Dynamic Schema is enabled, the Azure App Service mobile backend automatically generates new columns based on the NSDictionary.

Si no se proporciona id , el backend genera automáticamente un nuevo identificador único.If id is not provided, the backend automatically generates a new unique ID. Proporcione su propio id para utilizar direcciones de correo electrónico, nombres de usuario o sus propios valores personalizados como Id.Provide your own id to use email addresses, usernames, or your own custom values as ID. Proporcionar su propio ID puede facilitar las combinaciones y la lógica de la base de datos de tipo empresarial.Providing your own ID may ease joins and business-oriented database logic.

result contiene el nuevo elemento insertado.The result contains the new item that was inserted. En función de la lógica del servidor, puede tener datos modificados o adicionales en comparación con lo que se pasó al servidor.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"])
    }
}

Instrucciones: Modificación de datosHow to: Modify Data

Para actualizar una fila existente, modifique un elemento y llame a 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"])
        }
    })
}

Como alternativa, proporcione el identificador de fila y el campo actualizado: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"])
    }
}

Como mínimo, debe establecerse el atributo id al realizar actualizaciones.At minimum, the id attribute must be set when making updates.

Instrucciones: Eliminación de datosHow to: Delete Data

Para eliminar un elemento, invoque delete con el elemento: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)
    }
}

O bien elimínelo proporcionando un identificador de fila: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)
    }
}

Como mínimo, el atributo id debe establecerse a la hora de efectuar eliminaciones.At minimum, the id attribute must be set when making deletes.

Instrucciones: Llamada a una API personalizadaHow to: Call Custom API

Con una API personalizada, puede exponer cualquier funcionalidad de back-end.With a custom API, you can expose any backend functionality. No necesita asignar a una operación de tabla.It doesn't have to map to a table operation. No solo obtendrá más control sobre la mensajería, también podrá leer o establecer encabezados y cambiar el formato del cuerpo de la respuesta.Not only do you gain more control over messaging, you can even read/set headers and change the response body format.

Para invocar a una API personalizada, llame a MSClient.invokeAPI.To call a custom API, call MSClient.invokeAPI. El contenido de la solicitud y la respuesta se tratan como JSON.The request and response content are treated as JSON. Para usar otros tipos de soportes físicos, use la otra sobrecarga de invokeAPI.To use other media types, use the other overload of invokeAPI. Para realizar una solicitud GET en lugar de una solicitud POST, establezca el parámetro HTTPMethod en "GET" y el parámetro body en nil (puesto que las solicitudes GET no tienen cuerpos de mensaje). Si la API personalizada es compatible con otros verbos HTTP, cambie HTTPMethod de acuerdo a ello.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
                }
        }

Instrucciones: Registro de plantillas push para enviar notificaciones entre plataformasHow to: Register push templates to send cross-platform notifications

Para registrar plantillas, pase las plantillas con el método client.push registerDeviceToken en la aplicación 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)
    }
})

Las plantillas serán de tipo NSDictionary y pueden contener varias plantillas con el formato siguiente: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)"]]]]

Por seguridad, se eliminan todas las etiquetas de la solicitud.All tags are stripped from the request for security. Para agregar etiquetas a las instalaciones o plantillas dentro de las instalaciones, vea Trabajar con el SDK del servidor back-end de .NET para Azure Mobile Apps.To add tags to installations or templates within installations, see Work with the .NET backend server SDK for Azure Mobile Apps. Para enviar notificaciones mediante estas plantillas registradas, trabaje con las API de Notification Hubs.To send notifications using these registered templates, work with Notification Hubs APIs.

Instrucciones: Gestión de erroresHow to: Handle Errors

Al realizar una llamada a un back-end móvil de Azure App Service, el bloque de finalización contiene un parámetro NSError .When you call an Azure App Service mobile backend, the completion block contains an NSError parameter. En caso de producirse un error, este parámetro no será nulo.When an error occurs, this parameter is non-nil. En su código, debe marcar este parámetro y administrar el error según sea necesario, como se muestra en los fragmentos de código anteriores.In your code, you should check this parameter and handle the error as needed, as demonstrated in the preceding code snippets.

El archivo <WindowsAzureMobileServices/MSError.h> define las constantes MSErrorResponseKey, MSErrorRequestKey y MSErrorServerItemKey.The file <WindowsAzureMobileServices/MSError.h> defines the constants MSErrorResponseKey, MSErrorRequestKey, and MSErrorServerItemKey. Para obtener más datos relacionados con el error: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]

Además, el archivo define constantes para cada código de error:In addition, the file defines constants for each error code:

Objective-C:Objective-C:

if (error.code == MSErrorPreconditionFailed) {

SWIFT:Swift:

if (error.code == MSErrorPreconditionFailed) {

Instrucciones: Autenticación de usuarios con la biblioteca de autenticación de Active DirectoryHow to: Authenticate users with the Active Directory Authentication Library

Puede utilizar la biblioteca de autenticación de Active Directory (ADAL) para iniciar la sesión de los usuarios en su aplicación con Azure Active Directory.You can use the Active Directory Authentication Library (ADAL) to sign users into your application using Azure Active Directory. Se prefiere la autenticación de flujo de cliente mediante un SDK de proveedor de identidades al uso del método loginWithProvider:completion: .Client flow authentication using an identity provider SDK is preferable to using the loginWithProvider:completion: method. Este tipo de autenticación proporciona una experiencia de usuario más nativa y permite realizar más personalizaciones.Client flow authentication provides a more native UX feel and allows for additional customization.

  1. Configure su back-end de aplicación móvil para el inicio de sesión en AAD siguiendo el tutorial Configuración de la aplicación de App Service para usar el inicio de sesión de 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. Asegúrese de completar el paso opcional de registrar una aplicación cliente nativa.Make sure to complete the optional step of registering a native client application. Para iOS, se recomienda que el URI de redireccionamiento tenga el formato <app-scheme>://<bundle-id>.For iOS, we recommend that the redirect URI is of the form <app-scheme>://<bundle-id>. Para más información, consulte la guía de inicio rápido de iOS para ADAL.For more information, see the ADAL iOS quickstart.

  2. Instale ADAL mediante Cocoapods.Install ADAL using Cocoapods. Edite el podfile para incluir la siguiente definición; sustituya YOUR-PROJECT por el nombre de su proyecto de 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'
    

    y el POD:and the Pod:

     pod 'ADALiOS'
    
  3. Mediante el Terminal, ejecute pod install desde el directorio que contiene el proyecto y abra el área de trabajo del Xcode generado (no el proyecto).Using the Terminal, run pod install from the directory containing your project, and then open the generated Xcode workspace (not the project).

  4. Agregue el siguiente código a la aplicación, según el lenguaje que esté utilizando.Add the following code to your application, according to the language you are using. En cada uno, realice estas sustituciones:In each, make these replacements:

    • Reemplace INSERT-AUTHORITY-HERE por el nombre del inquilino en el que aprovisionó la aplicación.Replace INSERT-AUTHORITY-HERE with the name of the tenant in which you provisioned your application. El formato debe ser https://login.microsoftonline.com/contoso.onmicrosoft.com.The format should be https://login.microsoftonline.com/contoso.onmicrosoft.com. Este valor se puede copiar de la pestaña Dominio de Azure Active Directory en Azure Portal.This value can be copied from the Domain tab in your Azure Active Directory in the Azure portal.
    • Reemplace INSERT-RESOURCE-ID-HERE por el Id. de cliente del back-end de la aplicación móvil.Replace INSERT-RESOURCE-ID-HERE with the client ID for your mobile app backend. El Id. de cliente en la pestaña Opciones avanzadas de Configuración de Azure Active Directory en el portal.You can obtain the client ID from the Advanced tab under Azure Active Directory Settings in the portal.
    • Reemplace INSERT-CLIENT-ID-HERE por el Id. de cliente que copió de la aplicación cliente nativa.Replace INSERT-CLIENT-ID-HERE with the client ID you copied from the native client application.
    • Reemplace INSERT-REDIRECT-URI-HERE por el punto de conexión /.auth/login/done del sitio, mediante el esquema HTTPS.Replace INSERT-REDIRECT-URI-HERE with your site's /.auth/login/done endpoint, using the HTTPS scheme. El valor debería parecerse al siguiente: 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)
            }
        }
}

Instrucciones: Autenticación de usuarios con SDK de Facebook para iOSHow to: Authenticate users with the Facebook SDK for iOS

Puede usar el SDK de Facebook para iOS para que los usuarios inicien sesión en su aplicación con Facebook.You can use the Facebook SDK for iOS to sign users into your application using Facebook. Es preferible usar la autenticación de flujo de cliente al método loginWithProvider:completion: .Using a client flow authentication is preferable to using the loginWithProvider:completion: method. Este tipo de autenticación proporciona una experiencia de usuario más nativa y permite realizar más personalizaciones.The client flow authentication provides a more native UX feel and allows for additional customization.

  1. Configure el back-end de aplicación móvil para el inicio de sesión en Facebook siguiendo el tutorial Configuración de la aplicación de App Service para usar el inicio de sesión de Facebook.Configure your mobile app backend for Facebook sign-in by following the How to configure App Service for Facebook login tutorial.

  2. Instale el SDK de Facebook para iOS siguiendo la documentación SDK de Facebook para iOS: primeros pasos.Install the Facebook SDK for iOS by following the Facebook SDK for iOS - Getting Started documentation. En lugar de crear una aplicación, puede agregar la plataforma iOS en el registro existente.Instead of creating an app, you can add the iOS platform to your existing registration.

  3. La documentación de Facebook incluye algún código de Objective-C en el delegado de la aplicación.Facebook's documentation includes some Objective-C code in the App Delegate. Si utiliza Swift, puede usar las siguientes traducciones para 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. Además de agregar FBSDKCoreKit.framework al proyecto, también puede agregar una referencia a FBSDKLoginKit.framework de la misma manera.In addition to adding FBSDKCoreKit.framework to your project, also add a reference to FBSDKLoginKit.framework in the same way.

  5. Agregue el siguiente código a la aplicación, según el lenguaje que esté utilizando.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)
            }
        }
    }
    

Instrucciones: Autenticación de usuarios con Fabric de Twitter para iOSHow to: Authenticate users with Twitter Fabric for iOS

Puede usar Fabric para iOS para que los usuarios inicien sesión en su aplicación con Twitter.You can use Fabric for iOS to sign users into your application using Twitter. La autenticación de flujo de cliente es preferible al uso del método loginWithProvider:completion: , ya que proporciona una experiencia de usuario más nativa y permite realizar más personalizaciones.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. Configure su back-end de aplicación móvil para el inicio de sesión en Twitter siguiendo el tutorial Configuración de la aplicación de App Service para usar el inicio de sesión de Twitter .Configure your mobile app backend for Twitter sign-in by following the How to configure App Service for Twitter login tutorial.

  2. Agregue Fabric al proyecto siguiendo el documento Fabric for iOS - Getting Started y configurando TwitterKit.Add Fabric to your project by following the Fabric for iOS - Getting Started documentation and setting up TwitterKit.

    Nota

    De forma predeterminada, Fabric creará automáticamente una aplicación de Twitter.By default, Fabric creates a Twitter application for you. Puede evitar que se cree registrando la clave de usuario y el secreto de consumidor que creó anteriormente mediante los fragmentos de código siguientes.You can avoid creating an application by registering the Consumer Key and Consumer Secret you created earlier using the following code snippets. Asimismo, puede reemplazar los valores de clave de usuario y de secreto de consumidor que proporcione al Servicio de aplicaciones por los valores que aparecen en Fabric Dashboard.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 elige esta opción, asegúrese de establecer la dirección URL de devolución de llamada en un valor de marcador de posición, como 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 decide utilizar los secretos que creó anteriormente, agregue el siguiente código al delegado de la aplicación: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. Agregue el siguiente código a la aplicación, según el lenguaje que esté utilizando.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)
            }
        }
    }
    

Instrucciones: Autenticación de usuarios con el SDK de inicio de sesión de Google para iOSHow to: Authenticate users with the Google Sign-In SDK for iOS

Puede usar el SDK de inicio de sesión de Google para iOS para que los usuarios inicien sesión en su aplicación con una cuenta de Google.You can use the Google Sign-In SDK for iOS to sign users into your application using a Google account. Google anunció recientemente cambios en sus directivas de seguridad de OAuth.Google recently announced changes to their OAuth security policies. Estos cambios obligarán a usar el SDK de Google en el futuro.These policy changes will require the use of the Google SDK in the future.

  1. Configure su back-end de aplicación móvil para el inicio de sesión en Google siguiendo el tutorial Configuración de la aplicación de App Service para usar el inicio de sesión de Google .Configure your mobile app backend for Google sign-in by following the How to configure App Service for Google login tutorial.

  2. Instale el SDK de Google para iOS siguiendo la documentación de Inicio de sesión de Google para iOS: Empiece a integrar.Install the Google SDK for iOS by following the Google Sign-In for iOS - Start integrating documentation. Puede omitir la sección Authenticate with a Backend Server (Autenticar con un servidor back-end).You may skip the "Authenticate with a Backend Server" section.

  3. Agregue el siguiente código al método signIn:didSignInForUser:withError: del delegado según el lenguaje que esté utilizando.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. Asegúrese de agregar también lo siguiente a application:didFinishLaunchingWithOptions: en el delegado de la aplicación, reemplazando "SERVER_CLIENT_ID" por el mismo identificador que usó para configurar el Servicio de aplicaciones en el paso 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. Agregue el siguiente código a la aplicación en un UIViewController que permita implementar el protocolo GIDSignInUIDelegate según el lenguaje que esté utilizando.Add the following code to your application in a UIViewController that implements the GIDSignInUIDelegate protocol, according to the language you are using. La sesión se cierra antes de volver a iniciar sesión y, aunque no es necesario que vuelva a escribir sus credenciales, verá un cuadro de diálogo de consentimiento.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. Solo llame a este método si el token de sesión ha expirado.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()
    }