Xcode プロジェクトを設定する

課金を有効にして API キーを作成したら、アプリの開発に使用する Xcode プロジェクトをセットアップできます。

各リリースには、リリースノートがあります。

ステップ 1: 必要なソフトウェアをインストールする

Places SDK for iOS を使用してプロジェクトを作成するには、以下が必要です。

  • Xcode バージョン 15.0 以降

ステップ 2: Xcode プロジェクトを作成して Places SDK for iOS をインストールする

Swift Package Manager

Places SDK for iOS は、 Swift Package Manager を使用してインストールできます。SDK を追加するには、既存の Places SDK for iOS の依存関係がすべて削除されていることを確認します。

新規または既存のプロジェクトに SDK を追加する手順は次のとおりです。

  1. Xcode の project または workspace を開き、[File] > [Add Package Dependencies] に移動します。
  2. URL として「https://github.com/googlemaps/ios-places-sdk」と入力し、Enter キーを押してパッケージを取り込み、[パッケージを追加] をクリックします。
  3. 特定の version をインストールするには、[依存関係ルール] フィールドをバージョン ベースのオプションのいずれかに設定します。新しいプロジェクトの場合は、最新バージョンを指定し、[正確なバージョン] オプションを使用することをおすすめします。完了したら、[パッケージを追加] をクリックします。
  4. [Choose Package Products] ウィンドウで、指定した main ターゲットに GooglePlaces が追加されることを確認します。完了したら、[パッケージを追加] をクリックします。
  5. インストールを確認するには、ターゲットの General ペインに移動します。[Frameworks, Libraries, and Embedded Content] 内に、インストールされているパッケージが表示されます。 [Project Navigator] の [Package Dependencies] セクションで、パッケージとそのバージョンを確認することもできます。

既存のプロジェクトの package を更新する手順は次のとおりです。

  1. 9.0.0 より前のバージョンからアップグレードする場合は、アップグレード後に GoogleMapsBaseGoogleMapsCoreGoogleMapsM4B の依存関係を削除する必要があります。GoogleMaps の依存関係は削除しないでください。詳細については、バージョン 9.0.0 リリースノートをご覧ください。

    Xcode プロジェクトの構成設定で、[フレームワーク、ライブラリ、埋め込みコンテンツ] を見つけます。マイナス記号(-)を使用して、次のフレームワークを削除します。

    • GoogleMapsBase(9.0.0 より前のバージョンからのアップグレードの場合のみ)
    • GoogleMapsCore(9.0.0 より前のバージョンからのアップグレードの場合のみ)
    • GoogleMapsM4B(9.0.0 より前のバージョンからのアップグレードの場合のみ)
  2. Xcode で、[File] > [Packages] > [Update To Latest Package Versions] に移動します。
  3. インストールを確認するには、Project Navigator の [Package Dependencies] セクションに移動して、パッケージとそのバージョンを確認します。

CocoaPods を使用して追加した Places SDK for iOS の依存関係を削除する手順は次のとおりです。

  1. Xcode ワークスペースを閉じます。ターミナルを開いて、次のコマンドを実行します。
    sudo gem install cocoapods-deintegrate cocoapods-clean 
    pod deintegrate 
    pod cache clean --all
  2. CocoaPods 以外に使用していない場合は、PodfilePodfile.resolved、Xcode の workspace を削除します。

手動でインストールした既存の Places SDK for iOS を削除する手順は次のとおりです。
  1. Xcode プロジェクトの構成設定で、[フレームワーク、ライブラリ、埋め込みコンテンツ] を見つけます。マイナス記号(-)を使用して、次のフレームワークを削除します。
    • GooglePlaces.xcframework
  2. Xcode プロジェクトの最上位ディレクトリから、GooglePlaces バンドルを削除します。

Cocoapods

Places SDK for iOS は、すべてのプレイス機能を含む CocoaPodGooglePlaces として利用できます。

CocoaPods は、Swift と Objective-C の Cocoa プロジェクト用のオープンソースの依存関係マネージャーです。CocoaPods ツールをまだインストールしていない場合は、ターミナルから次のコマンドを実行して macOS にインストールします。詳しくは、CocoaPods スタートガイドをご覧ください。

sudo gem install cocoapods

Places SDK for iOS の Podfile を作成し、それを使用して SDK とその依存関係をインストールします。

  1. Xcode プロジェクトをまだ作成していない場合は、ここで作成してローカルマシンに保存しますiOS 開発を初めて行う場合は、新しいプロジェクトを作成して、iOS アプリ テンプレートを選択します。
  2. プロジェクトのディレクトリに、Podfile という名前のファイルを作成します。このファイルでプロジェクトの依存関係を定義します。
  3. Podfile を編集し、依存関係とそのversionsを追加します。以下に、アプリケーションのターゲット名と GooglePlaces Pod の名前を指定する例を示します。
    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '15.0'
    
    target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
      pod 'GooglePlaces', '8.3.0'
    end
    
    常に最新の状態に保たれるように、定期的に pod outdated を実行して新しいバージョンの有無を検出してください。
  4. Podfile を保存します。
  5. ターミナルを開き、Podfile を含むディレクトリに移動します。

    cd <path-to-project>
  6. pod install コマンドを実行します。Podfile で指定した API とその依存関係がインストールされます。

    pod install
  7. Xcode を終了し、プロジェクトの .xcworkspace ファイルを(ダブルクリックして)開いて、Xcode を起動します。これ以降、このプロジェクトを開くには .xcworkspace ファイルを使用する必要があります。

既存のプロジェクトの API を更新する手順は次のとおりです。

  1. ターミナルを開き、Podfile を含むプロジェクト ディレクトリに移動します。
  2. pod update コマンドを実行します。これにより、Podfile で指定されたすべての API が最新バージョンに更新されます。

手動インストール

このガイドでは、Places SDK for iOS を含む XCFramework をプロジェクトに手動で追加し、Xcode でビルド設定を構成する方法について説明します。XCFramework は、Apple シリコンを使用したマシンなど、複数のプラットフォームで使用できるバイナリ パッケージです。

  1. 次の SDK バイナリ ファイルとリソース ファイルをダウンロードします。
  2. ファイルを抽出し、XCFramework とリソースにアクセスします。
  3. Xcode を起動し、既存のプロジェクトを開くか、新しいプロジェクトを作成します。iOS 開発が初めての場合は、新しいプロジェクトを作成して、iOS アプリ テンプレートを選択します。
  4. プロジェクトから以前のリリースの Maps バンドルをすべて削除します。
  5. [全般] タブを開きます。プロジェクトの [Frameworks, Libraries, and Embedded Content] に、次の XCFramework をドラッグします。必ず [Do Not Embed] を選択してください。
    • GooglePlaces.xcframework
  6. ダウンロードした GooglePlacesResources から GooglePlaces.bundle をドラッグします。
  7. ダウンロードした GooglePlacesResources から GooglePlaces.bundle を Xcode プロジェクトの最上位ディレクトリにコピーします。プロンプトが表示されたら、[ Copy items into destination group's folder] を選択します。
  8. プロジェクト ナビゲータからプロジェクトを選択し、アプリケーションのターゲットを選択します。
  9. [Build Phases] タブを開きます。[Link Binary with Libraries] 内で、次のフレームワークとライブラリを追加します。
    • CoreGraphics.framework
    • CoreLocation.framework
    • libc++.tbd
    • libz.tbd
    • QuartzCore.framework
    • UIKit.framework
  10. 特定のターゲットではなくプロジェクトを選択し、[Build Settings] タブを開きます。[Linking - General] -> [Other Linker Flags] セクションで、-ObjC を [Debug] と [Release] に追加します。これらの設定が表示されない場合は、[Build Settings] バーのフィルタを [Basic] から [All] に変更します。

GooglePlacesSwift

GooglePlacesSwift(プレビュー版)SDK は、SPM や CocoaPods を使用してインストールするか、手動でインストールできます。すべてのプロセスでインストール手順は、Places SDK for iOS の場合と同じですが、次の点が異なります。

  • Xcode 15.3 が必要です。
  • SPM の場合は、インスタンス GooglePlacesGooglePlacesSwift に置き換えます。これにはインポート ステートメントも含まれます。
  • バージョン番号を 0.1.0 に更新します。
  • https://github.com/googlemaps/ios-places-sdk のインスタンスを https://github.com/googlemaps/ios-places-swift-sdk に置き換えます。
  • 手動でインストールする場合は、GooglePlaces の XCFramework とリソース ファイルに加えて、GooglePlacesSwift XCFramework とリソース ファイルを追加する必要があります。

ステップ 3: Apple のプライバシー マニフェスト ファイルを調べる

Apple は、App Store のアプリについて、アプリのプライバシーに関する詳細情報を求めています。最新情報や詳細については、Apple App Store の「プライバシーの詳細」ページをご覧ください。

Apple Privacy Manifest ファイルは、SDK のリソース バンドルに含まれています。プライバシー マニフェスト ファイルが含まれていることを確認し、その内容を調べるには、アプリのアーカイブを作成し、アーカイブからプライバシー レポートを生成します。

ステップ 4: アプリに API キーを追加する

以下の例で YOUR_API_KEY とある箇所は、実際の API キーに置き替えてください。

Swift

次のように、API キーを AppDelegate.swift に追加します。

  • 次のインポート ステートメントを追加します。
    import GooglePlaces
  • 次のコードを application(_:didFinishLaunchingWithOptions:) メソッドに追加します。YOUR_API_KEY は実際の API キーに置き換えます。
    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

Objective-C

次のように、API キーを AppDelegate.m に追加します。

  • 次のインポート ステートメントを追加します。
    @import GooglePlaces;
  • 次のコードを application:didFinishLaunchingWithOptions: メソッドに追加します。YOUR_API_KEY は実際の API キーに置き換えます。
    [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

GooglePlacesSwift

次のように、API キーを AppDelegate.swift に追加します。

  • 次のインポート ステートメントを追加します。
    import GooglePlacesSwift
  • 次のコードを application(_:didFinishLaunchingWithOptions:) メソッドに追加します。YOUR_API_KEY は実際の API キーに置き換えます。
    PlacesClient.shared.provideAPIKey("YOUR_API_KEY")

ステップ 5: コーディングを開始する

次のコードサンプルは、現在の場所を取得する方法を示しています。

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

次のステップ

プロジェクトを構成したら、サンプルアプリを確認できます。