

# Uso de un SDK de iOS generado por API Gateway para una API REST en Objective-C o Swift
<a name="how-to-generate-sdk-ios"></a>

En este tutorial, le mostraremos cómo utilizar un SDK de iOS generado por API Gateway para una API REST en una aplicación Objective-C o Swift para llamar a la API subyacente. Usaremos la [API SimpleCalc](simple-calc-lambda-api.md) como ejemplo para ilustrar los siguientes temas:
+ Cómo instalar los componentes del SDK para móviles de AWS necesarios en el proyecto Xcode
+ Cómo crear el objeto de cliente API antes de llamar a los métodos de la API
+ Cómo llamar a los métodos de la API a través de los métodos del SDK correspondientes en el objeto del cliente API
+ Cómo preparar una entrada de método y analizar el resultado utilizando las clases del modelo correspondientes del SDK

**Topics**
+ [Usar el SDK de iOS generado (Objective-C) para llamar a una API](#how-to-use-sdk-ios-objc)
+ [Usar un SDK de iOS generado (Swift) para llamar a la API](#how-to-generate-sdk-ios-swift)

## Usar el SDK de iOS generado (Objective-C) para llamar a una API
<a name="how-to-use-sdk-ios-objc"></a>

Antes de comenzar el siguiente procedimiento, debe completar los pasos de [Generación de SDK para las API de REST en API Gateway](how-to-generate-sdk.md) para iOS en Objective-C y descargar el archivo .zip del SDK generado.

### Instalación del SDK para móviles de AWS y un SDK de iOS generado por API Gateway en un proyecto Objective-C
<a name="use-sdk-ios-objc-install-sdk"></a>

En el procedimiento siguiente se describe cómo instalar el SDK.

**Para instalar y utilizar un SDK de iOS generado por API Gateway en Objective-C**

1. Extraiga el contenido del archivo .zip generado por API Gateway que ha descargado anteriormente. Con la [API SimpleCalc](simple-calc-lambda-api.md), puede cambiar el nombre de la carpeta del SDK descomprimido a algo similar a **sdk\$1objc\$1simple\$1calc**. En esta carpeta del SDK hay un archivo `README.md` y un archivo `Podfile`. El archivo `README.md` contiene las instrucciones para instalar y utilizar el SDK. Este tutorial proporciona información detallada sobre estas instrucciones. La instalación usa [CocoaPods](https://cocoapods.org) para importar las bibliotecas de API Gateway necesarias y otros componentes dependientes del SDK para móviles de AWS. Debe actualizar el archivo `Podfile` para importar los SDK en el proyecto Xcode de su aplicación. La carpeta del SDK descomprimida contiene también una carpeta `generated-src` que incluye el código fuente del SDK generado de la API.

1. Inicie Xcode y cree un nuevo proyecto iOS Objective-C. Anote el destino del proyecto. Lo necesitará para definirlo en el archivo `Podfile`.

      
![\[Encuentre el objetivo en Xcode.\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-find-target.png)

1. Para importar AWS Mobile SDK for iOS en el proyecto Xcode mediante CocoaPods, haga lo siguiente:

   1. Instale CocoaPods ejecutando el siguiente comando en una ventana del terminal:

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. Copie el archivo `Podfile` de la carpeta del SDK extraído en el mismo directorio que contiene el archivo del proyecto Xcode. Sustituya el siguiente bloque:

      ```
      target '<YourXcodeTarget>' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      por el nombre de destino de su proyecto: 

      ```
      target 'app_objc_simple_calc' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      Si su proyecto Xcode ya contiene un archivo denominado `Podfile`, añada la siguiente línea de código:

      ```
      pod 'AWSAPIGateway', '~> 2.4.7'
      ```

   1. Abra una ventana del terminal y ejecute el siguiente comando:

      ```
      pod install
      ```

      Se instalará el componente de API Gateway y otros componentes dependientes del SDK para móviles de AWS.

   1. Cierre el proyecto Xcode y, a continuación, abra el archivo `.xcworkspace` para volver a iniciar Xcode.

   1. Añada todos los archivos `.h` y `.m` del directorio `generated-src` del SDK extraído al proyecto Xcode.

         
![\[Los archivos .h y .m están en generated-src\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-add-sdk-src.png)

   Para importar el AWS Mobile SDK for iOS Objective-C en su proyecto descargando de forma explícita el SDK para móviles de AWS o mediante [Carthage](https://github.com/Carthage/Carthage#installing-carthage), siga las instrucciones del archivo *README.md*. Asegúrese de utilizar únicamente una de estas opciones para importar el SDK para móviles de AWS.

### Llamar a métodos de la API mediante el SDK de iOS generado por API Gateway en un proyecto Objective-C
<a name="use-sdk-ios-objc-call-sdk"></a>

Cuando genera el SDK con el prefijo `SIMPLE_CALC` para esta [API SimpleCalc](simple-calc-lambda-api.md) con dos modelos para la entrada (`Input`) y la salida (`Result`) de los métodos, en el SDK, la clase de cliente de API resultante se convierte en `SIMPLE_CALCSimpleCalcClient` y las clases de datos correspondientes son `SIMPLE_CALCInput` y `SIMPLE_CALCResult`, respectivamente. Las solicitudes y respuestas de la API se asignan a los métodos del SDK de la siguiente manera:
+ La solicitud de API

  ```
  GET /?a=...&b=...&op=...
  ```

  se convierte en el método del SDK

  ```
  (AWSTask *)rootGet:(NSString *)op a:(NSString *)a b:(NSString *)b
  ```

  La propiedad `AWSTask.result` es del tipo `SIMPLE_CALCResult` si el modelo `Result` se añadió a la respuesta del método. De lo contrario, la propiedad es del tipo `NSDictionary`.
+ Esta solicitud de API

  ```
  POST /
      
  {
     "a": "Number",
     "b": "Number",
     "op": "String"
  }
  ```

  se convierte en el método del SDK

  ```
  (AWSTask *)rootPost:(SIMPLE_CALCInput *)body
  ```
+ La solicitud de API

  ```
  GET /{a}/{b}/{op}
  ```

  se convierte en el método del SDK

  ```
  (AWSTask *)aBOpGet:(NSString *)a b:(NSString *)b op:(NSString *)op
  ```

El siguiente procedimiento describe cómo llamar a los métodos de la API en el código fuente de la aplicación Objective-C, por ejemplo, como parte del delegado `viewDidLoad` en un archivo `ViewController.m`.

**Para llamar a la API a través del SDK de iOS generado por API Gateway**

1. Importe el archivo de encabezados de clase del cliente API para que la clase del cliente API se pueda llamar en la aplicación:

   ```
   #import "SIMPLE_CALCSimpleCalc.h"
   ```

   La instrucción `#import` también importa `SIMPLE_CALCInput.h` y `SIMPLE_CALCResult.h` para las dos clases de modelo.

1. Cree una instancia de la clase del cliente de API:

   ```
   SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];
   ```

   Para utilizar Amazon Cognito con la API, establezca la propiedad `defaultServiceConfiguration` en el objeto `AWSServiceManager` predeterminado, tal y como se muestra a continuación, antes de llamar al método `defaultClient` para crear el objeto del cliente API (mostrado en el ejemplo anterior):

   ```
   AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds];
   AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
   ```

1. Llame al método `GET /?a=1&b=2&op=+` para ejecutar `1+2`:

   ```
   [[apiInstance rootGet: @"+" a:@"1" b:@"2"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
       _textField1.text = [self handleApiResponse:task];
       return nil;
   }];
   ```

   donde la función auxiliar `handleApiResponse:task` formatea el resultado como una cadena que se muestra en un campo de texto (`_textField1`).

   ```
   - (NSString *)handleApiResponse:(AWSTask *)task {
       if (task.error != nil) {
           return [NSString stringWithFormat: @"Error: %@", task.error.description];
       } else if (task.result != nil && [task.result isKindOfClass:[SIMPLE_CALCResult class]]) {
           return [NSString stringWithFormat:@"%@ %@ %@ = %@\n",task.result.input.a, task.result.input.op, task.result.input.b, task.result.output.c];
       }
       return nil;
   }
   ```

   El resultado que se muestra es `1 + 2 = 3`.

1. Llame al método `POST /` con una carga para ejecutar `1-2`:

   ```
   SIMPLE_CALCInput *input = [[SIMPLE_CALCInput alloc] init];
       input.a = [NSNumber numberWithInt:1];
       input.b = [NSNumber numberWithInt:2];
       input.op = @"-";
       [[apiInstance rootPost:input] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
           _textField2.text = [self handleApiResponse:task];
           return nil;
       }];
   ```

   El resultado que se muestra es `1 - 2 = -1`.

1. Llame al método `GET /{a}/{b}/{op}` para ejecutar `1/2`:

   ```
   [[apiInstance aBOpGet:@"1" b:@"2" op:@"div"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
       _textField3.text = [self handleApiResponse:task];
       return nil;
   }];
   ```

   El resultado que se muestra es `1 div 2 = 0.5`. Aquí se usa `div` en lugar de `/` porque la [función de Lambda simple del backend](simple-calc-nodejs-lambda-function.md) no administra variables de ruta codificadas como URL.

## Usar un SDK de iOS generado (Swift) para llamar a la API
<a name="how-to-generate-sdk-ios-swift"></a>

Antes de comenzar el siguiente procedimiento, debe completar los pasos de [Generación de SDK para las API de REST en API Gateway](how-to-generate-sdk.md) para iOS en Swift y descargar el archivo .zip del SDK generado.

**Topics**
+ [Instalación del SDK para móviles de AWS y el SDK generado por API Gateway en un proyecto Swift](#use-sdk-ios-swift-install-sdk)
+ [Llamar a métodos de API a través del SDK de iOS generado por API Gateway en un proyecto Swift](#use-sdk-ios-swift-call-api)

### Instalación del SDK para móviles de AWS y el SDK generado por API Gateway en un proyecto Swift
<a name="use-sdk-ios-swift-install-sdk"></a>

En el procedimiento siguiente se describe cómo instalar el SDK.

**Para instalar y utilizar un SDK de iOS generado por API Gateway en Swift**

1. Extraiga el contenido del archivo .zip generado por API Gateway que ha descargado anteriormente. Con la [API SimpleCalc](simple-calc-lambda-api.md), puede cambiar el nombre de la carpeta del SDK descomprimido a algo similar a **sdk\$1swift\$1simple\$1calc**. En esta carpeta del SDK hay un archivo `README.md` y un archivo `Podfile`. El archivo `README.md` contiene las instrucciones para instalar y utilizar el SDK. Este tutorial proporciona información detallada sobre estas instrucciones. La instalación utiliza [CocoaPods](https://cocoapods.org) para importar los componentes del SDK para móviles de AWS necesarios. Debe actualizar el archivo `Podfile` para importar los SDK en el proyecto Xcode de su aplicación Swift. La carpeta del SDK descomprimida contiene también una carpeta `generated-src` que incluye el código fuente del SDK generado de la API.

1. Inicie Xcode y cree un nuevo proyecto de iOS Swift. Anote el destino del proyecto. Lo necesitará para definirlo en el archivo `Podfile`.

      
![\[Encuentre el objetivo en Xcode.\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-find-target.png)

1. Para importar los componentes del SDK para móviles de AWS necesarios en el proyecto Xcode mediante CocoaPods, haga lo siguiente:

   1. Si no está instalado, instale CocoaPods ejecutando el siguiente comando en una ventana del terminal:

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. Copie el archivo `Podfile` de la carpeta del SDK extraído en el mismo directorio que contiene el archivo del proyecto Xcode. Sustituya el siguiente bloque:

      ```
      target '<YourXcodeTarget>' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      por el nombre de destino de su proyecto, tal y como se muestra a continuación: 

      ```
      target 'app_swift_simple_calc' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      Si su proyecto Xcode ya contiene un archivo `Podfile` con el destino correcto, solo tiene que añadir la siguiente línea de código al bucle `do ... end`:

      ```
      pod 'AWSAPIGateway', '~> 2.4.7'
      ```

   1. Abra una ventana del terminal y ejecute el siguiente comando en el directorio de la aplicación:

      ```
      pod install
      ```

      Se instalará el componente de API Gateway y todos los componentes dependientes del SDK para móviles de AWS en el proyecto de la aplicación.

   1. Cierre el proyecto Xcode y, a continuación, abra el archivo `*.xcworkspace` para volver a iniciar Xcode.

   1. Añada todos los archivos de encabezado del SDK (`.h`) y los archivos de código fuente de Swift (`.swift`) del directorio `generated-src` extraído a su proyecto Xcode.

         
![\[Los archivos .h y .swift están en generated-src\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-add-sdk-src.png)

   1. Para habilitar las llamadas a las bibliotecas de Objective-C del SDK para móviles de AWS de su proyecto de código Swift, defina la ruta del archivo `Bridging_Header.h` en la propiedad **Objective-C Bridging Header (Encabezado Bridging de Objective-C)** en la opción **Swift Compiler - General (Compilador de Swift: general)** de la configuración de su proyecto Xcode: 

         
![\[Establezca la ruta del archivo Bridging_Header.h en el compilador de Swift: General.\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-bridging-header.png)
**sugerencia**  
Puede escribir **bridging** en el cuadro de búsqueda de Xcode para encontrar la propiedad **Objective-C Bridging Header (Encabezado Bridging de Objective-C)**.

   1. Compile el proyecto Xcode para verificar que está configurado correctamente antes de continuar. Si su Xcode utiliza una versión más reciente de Swift que la admitida por el SDK para móviles de AWS, recibirá errores del compilador de Swift. En este caso, establezca la propiedad **Use Legacy Swift Language Version (Usar versión del lenguaje Swift antigua)** en **Yes (Sí)** en la opción **Swift Compiler - Version (Compilador de Swift: versión)**:

         
![\[Establezca la propiedad de versión del lenguaje Swift antigua en Sí.\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-legacy-swift-version.png)

   Para importar el SDK para móviles para iOS de AWS en Swift en su proyecto descargando explícitamente el SDK para móviles de AWS o utilizando [Carthage](https://github.com/Carthage/Carthage#installing-carthage), siga las instrucciones del archivo `README.md` incluido con el paquete del SDK. Asegúrese de utilizar únicamente una de estas opciones para importar el SDK para móviles de AWS.

### Llamar a métodos de API a través del SDK de iOS generado por API Gateway en un proyecto Swift
<a name="use-sdk-ios-swift-call-api"></a>

Cuando genera el SDK con el prefijo `SIMPLE_CALC` para esta [API SimpleCalc](simple-calc-lambda-api.md) con dos modelos para describir la entrada (`Input`) y la salida (`Result`) de las solicitudes y las respuestas de la API, en el SDK, la clase de cliente de API resultante se convierte en `SIMPLE_CALCSimpleCalcClient` y las clases de datos correspondientes son `SIMPLE_CALCInput` y `SIMPLE_CALCResult`, respectivamente. Las solicitudes y respuestas de la API se asignan a los métodos del SDK de la siguiente manera: 
+ La solicitud de API

  ```
  GET /?a=...&b=...&op=...
  ```

  se convierte en el método del SDK

  ```
  public func rootGet(op: String?, a: String?, b: String?) -> AWSTask
  ```

  La propiedad `AWSTask.result` es del tipo `SIMPLE_CALCResult` si el modelo `Result` se añadió a la respuesta del método. De lo contrario, es del tipo `NSDictionary`.
+ Esta solicitud de API

  ```
  POST /
      
  {
     "a": "Number",
     "b": "Number",
     "op": "String"
  }
  ```

  se convierte en el método del SDK

  ```
  public func rootPost(body: SIMPLE_CALCInput) -> AWSTask
  ```
+ La solicitud de API

  ```
  GET /{a}/{b}/{op}
  ```

  se convierte en el método del SDK

  ```
  public func aBOpGet(a: String, b: String, op: String) -> AWSTask
  ```

El siguiente procedimiento describe cómo llamar a los métodos de la API en el código fuente de la aplicación Swift, por ejemplo, como parte del delegado `viewDidLoad()` en un archivo `ViewController.m`.

**Para llamar a la API a través del SDK de iOS generado por API Gateway**

1. Cree una instancia de la clase del cliente de API:

   ```
   let client = SIMPLE_CALCSimpleCalcClient.default()
   ```

   Para utilizar Amazon Cognito con la API, establezca una configuración del servicio de AWS predeterminada (que se muestra a continuación) antes de obtener el método `default` (mostrado anteriormente):

   ```
   let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id")        
   let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)        
   AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
   ```

1. Llame al método `GET /?a=1&b=2&op=+` para ejecutar `1+2`:

   ```
   client.rootGet("+", a: "1", b:"2").continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   donde la función auxiliar `self.showResult(task)` imprime el resultado o el error en la consola; por ejemplo: 

   ```
   func showResult(task: AWSTask) {
       if let error = task.error {
           print("Error: \(error)")
       } else if let result = task.result {
           if result is SIMPLE_CALCResult {
               let res = result as! SIMPLE_CALCResult
               print(String(format:"%@ %@ %@ = %@", res.input!.a!, res.input!.op!, res.input!.b!, res.output!.c!))
           } else if result is NSDictionary {
               let res = result as! NSDictionary
               print("NSDictionary: \(res)")
           }
       }
   }
   ```

   En una aplicación de producción, puede mostrar el resultado o el error en un campo de texto. El resultado que se muestra es `1 + 2 = 3`.

1. Llame al método `POST /` con una carga para ejecutar `1-2`:

   ```
   let body = SIMPLE_CALCInput()
   body.a=1
   body.b=2
   body.op="-"
   client.rootPost(body).continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   El resultado que se muestra es `1 - 2 = -1`.

1. Llame al método `GET /{a}/{b}/{op}` para ejecutar `1/2`:

   ```
   client.aBOpGet("1", b:"2", op:"div").continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   El resultado que se muestra es `1 div 2 = 0.5`. Aquí se usa `div` en lugar de `/` porque la [función de Lambda simple del backend](simple-calc-nodejs-lambda-function.md) no administra variables de ruta codificadas como URL.