Primeiros passos com o SDK do Places para iOS (Objective-C)

1. Antes de começar

Antes de começar a programar, há alguns pré-requisitos que você precisará configurar.

Xcode

Este tutorial usa a ferramenta Xcode do Apple, junto com a linguagem Objective-C, para criar um aplicativo iOS simples que é executado em um emulador. Você não precisa de um dispositivo físico. Acesse o Xcode em https://developer.apple.com/xcode/.

CocoaPods

O SDK do Places para iOS está disponível como um pod do CocoaPods. O CocoaPods é uma ferramenta de gerenciamento de dependências de código aberto para projetos Swift e Objective-C. Se você ainda não tiver essa ferramenta, será necessário instalá-la antes de continuar. Ele pode ser instalado pelo terminal da seguinte maneira:

sudo gem install cocoapods

Para mais detalhes sobre o CocoaPods, consulte o Guia de primeiros passos do CocoaPods (em inglês).

Como instalar o SDK

Para instalar o SDK, crie um Podfile no diretório do projeto que o CocoaPods usará para fazer o download e configurar as dependências necessárias. A maneira mais fácil de fazer isso é criar um novo projeto no Xcode, adicionar um Podfile a ele e instalar os pods.

Abra o Xcode e a tela "Bem-vindo ao Xcode' será exibida. Selecione "Criar um novo projeto do Xcode"

4f1ecee473937c7b.png

Na próxima tela, você precisará fornecer um modelo para o novo projeto. Selecione "Single View Application' for iOS" e pressione "Next'

Quando solicitado, você pode escolher o nome que quiser, mas não deixe de anotar o identificador do pacote. Você precisará dele mais tarde.

72fbf25cb2db22ad.png

Pressione "Next' e o projeto será criado para você. Anote o diretório em que ele foi criado. Feche o Xcode e acesse o diretório usando o Terminal.

Usando o Terminal, digite o seguinte comando:

pod init

Será criado um arquivo chamado Podfile. Edite-o para adicionar um pod ao Google Maps desta forma:

target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end

Salve e feche o Xcode. Feche o projeto, porque você editará o projeto subjacente na próxima etapa. Quando um arquivo de projeto for concluído, um arquivo diferente será aberto, e é muito comum um desenvolvedor se confundir com tudo isso se não tiver fechado o Xcode. Em um terminal, acesse o diretório do projeto e execute "pod install&#39" da seguinte maneira:

789c5bc62817f68a.png

Quando terminar, os pods serão instalados e um novo arquivo .xcworkspace será criado. Use isso no projeto de agora em diante. Mas, antes de codificar, você só precisa de uma chave de API.

2. Acessar sua chave de API

Para a etapa a seguir, ative o SDK do Maps para iOS.

Configurar a Plataforma Google Maps

Caso você ainda não tenha uma conta do Google Cloud Platform e um projeto com faturamento ativado, veja como criá-los no guia da Plataforma Google Maps.

  1. No Console do Cloud, clique no menu suspenso do projeto e selecione o projeto que você quer usar neste codelab.

  1. Ative as APIs e os SDKs da Plataforma Google Maps necessários para este codelab no Google Cloud Marketplace. Para fazer isso, siga as etapas descritas neste vídeo ou nesta documentação.
  2. Gere uma chave de API na página Credenciais do Console do Cloud. Siga as etapas indicadas neste vídeo ou nesta documentação. Todas as solicitações feitas à Plataforma Google Maps exigem uma chave de API.

3. Criar o app da API Places

Agora que você criou um projeto de console e ativou a API Places nele, está recebendo uma chave de API, e está tudo pronto para começar a programar seu primeiro app da API Places.

Quando você instalou os arquivos do pod, um novo arquivo .xcworkspace foi criado. Para abrir, clique duas vezes nele.

19d62f34c08e645c.png

Você verá uma nova pasta chamada "Pods' no Project Explorer. Se isso funcionar, você verá uma pasta do Google Maps com os frameworks.

8844d861f64c61aa.png

4. Edite o arquivo Info.plist.

Quando você executar o aplicativo pela primeira vez, o iOS fornecerá uma caixa de diálogo solicitando que o usuário conceda permissão para acessar os serviços de localização. Essa caixa de diálogo fornecerá uma string que você definirá e a colocará no arquivo Info.plist. Se essa string não estiver presente, a caixa de diálogo não será exibida e o app não funcionará.

Você encontra o arquivo Info.plist no explorador de projetos aqui:

c224c920ab3f1ef.png

Selecione-o para ver o editor do plist.

859ca56f3b19da5.png

Passe o cursor sobre qualquer um dos elementos para ver um ícone "+" e o seguinte. Pressione-a para ver uma nova entrada. Insira o valor "NSLocationAlwaysUsageDescription' nesta caixa.

9fb225d6f5508794.png

Pressione "Enter" para adicionar a nova chave. Em seguida, clique duas vezes na coluna "Valor" dessa chave e adicione uma string:

5aefeb184187aa58.png

Para saber mais sobre essa string, consulte a documentação do desenvolvedor da Apple aqui.

5. Editar o delegado do seu app

No explorador de projetos, localize e abra AppDelegate.m. Você o usará para adicionar sua chave de API.

Na parte superior do arquivo, adicione o código abaixo da linha #import:

@import GoogleMaps;

Em seguida, na função didFinishLaunchingWithOptions:, adicione o seguinte sobre a linha "return YES':

[GMSServices provideAPIKey:@"<Add your API Key>"];

Use a chave de API que você gerou anteriormente.

6. Editar arquivo do storyboard

No explorador de projetos, abra o arquivo Main.storyboard. Verifique se a barra lateral está ativa pressionando o botão da barra lateral no canto superior direito.

352af28b970d9e2.png.

Em seguida, na parte inferior da barra lateral, localize o controle de rótulo. Para isso, verifique se a biblioteca de objetos está selecionada.

adec7051ae949531.png

Na cena do controlador de visualização à esquerda, verifique se a opção "View'" está selecionada:

e4827b92b5861e3e.png

Em seguida, arraste e solte sete rótulos na visualização. Organize-as conforme mostrado aqui. Arraste os tamanhos para que correspondam ao que é exibido. Para editar o texto da etiqueta, clique nela duas vezes e digite o valor exigido:

f8a9457772358069.png

Para o rótulo mais abaixo (o que for muito grande), acesse o editor de propriedades e verifique se ele tem nenhuma linha (o padrão é 1). Isso permitirá que ele renderize várias linhas.

a4abacf00d8888fe.png

7. Crie saídas para os valores

Para os três rótulos "value', você precisará criar uma saída. Isso permitirá que você mude os valores usando o código. Para fazer isso, primeiro você precisa ativar o editor assistente. Para fazer isso, primeiro feche a barra lateral de propriedades clicando no botão para removê-la. Esse botão foi exibido na etapa anterior.

Em seguida, selecione o botão do Assistente: é o círculo duplo exibido aqui:

e92dcc4ceea20a51.png

Verifique se ele está renderizando o arquivo ViewController.h. Se não estiver, faça isso usando o editor na parte superior da janela do assistente:

d42f0fcc18b84703.png

Em seguida, ao manter a tecla CTRL pressionada, arraste cada rótulo e solte-o na linha @interface do arquivo ViewController.h do assistente. Uma caixa de diálogo será exibida perguntando qual tipo de conexão você deseja fazer:

a44b7888ed0f62b.png

Verifique se as configurações estão como mostradas (Connection: Outlet; Type: UILabel; Storage: Weak) e dê um nome a cada uma delas. Para os fins deste codelab, eu chamei os rótulos de longitude, latitude e altitude de lblLongitude, lblLatitude e lblAltidude, respectivamente. Arraste também o marcador grande de baixo para cima e o nomeie como lblPlaces.

Quando estiver tudo pronto, o arquivo ViewController.h terá esta aparência:

#import <UIKit/UIKit.h>
@import GoogleMaps;

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;

@end

8. Editar o arquivo principal para locais e APIs de cliente do Google

Antes das etapas finais, em que você cria o app para usar a API Places, é necessário configurar mais algumas variáveis no arquivo principal (ViewController.h). Estes são o Gerenciador de locais principais e um objeto de local principal:

@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;

Você também precisará de um cliente de API do Google:

@property GMSPlacesClient *placesClient;

Por fim, você precisará atualizar o arquivo principal para que a classe implemente o CLLocationManagerDelegate:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

Quando terminar, o arquivo principal ficará assim:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>


@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;

@property GMSPlacesClient *placesClient;
@end

9. Editar seu controlador de visualização

A primeira etapa é editar a função viewDoesLoad para inicializar o Gerenciador de locais, solicitar a autorização do usuário para acessar o local e, por fim, iniciar o gerenciador para que ele rastreie o local atual. Você também inicializará o cliente da API do Google Places.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc]init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization];
        // Or [self.locationManager requestWhenInUseAuthorization];
    }
    [self.locationManager startUpdatingLocation];
    
    self.locationManager.delegate = self;
    self.location = [[CLLocation alloc] init];
    self.placesClient = [GMSPlacesClient sharedClient];
}

10. Gerenciar atualizações de localização

O gerente de localização chamará o controlador de visualização com atualizações de local chamando a função didUpdateLocations. Você precisará adicioná-lo ao seu ViewController.m. A função é semelhante a:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    // Enter code here
}

Essa função precisa fazer várias coisas.

Primeiro, ele armazena em cache o local com o último recebido:

self.location = locations.lastObject;

Em seguida, os três rótulos de latitude, longitude e altitude precisam ser atualizados:

self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];

self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];

self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];

Em seguida, chame a API Places usando o cliente do Places. Para fazer isso, especifique a função de callback, que receberá a lista de probabilidades de lugar. A API Places determina a probabilidade de você estar em um lugar específico com base na sua localização. Ele retorna o nome dos possíveis lugares, junto com um valor entre 0 e 1, contendo a probabilidade de você estar naquele lugar.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

Em seguida, implemente o callback. Isso vai iterar a lista de probabilidades para adicionar lugares e probabilidades para eles.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

  if (error != nil) {
    NSLog(@"Current Place error %@", [error localizedDescription]);
    return;
  }
  NSMutableString *strPlaces = [NSMutableString stringWithString:@""];

  for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods) {
    GMSPlace* place = likelihood.place;
    NSLog(@"Current Place name %@ at likelihood %g", place.name,
            likelihood.likelihood);
    NSLog(@"Current Place address %@", place.formattedAddress);
    NSLog(@"Current Place attributions %@", place.attributions);
    NSLog(@"Current PlaceID %@", place.placeID);
    [strPlaces appendString:place.name];
    [strPlaces appendString:@" "];
    [strPlaces appendFormat:@"%g",likelihood.likelihood];
    [strPlaces appendString:@"\n"];
  }
  self.lblPlaces.text = strPlaces;
}];

Quando terminar, a função didUpdateLocations ficará assim:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    self.location = locations.lastObject;
    self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
    self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
    self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
    
    NSLog(@"%@", self.location.description);
    
    [self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

        if (error != nil) {
            NSLog(@"Current Place error %@", [error localizedDescription]);
            return;
        }
        NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
        
        for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods)  
        {
            GMSPlace* place = likelihood.place;
            NSLog(@"Current Place name %@ at likelihood %g", place.name, likelihood.likelihood);
            NSLog(@"Current Place address %@", place.formattedAddress);
            NSLog(@"Current Place attributions %@", place.attributions);
            NSLog(@"Current PlaceID %@", place.placeID);
            [strPlaces appendString:place.name];
            [strPlaces appendString:@" "];
            [strPlaces appendFormat:@"%g",likelihood.likelihood];
            [strPlaces appendString:@"\n"];
        }
        self.lblPlaces.text = strPlaces;
    }];
}

Agora está tudo pronto para você executar seu app e testá-lo.

11. Como executar o app no emulador

Para executar o app, use o botão "Run" na barra de título. Isso também permite selecionar o tipo de execução e, como você pode ver, neste teste, I'm em um iPhone 6, usando o emulador.

bbbe0b8820c8a913.png

Quando você pressionar o botão de execução, o app será criado e iniciado. Você verá a solicitação para permitir que o app acesse o local, incluindo a string personalizada especificada anteriormente.

b9bb2ace7e68f186.png

Depois de fazer isso, você verá as atualizações de latitude e longitude. Para mudar o local, selecione o menu "Debug" e escolha um local. Por exemplo, você pode escolher a "Drive da Autoestrada'

dcb1ce091d780f56.png

Ao fazer isso, você verá o local com os respectivos lugares prováveis atualizados, simulando o percurso de autoestrada.

649e3eeb2321ae03.png

Pronto. Você acessou os detalhes do local atual usando a API Google Places no iOS.