設定 Xcode 專案

啟用計費功能並建立 API 金鑰後,即可開始設定 您開發應用程式所用的 Xcode 專案。

版本資訊 版本。

步驟 1:安裝必要軟體

如要使用 Places SDK for iOS 建立專案,您需要:

  • Xcode 15.0 版或更新版本

步驟 2:建立 Xcode 專案並安裝 Places SDK for iOS

Swift 套件管理工具

您可以透過 Swift 套件管理工具。如要新增 SDK,請確認您具備 移除所有現有的 Places SDK for iOS 依附元件。

如要將 SDK 加入新專案或現有專案,請按照下列步驟操作:

  1. 開啟 Xcode projectworkspace,然後依序前往「File」>新增套件依附元件
  2. 輸入 https://github.com/googlemaps/ios-places-sdk 做為網址,然後按下 Enter 鍵 來提取套件,然後點選「Add Package」
  3. 如要安裝特定 version,請將「Dependency Rule」(依附元件規則) 欄位設為 版本化選項如果是新專案,建議您指定最新版本 使用「完全比對版本」如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇完成後,點選「新增套件」。
  4. 在「Choose Package Products」視窗中,確認 GooglePlaces 將新增至 您指定的main目標完成後,點選「新增套件」。
  5. 如要驗證安裝狀態,請前往目標的 General 窗格。 「Frameworks、Library and Embedded Content」應會顯示已安裝的套件。 您也可以查看「套件依附元件」「專案導覽器」的 驗證套件及其版本

如要更新現有專案的 package,請按照下列步驟操作:

  1. 如果要升級的是 9.0.0 以下版本,請務必移除 下列依附元件:GoogleMapsBaseGoogleMapsCore 和 升級後的費用為 GoogleMapsM4B。請勿移除以下項目的依附元件: GoogleMaps。詳情請參閱 9.0.0 版本資訊

    在 Xcode 專案配置設定中,找到「Frameworks, libraries」 和嵌入內容請使用減號(-) 移除下列架構:

    • GoogleMapsBase (僅適用於 9.0.0 以下版本的升級作業)
    • GoogleMapsCore (僅適用於 9.0.0 以下版本的升級作業)
    • GoogleMapsM4B (僅適用於 9.0.0 以下版本的升級作業)
  2. 在 Xcode 中,前往 [檔案] >套裝行程 >更新至最新套件版本」。
  3. 如要驗證安裝狀態,請前往「Project Navigator」的「Package Dependencies」部分 驗證套件及其版本
,瞭解如何調查及移除這項存取權。

如要移除現有的 Places SDK for iOS 依附元件,請使用 CocoaPods,請按照下列步驟操作:

  1. 關閉 Xcode 工作區。開啟終端機並執行下列指令:
    sudo gem install cocoapods-deintegrate cocoapods-clean 
    pod deintegrate 
    pod cache clean --all
  2. 移除 PodfilePodfile.resolved 和 如果不是 CocoaPods,則使用 Xcode workspace

如要移除手動安裝的 Places SDK for iOS, 步驟如下:
  1. 在 Xcode 專案配置設定中,找到「Frameworks, libraries」 和嵌入內容請使用減號(-) 移除下列架構:
    • GooglePlaces.xcframework
  2. 從 Xcode 專案的頂層目錄中,移除 GooglePlaces 軟體包。

CocoaPods

Places SDK for iOS 中隨附 CocoaPod GooglePlaces,其中包含所有地點功能。

CocoaPods 是 Swift 和 Objective-C 的開放原始碼依附元件管理工具 Cocoa 專案。如果您還沒有 CocoaPods 工具,請安裝 從終端機執行下列指令,藉此啟動 macOS。詳情請參閱 CocoaPods 入門指南

sudo gem install cocoapods

建立 Places SDK for iOS 的 Podfile,並使用 來安裝 SDK 及其依附元件:

  1. 如果您還沒有 Xcode 專案,請立即建立一個並儲存至本機電腦 如果您是 iOS 開發新手,請建立新專案 然後選取「iOS App Template」
  2. 在專案目錄中建立名為 Podfile 的檔案。這個檔案定義了專案的依附元件。
  3. 編輯 Podfile,新增依附元件及其版本。以下是 ,其中指定您的應用程式目標名稱,以及 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 指令。這會更新所有 API 在 Podfile 中指定的是最新版本。

手動安裝程式庫

本指南將說明如何手動將包含 Places SDK for iOS 的 XCFramework 新增至 並在 Xcode 中設定建構設定。XCFramework 是一種二進位套件,可用於多種平台 (包括機器) 使用 Apple 晶片

  1. 下載下列 SDK 二進位檔和資源檔案:
  2. 解壓縮檔案以存取 XCFramework 和資源。
  3. 啟動 Xcode,接著開啟現有專案,或建立新專案。如果您是 iOS 開發新手,請建立新專案 選取「iOS App Template」
  4. 從專案中移除先前版本中的所有地圖套件。
  5. 開啟「一般」分頁。將下列 XCFramework 拖曳至專案 。請確認 選取「不要嵌入」
    • GooglePlaces.xcframework
  6. 從已下載的 GooglePlacesResources 拖曳 GooglePlaces.bundle
  7. GooglePlacesResources 複製 GooglePlaces.bundle 您下載到 Xcode 專案的頂層目錄請務必選取 依系統提示將項目複製到目的地群組的資料夾
  8. 從「Project Navigator」中選取專案,然後選擇 並指定應用程式的目標
  9. 開啟「Build Phases」分頁。在「Link Binary with」 程式庫,新增下列架構和程式庫:
    • CoreGraphics.framework
    • CoreLocation.framework
    • libc++.tbd
    • libz.tbd
    • QuartzCore.framework
    • UIKit.framework
  10. 選擇專案 (而非特定目標),然後開啟 「Build Settings」分頁。在「連結 - 一般」部分其他連結器 Flags 區段,將 -ObjC 新增至「Debug」和「發布」如果這些 變更未顯示設定,請在「Build Settings」列中變更篩選器 從「基本」改為「全部」。

GooglePlacesSwift

您可以使用 Swift Package Manager、CocoaPods 和手動安裝 GooglePlacesSwift (預先發布版) SDK。 所有程序的安裝步驟,皆與 Places SDK for iOS,但有下列差異:

舉例來說,如果使用 CocoaPods,編輯的 Podfile 看起來會像這樣:

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

platform :ios, '15.3'

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

步驟 3:檢查 Apple 隱私權資訊清單檔案

Apple 要求在 App Store 上架應用程式,要求取得應用程式隱私權詳細資訊。如需最新資訊和其他資訊,請前往 Apple App Store 隱私權詳細資料頁面

Apple 隱私權資訊清單檔案包含在 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()
    }
  }
  

後續步驟

專案設定完畢後,您可以探索 範例應用程式