设置 Xcode 项目

启用结算功能并创建 API 密钥后,您就可以设置用于开发应用的 Xcode 项目了。

每个版本都有相应的版本说明

第 1 步:安装所需的软件

如需使用 Places SDK for iOS 构建项目,您需要:

  • Xcode 版本 14.0 或更高版本
  • CocoaPods
  • 第 2 步:创建 Xcode 项目并安装 Places SDK for iOS

    如需在新项目中安装 API,请按以下步骤操作

    使用 Cocoapods

    Places SDK for iOS 以 CocoaPod pod(即 GooglePlaces)的形式提供,其中包含所有地点功能。

    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 并添加您的依赖项及其版本。以下示例指定了应用目标名称和 GooglePlaces pod 的名称:
      source 'https://github.com/CocoaPods/Specs.git'
      
      platform :ios, '14.0'
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GooglePlaces', '8.2.1'
      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 更新到最新版本。

    安装 XCFramework

    XCFramework 是一个二进制软件包,可用于多个平台(包括使用 M1 芯片组的计算机)来安装 Places SDK for iOS。本指南介绍了如何将包含 Places SDK for iOS 的 XCFramework 添加到您的项目中,并在 Xcode 中配置构建设置。

    手动

    本指南介绍了如何手动将 Maps SDK for iOS 添加到您的项目中,以及如何在 Xcode 中配置构建设置。

    1. 下载 SDK 源文件:GooglePlaces-8.2.1
    2. 解压缩源文件。转到 Frameworks 文件夹以访问 XCFramework。
    3. 启动 Xcode,然后打开现有项目或创建新项目。如果您刚开始接触 iOS,请创建一个新项目,然后选择 iOS 应用模板
    4. 将以下 XCFramework 拖动到 Frameworks, Libraries, and Embedded Content 下的项目中。请务必选择不嵌入
      • GooglePlaces-x.x.x/GooglePlaces.xcframework
    5. 右键点击项目中的 GooglePlaces.xcframework,然后选择 Show In Finder
    6. GooglePlaces.bundleios-arm64/GooglePlaces.framework/Resources 文件夹拖动到 Xcode 项目的顶层目录中。出现提示时,确保未选中 Copy items into destination group's folder
    7. 从项目导航器中选择您的项目,然后选择应用的目标。
    8. 打开 Build Phases(构建阶段)标签页,在 Link Binary with Libraries(将二进制文件与库相关联)中,添加以下框架和库:
      • CoreGraphics.framework
      • CoreLocation.framework
      • libc++.tbd
      • libz.tbd
      • QuartzCore.framework
      • UIKit.framework
    9. 选择您的项目而不是具体的目标,并打开“Build Settings”(构建设置)标签页。

    10. Other Linker Flags 部分中,添加 -ObjC。如果看不到这些设置,请将 Build Settings(构建设置)栏中的过滤条件从 Basic(基本)更改为 All(全部)。

    带迦太基

    手动添加

    本指南介绍了如何手动将 GooglePlaces 框架添加到您的项目中,以及如何在 Xcode 中配置您的构建设置。

    1. 下载 SDK 源文件:GooglePlaces-8.2.1
    2. 解压缩源文件。
    3. 启动 Xcode,并打开现有的项目或创建新项目。如果您刚开始接触 iOS 开发,请创建一个新项目,然后选择 iOS 应用模板
    4. 从项目中移除先前版本中的所有地图软件包。
    5. 将以下软件包拖动到您的项目中(出现提示时,选择 Copy items if needed):
      • GooglePlaces-x.x.x/Frameworks/GooglePlaces.xcframework
    6. 右键点击项目中的 GooglePlaces.xcframework,然后选择 Show In Finder(在查找器中显示)。
    7. GooglePlaces.bundleResources 文件夹拖动到项目中。系统显示提示时,确保没有选中“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”(构建设置)标签页。

    11. Other Linker Flags 部分中,添加 -ObjC。如果看不到这些设置,请将 Build Settings(构建设置)栏中的过滤条件从 Basic(基本)更改为 All(全部)。

    第 3 步:将 API 密钥添加到您的应用

    在下例中,将 YOUR_API_KEY 替换为您的 API 密钥。

    Swift

    按照以下方法向 AppDelegate.swift 添加 API 密钥:

    • 添加以下 import 语句:
      import GooglePlaces
    • 将以下内容添加到您的 application(_:didFinishLaunchingWithOptions:) 方法,并将 YOUR_API_KEY 替换为您的 API 密钥:
      GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

    Objective-C

    按照以下方法向 AppDelegate.m 添加 API 密钥:

    • 添加以下 import 语句:
      @import GooglePlaces;
    • 将以下内容添加到您的 application:didFinishLaunchingWithOptions: 方法,并将 YOUR_API_KEY 替换为您的 API 密钥:
      [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

    第 4 步:开始编写代码

    以下代码示例演示了如何获取当前地点

    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
          

    后续步骤

    配置完项目后,您可以浏览示例应用。 您需要安装 Cocoapods v1.6.1。