

# Usar o SDK iOS gerado pelo API Gateway para uma API REST em Objective-C ou Swift


Neste tutorial, mostraremos como usar um SDK do iOS gerado pelo API Gateway para uma API REST em um aplicativo Objective-C ou Swift para chamar a API subjacente. Usaremos a [API SimpleCalc](simple-calc-lambda-api.md) como exemplo para ilustrar os tópicos a seguir:
+ Como instalar os componentes necessários do SDK Móvel da AWS no seu projeto Xcode
+ Como criar o objeto de cliente da API antes de chamar os métodos da API
+ Como chamar os métodos de API por meio dos métodos do SDK correspondentes no objeto de cliente da API
+ Como preparar uma entrada de método e analisar seu resultado usando as classes de modelo correspondentes do SDK

**Topics**
+ [

## Usar o SDK do iOS (Objective-C) gerado para chamar a API
](#how-to-use-sdk-ios-objc)
+ [

## Usar o SDK do iOS (Swift) gerado para chamar a API
](#how-to-generate-sdk-ios-swift)

## Usar o SDK do iOS (Objective-C) gerado para chamar a API
Usar o SDK do iOS (Objective-C) gerado para chamar a API

Antes de iniciar o procedimento a seguir, você deve concluir as etapas em [Gerar SDKs para APIs REST no API Gateway](how-to-generate-sdk.md) para o iOS no Objective-C e fazer download do arquivo .zip do SDK gerado.

### Instalar o SDK Móvel da AWS e um SDK do iOS gerado pelo API Gateway em um projeto Objective-C


O procedimento a seguir descreve como instalar o SDK.

**Para instalar e usar um SDK do iOS gerado pelo API Gateway no Objective-C**

1. Extraia o conteúdo do arquivo .zip gerado pelo API Gateway que você baixou anteriormente. Usando a [API SimpleCalc](simple-calc-lambda-api.md), você pode querer renomear a pasta do SDK descompactada para algo como **sdk\$1objc\$1simple\$1calc**. Nesta pasta do SDK, há um arquivo `README.md` file e um arquivo `Podfile`. O arquivo `README.md` contém as instruções para instalar e usar o SDK. Este tutorial fornece detalhes sobre essas instruções. A instalação utiliza o [CocoaPods](https://cocoapods.org) para importar as bibliotecas necessárias do API Gateway e outros componentes dependentes do SDK móvel da AWS. Você deve atualizar o `Podfile` para importar os SDKs para o projeto Xcode rápida do seu aplicativo. A pasta do SDK não arquivada também contém uma pasta `generated-src`, que contém o código-fonte do SDK gerado da sua API.

1. Inicie o Xcode e crie um novo projeto Objective-C do iOS. Anote o destino do projeto. Você precisará defini-lo no `Podfile`.

      
![\[Encontre o destino no Xcode.\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-find-target.png)

1. Para importar o AWS Mobile SDK for iOS no projeto Xcode usando o CocoaPods, faça o seguinte:

   1. Instale o CocoaPods executando o seguinte comando em uma janela de terminal:

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

   1. Copie o arquivo `Podfile` da pasta do SDK extraído no mesmo diretório que contém seu arquivo de projeto Xcode. Substitua o seguinte bloco:

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

      com o nome de destino do seu projeto: 

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

      Se o seu projeto Xcode já contive um arquivo chamado `Podfile`, adicione a seguinte linha de código a ele:

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

   1. Abra uma janela de terminal e execute o seguinte comando:

      ```
      pod install
      ```

      Isso instala o componente do API Gateway e outros componentes dependentes do SDK Móvel da AWS.

   1. Feche o projeto Xcode e abra o arquivo `.xcworkspace` para reiniciar o Xcode.

   1. Adicione todos os arquivos `.h` e `.m` do diretório `generated-src` do SDK extraído ao seu projeto Xcode.

         
![\[Os arquivos .h e .m estão na pasta generated-src\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-add-sdk-src.png)

   Para importar o AWS Mobile SDK for iOS Objective-C no seu projeto, fazendo download explicitamente do SDK Móvel da AWS ou usando o [Carthage](https://github.com/Carthage/Carthage#installing-carthage), siga as instruções no arquivo *README.md*. Certifique-se de usar apenas uma dessas opções para importar o SDK Móvel da AWS.

### Chamar métodos de API usando o SDK do iOS gerado pelo API Gateway em um projeto Objective-C


Quando você gerou o SDK com o prefixo de `SIMPLE_CALC` para essa [API SimpleCalc](simple-calc-lambda-api.md) com dois modelos para a entrada (`Input`) e a saída (`Result`) dos métodos, no SDK, a classe de cliente de API resultante torna-se `SIMPLE_CALCSimpleCalcClient` e as classes de dados correspondentes são `SIMPLE_CALCInput` e `SIMPLE_CALCResult`, respectivamente. As solicitações e respostas da API são mapeadas para os métodos do SDK, da seguinte maneira:
+ A solicitação de API de

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

  torna-se o método SDK de

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

  A propriedade `AWSTask.result` é do tipo `SIMPLE_CALCResult`, se o modelo `Result` foi adicionado à resposta do método. Caso contrário, a propriedade será do tipo `NSDictionary`.
+ Essa solicitação de API de

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

  torna-se o método SDK de

  ```
  (AWSTask *)rootPost:(SIMPLE_CALCInput *)body
  ```
+ A solicitação de API de

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

  torna-se o método SDK de

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

O procedimento a seguir descreve como chamar os métodos de API no código-fonte do aplicativo Objective-C; por exemplo, como parte do `viewDidLoad` delegado em um arquivo `ViewController.m`.

**Como chamar a API por meio do SDK do iOS gerado pelo API Gateway**

1. Importe o arquivo de cabeçalho da classe de cliente da API para tornar essa classe chamável no aplicativo:

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

   A instrução `#import` também importa `SIMPLE_CALCInput.h` e `SIMPLE_CALCResult.h` para as duas classes de modelo.

1. Instancie a classe de cliente da API:

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

   Para usar o Amazon Cognito com a API, defina a propriedade `defaultServiceConfiguration` no objeto `AWSServiceManager` padrão, conforme mostrado a seguir, antes de chamar o método `defaultClient` para criar o objeto de cliente da API (mostrado no exemplo 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. Chame o método `GET /?a=1&b=2&op=+` para realizar `1+2`:

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

   em que a função auxiliar `handleApiResponse:task` formata o resultado como uma string a ser exibida em um 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;
   }
   ```

   A exibição resultante é `1 + 2 = 3`.

1. Chame a carga `POST /` para realizar `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;
       }];
   ```

   A exibição resultante é `1 - 2 = -1`.

1. Chame`GET /{a}/{b}/{op}` para realizar `1/2`:

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

   A exibição resultante é `1 div 2 = 0.5`. Aqui, `div` é usado no lugar de `/` porque a [função do Lambda simples](simple-calc-nodejs-lambda-function.md) no backend não manuseia variáveis de caminho codificadas por URL.

## Usar o SDK do iOS (Swift) gerado para chamar a API
Usar o SDK do iOS (Swift) gerado para chamar a API

Antes de iniciar o procedimento a seguir, você deve concluir as etapas em [Gerar SDKs para APIs REST no API Gateway](how-to-generate-sdk.md) para o iOS no Swift e fazer download do arquivo .zip do SDK gerado.

**Topics**
+ [

### Instalar o SDK móvel da AWS e o SDK gerado pelo API Gateway em um projeto Swift
](#use-sdk-ios-swift-install-sdk)
+ [

### Chamar métodos de API por meio do SDK do iOS gerado pelo API Gateway em um projeto Swift
](#use-sdk-ios-swift-call-api)

### Instalar o SDK móvel da AWS e o SDK gerado pelo API Gateway em um projeto Swift


O procedimento a seguir descreve como instalar o SDK.

**Para instalar e usar um SDK do iOS gerado pelo API Gateway no Swift**

1. Extraia o conteúdo do arquivo .zip gerado pelo API Gateway que você baixou anteriormente. Usando a [API SimpleCalc](simple-calc-lambda-api.md), você pode querer renomear a pasta do SDK descompactada para algo como **sdk\$1swift\$1simple\$1calc**. Nesta pasta do SDK, há um arquivo `README.md` file e um arquivo `Podfile`. O arquivo `README.md` contém as instruções para instalar e usar o SDK. Este tutorial fornece detalhes sobre essas instruções. A instalação utiliza o [CocoaPods](https://cocoapods.org) para importar os componentes necessários do SDK Móvel da AWS. Você deve atualizar o `Podfile` para importar os SDKs para o projeto Xcode rápida do seu aplicativo Swift. A pasta do SDK não arquivada também contém uma pasta `generated-src`, que contém o código-fonte do SDK gerado da sua API.

1. Inicie o Xcode e crie um novo projeto Swift do iOS. Anote o destino do projeto. Você precisará defini-lo no `Podfile`.

      
![\[Encontre o destino no Xcode.\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-find-target.png)

1. Para importar os componentes necessários do SDK Móvel da AWS no projeto Xcode usando o CocoaPods, faça o seguinte:

   1. Se o CocoaPods não estiver instalado, instale-o executando o seguinte comando em uma janela de terminal:

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

   1. Copie o arquivo `Podfile` da pasta do SDK extraído no mesmo diretório que contém seu arquivo de projeto Xcode. Substitua o seguinte bloco:

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

      pelo nome de destino do seu projeto, conforme mostrado: 

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

      Se o seu projeto Xcode já contiver um `Podfile` com o destino correto, basta adicionar a seguinte linha de código ao loop `do ... end`:

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

   1. Abra uma janela de terminal e execute o seguinte comando no diretório do aplicativo:

      ```
      pod install
      ```

      Isso instala o componente do API Gateway e quaisquer componentes dependentes do SDK Móvel da AWS no projeto do aplicativo.

   1. Feche o projeto Xcode e abra o arquivo `*.xcworkspace` para reiniciar o Xcode.

   1. Adicione todos os arquivos de cabeçalho do SDK (`.h`) e arquivos de código-fonte Swift (`.swift`) do diretório extraído `generated-src` para seu projeto Xcode.

         
![\[Os arquivos .h e .swift estão na pasta generated-src\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-add-sdk-src.png)

   1. Para permitir a chamada de bibliotecas Objective-C do SDK Móvel da AWS a partir do seu projeto de código Swift, defina o caminho do arquivo `Bridging_Header.h` na propriedade **Objective-C Bridging Header (Cabeçalho ponte Objective-C)**, na definição **Swift Compiler - General (Compilador Swift - Geral)** da configuração do projeto Xcode: 

         
![\[Defina o caminho do arquivo Bridging_header.h na configuração Swift Compiler - General.\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-bridging-header.png)
**dica**  
Você pode digitar **bridging** na caixa de pesquisa do Xcode para localizar a propriedade **Objective-C Bridging Header (Cabeçalho ponte Objective-C)**.

   1. Construa o projeto Xcode para verificar se ele está corretamente configurado antes de prosseguir. Se o seu Xcode usar uma versão mais recente do Swift do que a versão com suporte para o SDK Móvel da AWS, você receberá erros do compilador Swift. Nesse caso, defina a propriedade **Use Legacy Swift Language Version (Usar versão de linguagem do Swift legado)** para **Yes (Sim)**, na configuração **Swift Compiler - Version (Compilador Swift - Versão)**:

         
![\[Defina a propriedade Legacy Swift Language Version como Yes.\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-legacy-swift-version.png)

   Para importar o AWS Mobile SDK for iOS em Swift no seu projeto fazendo download explicitamente do AWS Mobile SDK ou usando o [Carthage](https://github.com/Carthage/Carthage#installing-carthage), siga as instruções no arquivo `README.md` que acompanha o pacote do SDK. Certifique-se de usar apenas uma dessas opções para importar o SDK Móvel da AWS.

### Chamar métodos de API por meio do SDK do iOS gerado pelo API Gateway em um projeto Swift


Quando você gerou o SDK com o prefixo de `SIMPLE_CALC` para essa [API SimpleCalc](simple-calc-lambda-api.md) com dois modelos para descrever a entrada (`Input`) e a saída (`Result`) das solicitações e respostas da API, no SDK, a classe de cliente de API resultante torna-se `SIMPLE_CALCSimpleCalcClient` e as classes de dados correspondentes são `SIMPLE_CALCInput` e `SIMPLE_CALCResult`, respectivamente. As solicitações e respostas da API são mapeadas para os métodos do SDK, da seguinte maneira: 
+ A solicitação de API de

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

  torna-se o método SDK de

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

  A propriedade `AWSTask.result` é do tipo `SIMPLE_CALCResult`, se o modelo `Result` foi adicionado à resposta do método. Caso contrário, ela será do tipo `NSDictionary`.
+ Essa solicitação de API de

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

  torna-se o método SDK de

  ```
  public func rootPost(body: SIMPLE_CALCInput) -> AWSTask
  ```
+ A solicitação de API de

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

  torna-se o método SDK de

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

O procedimento a seguir descreve como chamar os métodos de API no código-fonte do aplicativo Swift; por exemplo, como parte do `viewDidLoad()` delegado em um arquivo `ViewController.m`.

**Como chamar a API por meio do SDK do iOS gerado pelo API Gateway**

1. Instancie a classe de cliente da API:

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

   Para usar o Amazon Cognito com a API, defina uma configuração de serviço da AWS padrão (mostrada a seguir) antes de obter o 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. Chame o método `GET /?a=1&b=2&op=+` para realizar `1+2`:

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

   em que a função auxiliar `self.showResult(task)` imprime o resultado ou o erro no console; por exemplo: 

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

   Em um aplicativo de produção, você pode exibir o resultado ou erro em um campo de texto. A exibição resultante é `1 + 2 = 3`.

1. Chame a carga `POST /` para realizar `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
   }
   ```

   A exibição resultante é `1 - 2 = -1`.

1. Chame`GET /{a}/{b}/{op}` para realizar `1/2`:

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

   A exibição resultante é `1 div 2 = 0.5`. Aqui, `div` é usado no lugar de `/` porque a [função do Lambda simples](simple-calc-nodejs-lambda-function.md) no backend não manuseia variáveis de caminho codificadas por URL.