iOS 向け Places Swift SDK に移行する

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

Places Swift SDK for iOS をプロジェクトに追加する

Places Swift SDK for iOS を使用するには、次の手順が必要です。

  1. Places API(新版)を有効にします。
  2. 依存関係に Places Swift SDK を追加します。GooglePlacesGooglePlacesSwift、またはその両方をインストールできます。

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

移行の手順の例

たとえば、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 はアップグレードされた 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 パターンを使用します。コールバックは、コード構造とエラー処理を複雑にする可能性があります。新しい 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 では、メソッド名とクラス名が更新され、接頭辞「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)")
}

最新情報を入手する

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