Places Swift SDK for iOS(プレビュー)に移行する

Places SDK for iOS から Places Swift SDK for iOS(プレビュー版)への移行は簡単で、段階的に行うことができます。Places Swift SDK for iOS(プレビュー版)の構造体は Objective-C ベースの構造体と互換性がないため、GMSPlacesClient での API の使用に基づいて、機能の個別のチャンクを移行することをおすすめします。

iOS 向け Places Swift SDK(プレビュー版)をプロジェクトに追加する

Places Swift SDK for iOS(プレビュー版)を使用するには、次の手順が必要です。

  1. Places API(新版)を有効にします。
  2. 依存関係に Places Swift SDK for iOS(プレビュー版)を追加します。GooglePlaces または GooglePlacesSwift のいずれか、または両方をインストールできます。

  3. PlacesClient を使用してプレイス クライアントを初期化します。

移行のステップバイステップの例

たとえば、Places SDK for iOS を使用するアプリがテキスト入力に基づいてオートコンプリート候補を受け取った後、最初の場所候補の詳細を取得するとします。Places SDK for iOS を使用している場合、既存のコードは次のようになります。

// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()

// Fetch Autocomplete Request.
let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)
let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)
let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)

let filter = GMSAutocompleteFilter()
filter.types = [kGMSPlaceTypeRestaurant]
filter.origin = center
filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest)

let request = GMSAutocompleteRequest(query: "Sicilian piz")
request.filter = filter

client.fetchAutocompleteSuggestions(from: request) { (results, error) in
  guard let results, error == nil else {
    print("Autocomplete error: \(String(describing: error))")
    return
  }

  // Fetch Place Request.
  guard let placeID = results.first?.placeSuggestion?.placeID else { return }
  let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.website].map {$0.rawValue}

  let fetchPlaceRequest = GMSFetchPlaceRequest(placeID: placeID, placeProperties: myProperties, sessionToken: nil)

  client.fetchPlace(with: fetchPlaceRequest) { (place: GMSPlace?, error: Error?) in
    guard let place, error == nil else { return }
    print("Place found: \(String(describing: place.name)); \(String(describing: place.website))")
  }
}

Places クライアントの初期化処理を更新する

コードを最新化して新しい SDK の機能を活用するには、GMSPlacesClient を PlacesClient に置き換える必要があります。また、新しいメソッドではパラメータ名が変更されているため、パラメータを with ではなく from に更新する必要があります。最後に、Places Swift SDK for iOS(プレビュー版)では、アップグレードされた AutocompleteRequest が使用されます。

コードの更新

// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared

元のコード

// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()

予測入力リクエストを更新する

まず、予測入力リクエストのフローを更新します。古いコードではコールバックを使用して予測入力の候補をリクエストしますが、新しいコードでは switch/await パターンを使用します。コールバックを使用すると、コード構造とエラー処理が複雑になる可能性があります。新しい iOS 向け Places Swift SDK(プレビュー版)は同時実行をサポートしているため、非同期オペレーションが簡素化されます。

// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared

// Fetch Autocomplete Request.
let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)
let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)
let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)

let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)
let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)

let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", filter: filter)
let placeID: String
switch await placesSwiftClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let results):
  switch results.first {
  case .place(let placeSuggestion):
    placeID = placeSuggestion.placeID
  case .none:
    fallthrough
  @unknown default:
    return
  }
case .failure(let placesError):
  print("Autocomplete error: \(placesError)")
  return
}

// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let placesClient = GMSPlacesClient.shared()

// Fetch Place Request.
let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.website].map {$0.rawValue}

let fetchPlaceRequest = GMSFetchPlaceRequest(placeID: placeID, placeProperties: myProperties, sessionToken: nil)

placesClient.fetchPlace(with: fetchPlaceRequest) { (place: GMSPlace?, error: Error?) in
  guard let place, error == nil else { return }
  print("Place found: \(String(describing: place.name)); \(String(describing: place.website))")
}

メソッド名とクラス名を更新する

最後に、fetchPlace コードをリファクタリングし、GMSPlacesClient の初期化と GMSPlaceProperty の宣言の両方を削除して、移行を完了します。Places Swift SDK for iOS(プレビュー版)では、メソッドとクラス名が更新され、「GMS」接頭辞が削除されているため、それに応じて更新する必要があります。GMSFetchPlaceRequestFetchPlaceRequest になります。

型の処理

新しい fetchPlace メソッドでは、改善された型処理が使用されます。古いコードではプロパティの元の値を渡す必要がありましたが、新しいコードでは、デベロッパーがここで元の値を明示的に取得する必要がないため、簡潔さと読みやすさが向上します。

同時実行

また、新しいメソッドは同時実行をサポートしているため、placesClient.fetchPlace のコールバックを placesSwiftClient.fetchPlaceswitch/await パターンに置き換えることができます。

// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared

// Fetch Autocomplete Request.
let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)
let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)
let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)

let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)
let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)

let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", filter: filter)
let placeID: String
switch await placesSwiftClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let results):
  switch results.first {
  case .place(let placeSuggestion):
    placeID = placeSuggestion.placeID
  case .none:
    fallthrough
  @unknown default:
    return
  }
case .failure(let placesError):
  print("Autocomplete error: \(placesError)")
  return
}

// Fetch Place Request.
let fetchPlaceRequest = FetchPlaceRequest(placeID: placeID, placeProperties: [.displayName, .websiteURL])
switch await placesSwiftClient.fetchPlace(with: fetchPlaceRequest) {
case .success(let place):
  print("Place found: \(place.displayName): \(String(describing: place.description))")

case .failure(let placesError):
  print("Place not found: \(placeID); \(placesError)")
}

最新情報を入手する

新機能と変更点については、Places Swift SDK for iOS(プレビュー版)のリリースノート ページをご覧ください。