Configurar um projeto do Xcode

Depois de ativar o faturamento e criar uma chave de API, estará tudo pronto para configurar o projeto Xcode usado para desenvolver seu app.

As notas da versão estão disponíveis para cada versão.

Etapa 1: instalar o software necessário

Para criar um projeto usando o SDK do Places para iOS, você precisa de:

  • Xcode versão 15.0 ou mais recente

Etapa 2: criar o projeto Xcode e instalar o SDK do Places para iOS

Gerenciador de pacotes do Swift

O SDK do Places para iOS pode ser instalado usando o Gerenciador de pacotes do Swift. Para adicionar o SDK, verifique se você removeu todas as dependências atuais do SDK do Places para iOS.

Para adicionar o SDK a um projeto novo ou existente, siga estas etapas:

  1. Abra o Xcode project ou workspace e acesse File > Add Package Dependencies.
  2. Digite https://github.com/googlemaps/ios-places-sdk como o URL, pressione Enter para extrair o pacote e clique em "Adicionar pacote".
  3. Para instalar um version específico, defina o campo Regra de dependência como uma das opções baseadas em versão. Para novos projetos, recomendamos especificar a versão mais recente e usar a opção "Versão exata". Quando terminar, clique em "Adicionar pacote".
  4. Na janela Choose Package Products, verifique se GooglePlaces vai ser adicionado ao destino main designado. Quando terminar, clique em "Adicionar pacote".
  5. Para verificar a instalação, navegue até o painel General do destino. Em Frameworks, bibliotecas e conteúdo incorporado, você encontra os pacotes instalados. Você também pode ver a seção "Dependências de pacotes" do "Navegador do projeto" para verificar o pacote e a versão dele.

Para atualizar o package de um projeto existente, siga estas etapas:

  1. Se você estiver fazendo upgrade de uma versão anterior à 9.0.0, precisará remover as seguintes dependências: GoogleMapsBase, GoogleMapsCore e GoogleMapsM4B após o upgrade. Não remova a dependência de GoogleMaps. Para mais informações, consulte as Notas de lançamento da versão 9.0.0.

    Nas configurações do projeto do Xcode, encontre Frameworks, bibliotecas e conteúdo incorporado. Use o sinal de menos(-) para remover o seguinte framework:

    • GoogleMapsBase (apenas para upgrades de versões anteriores à 9.0.0)
    • GoogleMapsCore (apenas para upgrades de versões anteriores à 9.0.0)
    • GoogleMapsM4B (apenas para upgrades de versões anteriores à 9.0.0)
  2. No Xcode, acesse "File > Packages > Update To latest Package Versions".
  3. Para verificar a instalação, vá para a seção Dependências de pacotes do Navegador do projeto para verificar o pacote e a versão dele.

Para remover as dependências atuais do SDK do Places para iOS adicionadas usando CocoaPods, siga estas etapas:

  1. Feche o espaço de trabalho do Xcode. Abra o terminal e execute o seguinte comando:
    sudo gem install cocoapods-deintegrate cocoapods-clean 
    pod deintegrate 
    pod cache clean --all
  2. Remova Podfile, Podfile.resolved e workspace do Xcode se eles não forem usados para outra finalidade que não seja CocoaPods.

Para remover manualmente o SDK do Places para iOS instalado, siga estas etapas:
  1. Nas configurações do projeto do Xcode, encontre Frameworks, bibliotecas e conteúdo incorporado. Use o sinal de menos(-) para remover o seguinte framework:
    • GooglePlaces.xcframework
  2. No diretório de nível superior do seu projeto Xcode, remova o pacote GooglePlaces.

CocoaPods

O SDK do Places para iOS está disponível como um pod do CocoaPod, GooglePlaces, que contém todos os recursos do Places.

O CocoaPods é um gerenciador de dependências de código aberto para projetos Cocoa em Swift e Objective-C. Se você ainda não tem a ferramenta CocoaPods, instale-a no macOS executando o comando a seguir no terminal. Para mais detalhes, consulte o Guia de primeiros passos do CocoaPods (em inglês).

sudo gem install cocoapods

Crie um Podfile para o SDK do Places para iOS e instale o SDK e as dependências dele:

  1. Se você ainda não tiver um projeto Xcode, crie um agora e salve-o no computador local. Se você tem pouca experiência com desenvolvimento para iOS, crie um novo projeto e selecione o Modelo de app iOS.
  2. Crie um arquivo chamado Podfile no seu diretório do projeto para definir as dependências.
  3. Edite o Podfile e adicione as dependências com as versions. Este é um exemplo que especifica o nome do destino do aplicativo e o nome do pod GooglePlaces:
    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '15.0'
    
    target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
      pod 'GooglePlaces', '8.3.0'
    end
    
    Execute pod outdated regularmente para detectar quando houver uma versão mais recente e garantir que você esteja sempre atualizado.
  4. Salve o Podfile.
  5. Abra um terminal e acesse o diretório que contém o Podfile:

    cd <path-to-project>
  6. Execute o comando pod install. Isso instalará as APIs especificadas no Podfile e as respectivas dependências.

    pod install
  7. Feche o Xcode e clique duas vezes no arquivo .xcworkspace do projeto para iniciar o programa. Depois disso, é preciso usar o arquivo .xcworkspace para abrir o projeto.

Para atualizar a API de um projeto existente, siga estas etapas:

  1. Abra um terminal e acesse o diretório do projeto que contém o Podfile.
  2. Execute o comando pod update. Isso vai atualizar todas as APIs especificadas no Podfile para a versão mais recente.

Instalação manual

Este guia mostra como adicionar manualmente o XCFramework que contém o SDK do Places para iOS ao seu projeto e como definir as configurações de build no Xcode. Um XCFramework é um pacote binário que pode ser usado em várias plataformas, incluindo máquinas que usam o Apple Silicon.

  1. Faça o download dos seguintes arquivos binários e de recursos do SDK:
  2. Extraia os arquivos para acessar o XCFramework e os recursos.
  3. Inicialize o Xcode e abra ou crie um projeto. Se você tem pouca experiência com desenvolvimento para iOS, crie um novo projeto e selecione o Modelo de app iOS.
  4. Remova todas as versões anteriores do Maps do projeto.
  5. Abra a guia Geral. Arraste o XCFramework a seguir para seu projeto em Frameworks, bibliotecas e conteúdo incorporado. Selecione Não incorporar:
    • GooglePlaces.xcframework
  6. Arraste GooglePlaces.bundle dos GooglePlacesResources transferidos por download
  7. Copie o GooglePlaces.bundle do GooglePlacesResources salvo no diretório de nível superior do projeto do Xcode. Selecione Copy items into destination group's folder quando solicitado.
  8. Selecione o projeto no Navegador de projetos e escolha o destino do aplicativo.
  9. Abra a guia Fases de compilação. Em Vincular binário a bibliotecas, adicione os seguintes frameworks e bibliotecas:
    • CoreGraphics.framework
    • CoreLocation.framework
    • libc++.tbd
    • libz.tbd
    • QuartzCore.framework
    • UIKit.framework
  10. Escolha seu projeto, em vez de um destino específico, e abra a guia Build Settings. Na seção Vinculação - Geral -> Outras sinalizações do vinculador, adicione -ObjC a "Depurar" e "Liberar". Se essas configurações não estiverem visíveis, mude o filtro na barra Build Settings de Basic para All.

GooglePlacesSwift

Você pode instalar o SDK GooglePlacesSwift (pré-lançamento) usando o Gerenciador de pacotes do Swift, o CocoaPods e manualmente. As etapas de instalação em todos os processos são iguais às descritas no SDK do Places para iOS, com as seguintes diferenças:

  • O Xcode 15.3 é obrigatório.
  • No Gerenciador de pacotes do Swift, também substitua as instâncias GooglePlaces por GooglePlacesSwift. Isso inclui instruções de importação.
  • Atualize o número da versão para 0.1.0.
  • Substitua as instâncias de https://github.com/googlemaps/ios-places-sdk por https://github.com/googlemaps/ios-places-swift-sdk.
  • Se estiver fazendo a instalação manualmente, você precisará adicionar o XCFramework GooglePlacesSwift e os arquivos de recursos, além do XCFramework e dos arquivos de recursos GooglePlaces.

Por exemplo, se estiver usando CocoaPods, o Podfile editado será o seguinte:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '15.3'

target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
  pod 'GooglePlacesSwift', '0.1.0'
end

Etapa 3: inspecionar o arquivo de manifesto de privacidade da Apple

A Apple exige detalhes de privacidade para apps na App Store. Acesse a página de detalhes de privacidade da App Store da Apple para ver atualizações e mais informações.

O arquivo de Manifesto de privacidade da Apple está incluído no pacote de recursos do SDK. Para verificar se o arquivo de manifesto de privacidade foi incluído e inspecionar o conteúdo dele, crie um arquivo do app e gere um relatório de privacidade com base nele.

Etapa 4: adicionar a chave de API ao app

Nos exemplos a seguir, substitua YOUR_API_KEY pela chave de API.

Swift

Inclua sua chave de API ao AppDelegate.swift da seguinte maneira:

  • Adicione a seguinte instrução de importação:
    import GooglePlaces
  • Adicione o seguinte ao método application(_:didFinishLaunchingWithOptions:), substituindo YOUR_API_KEY pela chave de API:
    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

Objective-C

Inclua sua chave de API ao AppDelegate.m da seguinte maneira:

  • Adicione a seguinte instrução de importação:
    @import GooglePlaces;
  • Adicione o seguinte ao método application:didFinishLaunchingWithOptions:, substituindo YOUR_API_KEY pela chave de API:
    [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

GooglePlacesSwift

Inclua sua chave de API ao AppDelegate.swift da seguinte maneira:

  • Adicione a seguinte instrução de importação:
    import GooglePlacesSwift
  • Adicione o seguinte ao método application(_:didFinishLaunchingWithOptions:), substituindo YOUR_API_KEY pela chave de API:
    PlacesClient.shared.provideAPIKey("YOUR_API_KEY")

Etapa 5: começar a escrever o código

Os exemplos de código a seguir demonstram como acessar o local atual.

Swift

  import GooglePlaces
  import UIKit

  class GetStartedViewController : UIViewController {

    // Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
    @IBOutlet private var nameLabel: UILabel!
    @IBOutlet private var addressLabel: UILabel!

    private var placesClient: GMSPlacesClient!

    override func viewDidLoad() {
      super.viewDidLoad()
      placesClient = GMSPlacesClient.shared()
    }

    // Add a UIButton in Interface Builder, and connect the action to this function.
    @IBAction func getCurrentPlace(_ sender: UIButton) {
      let placeFields: GMSPlaceField = [.name, .formattedAddress]
      placesClient.findPlaceLikelihoodsFromCurrentLocation(withPlaceFields: placeFields) { [weak self] (placeLikelihoods, error) in
        guard let strongSelf = self else {
          return
        }

        guard error == nil else {
          print("Current place error: \(error?.localizedDescription ?? "")")
          return
        }

        guard let place = placeLikelihoods?.first?.place else {
          strongSelf.nameLabel.text = "No current place"
          strongSelf.addressLabel.text = ""
          return
        }

        strongSelf.nameLabel.text = place.name
        strongSelf.addressLabel.text = place.formattedAddress
      }
    }
  }

  

Objective-C

  #import "GetStartedViewController.h"
  @import GooglePlaces;

  @interface GetStartedViewController ()
  // Add a pair of UILabels in Interface Builder and connect the outlets to these variables
  @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
  @property (weak, nonatomic) IBOutlet UILabel *addressLabel;
  @end

  @implementation GetStartedViewController {
    GMSPlacesClient *_placesClient;
  }

  - (void)viewDidLoad {
    [super viewDidLoad];
    _placesClient = [GMSPlacesClient sharedClient];
  }

  // Add a pair of UILabels in Interface Builder and connect the outlets to these variables.
  - (IBAction)getCurrentPlace:(UIButton *)sender {
    GMSPlaceField placeFields = (GMSPlaceFieldName | GMSPlaceFieldFormattedAddress);

    __weak typeof(self) weakSelf = self;
    [_placesClient findPlaceLikelihoodsFromCurrentLocationWithPlaceFields:placeFields callback:^(NSArray<GMSPlaceLikelihood *> * _Nullable likelihoods, NSError * _Nullable error) {
      __typeof__(self) strongSelf = weakSelf;
      if (strongSelf == nil) {
        return;
      }

      if (error != nil) {
        NSLog(@"An error occurred %@", [error localizedDescription]);
        return;
      }

      GMSPlace *place = likelihoods.firstObject.place;
      if (place == nil) {
        strongSelf.nameLabel.text = @"No current place";
        strongSelf.addressLabel.text = @"";
        return;
      }

      strongSelf.nameLabel.text = place.name;
      strongSelf.addressLabel.text = place.formattedAddress;
    }];
  }

  @end
  

GooglePlacesSwift

  struct ContentView: View {
    @State var place: Place?

    var body: some View {
      Button("Get Place") {
        // A hotel in Saigon with an attribution.
        let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs"
        let fetchPlaceRequest = FetchPlaceRequest(
          placeID: placeID,
          placeProperties: [.displayName, .formattedAddress]
        )
        Task {
          switch await placesClient.fetchPlace(with: fetchPlaceRequest) {
          case .success(let place):
            self.place = place
          case .failure(let placesError):
            // Handle error
        }
      Text(swiftPlace?.displayName ?? "No place yet")
        .padding()
      Text(swiftPlace?.formattedAddress ?? "No place yet")
        .padding()
    }
  }
  

Próximas etapas

Depois que o projeto estiver configurado, explore os apps de exemplo (link em inglês).