Konfigurowanie projektu Xcode

Po włączeniu płatności i utworzeniu klucza interfejsu API możesz skonfigurować projekt Xcode, którego używasz do tworzenia aplikacji.

W przypadku każdej wersji dostępne są informacje o wersji.

Krok 1. Zainstaluj wymagane oprogramowanie

Aby utworzyć projekt za pomocą pakietu Places SDK dla iOS, potrzebne są:

  • Xcode w wersji 15.0 lub nowszej.

Krok 2: utwórz projekt Xcode i zainstaluj pakiet Places SDK dla iOS

Menedżer pakietów Swift

Pakiet Places SDK na iOS możesz zainstalować za pomocą menedżera pakietów Swift. Aby dodać pakiet SDK, upewnij się, że usunięto wszystkie istniejące pakiety SDK Miejsc na potrzeby zależności iOS.

Aby dodać pakiet SDK do nowego lub istniejącego projektu, wykonaj te czynności:

  1. Otwórz plik Xcode project lub workspace i kliknij Plik > Dodaj zależności pakietów.
  2. Wpisz URL https://github.com/googlemaps/ios-places-sdk, naciśnij Enter, by pobrać pakiet, a następnie kliknij „Dodaj pakiet”.
  3. Aby zainstalować określony version, w polu Reguła zależności ustaw jedną z opcji opartych na wersji. W przypadku nowych projektów zalecamy określenie najnowszej wersji i użycie opcji „Dokładna wersja”. Gdy skończysz, kliknij „Dodaj pakiet”.
  4. W oknie Wybierz produkty w pakiecie sprawdź, czy pakiet GooglePlaces zostanie dodany do wyznaczonego miejsca docelowego main. Gdy skończysz, kliknij „Dodaj pakiet”.
  5. Aby sprawdzić instalację, przejdź do panelu General środowiska docelowego. Zainstalowane pakiety powinny być widoczne w sekcji Frameworks, Biblioteki i Umieszczone treści. Możesz też wyświetlić sekcję „Zależności pakietów” w aplikacji „Project Navigator”, aby sprawdzić pakiet i jego wersję.

Aby zaktualizować package w istniejącym projekcie, wykonaj te czynności:

  1. Jeśli przeprowadzasz uaktualnienie z wersji wcześniejszej niż 9.0.0, po przejściu na nową wersję musisz usunąć te zależności: GoogleMapsBase, GoogleMapsCore i GoogleMapsM4B. Nie usuwaj zależności z GoogleMaps. Więcej informacji znajdziesz w informacjach o wersji 9.0.0.

    W ustawieniach konfiguracji projektu Xcode znajdź Frameworks, Libraries, and Embedded Content. Za pomocą znaku minusa(-) usuń tę platformę:

    • GoogleMapsBase (tylko w przypadku uaktualnień z wersji starszych niż 9.0.0)
    • GoogleMapsCore (tylko w przypadku uaktualnień z wersji starszych niż 9.0.0)
    • GoogleMapsM4B (tylko w przypadku uaktualnień z wersji starszych niż 9.0.0)
  2. W Xcode wybierz kolejno „File” (Plik) > Packages (Pakiety) > Update To Last Package Versions (Aktualizuj do najnowszych wersji pakietów).
  3. Aby sprawdzić instalację, przejdź do sekcji Zależności pakietów w Project Navigator i sprawdź pakiet i jego wersję.

Aby usunąć istniejące zależności pakietu Places SDK na iOS dodane za pomocą CocoaPods, wykonaj te czynności:

  1. Zamknij obszar roboczy Xcode. Otwórz terminal i wykonaj to polecenie:
    sudo gem install cocoapods-deintegrate cocoapods-clean 
    pod deintegrate 
    pod cache clean --all
  2. Usuń Podfile, Podfile.resolved i Xcode workspace, jeśli nie używasz ich do niczego innego niż CocoaPods.

Aby usunąć ręcznie zainstalowany pakiet Places SDK na iOS, wykonaj te czynności:
  1. W ustawieniach konfiguracji projektu Xcode znajdź Frameworks, Libraries, and Embedded Content. Za pomocą znaku minusa(-) usuń tę platformę:
    • GooglePlaces.xcframework
  2. Z katalogu najwyższego poziomu projektu Xcode usuń pakiet GooglePlaces.

CocoaPods

Pakiet Places SDK na iOS jest dostępny jako pod CocoaPod (GooglePlaces), który zawiera wszystkie możliwości miejsc.

CocoaPods to menedżer zależności typu open source dla projektów Swift i Objective-C Cocoa. Jeśli nie masz jeszcze narzędzia CocoaPods, zainstaluj je w macOS, uruchamiając z terminala poniższe polecenie. Szczegółowe informacje znajdziesz w przewodniku dla początkujących na temat CocoaPods.

sudo gem install cocoapods

Utwórz obiekt Podfile dla pakietu Places SDK dla iOS i użyj go do zainstalowania pakietu SDK wraz z jego zależnościami:

  1. Jeśli nie masz jeszcze projektu Xcode, utwórz go teraz i zapisz na komputerze lokalnym. Jeśli dopiero zaczynasz programowanie na iOS, utwórz nowy projekt i wybierz szablon aplikacji na iOS.
  2. W katalogu projektu utwórz plik o nazwie Podfile. Ten plik określa zależności Twojego projektu.
  3. Edytuj Podfile i dodaj zależności wraz z ich versions. Oto przykład, który określa nazwę miejsca docelowego aplikacji i nazwę poda 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
    
    Pamiętaj o regularnym uruchamianiu pod outdated, aby wykrywać, kiedy pojawia się nowsza wersja, i mieć pewność, że zawsze korzystasz z najnowszej wersji.
  4. Zapisz Podfile.
  5. Otwórz terminal i przejdź do katalogu zawierającego Podfile:

    cd <path-to-project>
  6. Uruchom polecenie pod install. Spowoduje to zainstalowanie interfejsów API określonych w: Podfile oraz wszelkich zależności, jakie mogą one mieć.

    pod install
  7. Zamknij Xcode, a następnie otwórz (dwukrotnie) plik .xcworkspace swojego projektu, aby uruchomić Xcode. Od tej pory projekt będzie można otwierać tylko za pomocą pliku .xcworkspace.

Aby zaktualizować interfejs API w istniejącym projekcie, wykonaj te czynności:

  1. Otwórz terminal i przejdź do katalogu projektu, w którym znajduje się Podfile.
  2. Uruchom polecenie pod update. Spowoduje to zaktualizowanie do najnowszej wersji wszystkich interfejsów API określonych w: Podfile.

Instalacja ręczna

Z tego przewodnika dowiesz się, jak ręcznie dodać do projektu XCFramework zawierający pakiet Places SDK na iOS i skonfigurować ustawienia kompilacji w Xcode. XCFramework to pakiet binarny, którego można używać na wielu platformach, w tym na maszynach opartych na Apple Silicon.

  1. Pobierz te pliki binarne i zasoby pakietu SDK:
  2. Wyodrębnij pliki, aby uzyskać dostęp do XCFramework i zasobów.
  3. Uruchom Xcode i otwórz istniejący projekt lub utwórz nowy. Jeśli dopiero zaczynasz programować w iOS, utwórz nowy projekt i wybierz szablon aplikacji na iOS.
  4. Usuń z projektu wszystkie pakiety Map z poprzednich wersji.
  5. Otwórz kartę Ogólne. Przeciągnij ten element XCFramework do swojego projektu w sekcji Frameworks, Biblioteki i Umieszczone treści. Pamiętaj, aby wybrać Nie umieszczaj:
    • GooglePlaces.xcframework
  6. Przeciągnij GooglePlaces.bundle z pobranego GooglePlacesResources
  7. Skopiuj pobrany plik GooglePlaces.bundle z GooglePlacesResources do katalogu najwyższego poziomu projektu Xcode. Gdy pojawi się prośba, wybierz Skopiuj elementy do folderu grupy docelowej.
  8. Wybierz projekt z Nawigatora projektów i wybierz miejsce docelowe aplikacji.
  9. Otwórz kartę Etapy kompilacji. W sekcji Połącz plik binarny z bibliotekami dodaj te platformy i biblioteki:
    • CoreGraphics.framework
    • CoreLocation.framework
    • libc++.tbd
    • libz.tbd
    • QuartzCore.framework
    • UIKit.framework
  10. Wybierz projekt, a nie konkretny cel, i otwórz kartę Ustawienia kompilacji. W sekcji Łączenie - Ogólne -> Inne flagi łączące dodaj -ObjC w polach „Debuguj” i „Opublikuj”. Jeśli te ustawienia nie są widoczne, zmień filtr na pasku Ustawienia kompilacji z Podstawowe na Wszystkie.

GooglePlacesSwift

Pakiet SDK GooglePlacesSwift (wersja przedpremierowa) możesz zainstalować ręcznie, korzystając z menedżera pakietów Swift lub CocoaPods. Czynności instalacji we wszystkich procesach są zgodne z instrukcjami dotyczącymi pakietu Places SDK na iOS, z tymi różnicami:

  • Wymagany jest Xcode 15.3.
  • W przypadku menedżera pakietów Swift zastąp też instancje GooglePlaces elementem GooglePlacesSwift. Obejmuje to instrukcje importu.
  • Zaktualizuj numer wersji do 0.1.0.
  • Zastąp wystąpienia https://github.com/googlemaps/ios-places-sdk adresem https://github.com/googlemaps/ios-places-swift-sdk.
  • W przypadku instalacji ręcznej oprócz plików XCFramework i plików zasobów GooglePlaces należy dodać GooglePlacesSwift pliki XCFramework i pliki zasobów.

Na przykład jeśli używasz CocoaPods, edytowany Podfile będzie wyglądać tak:

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

platform :ios, '15.3'

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

Krok 3. Sprawdź plik manifestu prywatności Apple

Apple wymaga podania szczegółów prywatności w przypadku aplikacji ze sklepu App Store. Aktualne informacje i dodatkowe informacje znajdziesz na stronie szczegółów prywatności w Apple App Store.

Plik manifestu prywatności firmy Apple jest zawarty w pakiecie zasobów SDK. Aby sprawdzić, czy plik manifestu prywatności został uwzględniony, i sprawdzić jego zawartość, utwórz archiwum aplikacji i wygeneruj z niego raport dotyczący prywatności.

Krok 4. Dodaj klucz interfejsu API do aplikacji

W poniższych przykładach zastąp YOUR_API_KEY swoim kluczem interfejsu API.

Swift

Dodaj klucz interfejsu API do urządzenia AppDelegate.swift, wykonując te czynności:

  • Dodaj tę instrukcję importu:
    import GooglePlaces
  • Dodaj do metody application(_:didFinishLaunchingWithOptions:) ten fragment, zastępując YOUR_API_KEY kluczem interfejsu API:
    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

Objective-C

Dodaj klucz interfejsu API do urządzenia AppDelegate.m, wykonując te czynności:

  • Dodaj tę instrukcję importu:
    @import GooglePlaces;
  • Dodaj do metody application:didFinishLaunchingWithOptions: ten fragment, zastępując YOUR_API_KEY kluczem interfejsu API:
    [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

GooglePlacesSwift

Dodaj klucz interfejsu API do urządzenia AppDelegate.swift, wykonując te czynności:

  • Dodaj tę instrukcję importu:
    import GooglePlacesSwift
  • Dodaj do metody application(_:didFinishLaunchingWithOptions:) ten fragment, zastępując YOUR_API_KEY kluczem interfejsu API:
    PlacesClient.shared.provideAPIKey("YOUR_API_KEY")

Krok 5. Zacznij pisać kod

Poniższe przykłady kodu pokazują, jak znaleźć aktualne miejsce.

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()
    }
  }
  

Dalsze kroki

Po skonfigurowaniu projektu możesz zapoznać się z przykładowymi aplikacjami.