Place Details

Places SDK for iOS 可在應用程式中提供地點豐富的資訊,包括地點的名稱和地址、經緯度座標指定的地理位置,以及地點類型 (例如夜店、寵物店、博物館等)。如要存取特定地點的這項資訊,您可以使用地點 ID,這種 ID 是專門用來識別特定地點的固定 ID。

地點詳細資訊

GMSPlace 類別可提供特定地點的相關資訊。您可以透過下列方式保留 GMSPlace 物件:

當您要求地點時,必須指定要傳回的地點資料類型。方法是傳遞 GMSPlaceField,指定要傳回的資料類型。請務必考量這點,因為這會影響每次要求的費用

由於地點資料結果不可為空白,因此系統只會傳回含有資料的地點結果 (例如,如果要求的地點沒有相片,結果中就不會出現 photos 欄位)。

以下範例會傳遞兩個欄位值的清單,用於指定要求傳回的資料:

Swift

      // A hotel in Saigon with an attribution.
      let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs"

      // Specify the place data types to return.
      let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) |
      UInt(GMSPlaceField.placeID.rawValue))
  

Objective-C

      // A hotel in Saigon with an attribution.
      NSString *placeID = @"ChIJV4k8_9UodTERU5KXbkYpSYs";

      // Specify the place data types to return.
      GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID);
  

進一步瞭解地點欄位。如要進一步瞭解地點資料要求的計費方式,請參閱「用量與計費」一文。

GMSPlace 類別可包含下列地點資料:

  • name - 地點的名稱。
  • editorialSummary:提供地點的簡單說明。
  • placeID:地點的文字 ID。請參閱本頁面其餘部分,進一步瞭解地點 ID。
  • coordinate:地點的地理位置,以經緯度座標的形式指定。
  • phoneNumber:地點的電話號碼 (國際格式)。
  • formattedAddress:這個地點的清楚易懂地址。

    這個地址通常等於郵寄地址。請注意,由於授權上的限制,部分國家/地區 (例如英國) 不允許散布真實的郵寄地址。

    理論上,格式化地址是由一或多個「地址元件」組成。舉例來說,「111 8th Avenue, New York, NY」這個地址包含以下元件:「111」(門牌號碼)、「8th Avenue」(路名)、「New York」(城市) 和「NY」(美國州名)。

    請勿以程式輔助方式剖析格式化地址。建議您改用個別地址元件,API 回應除了包含格式化地址欄位之外,也會包含這些元件。

  • openingHours:地點的營業時間 (以 GMSOpeningHours 表示)。呼叫 GMSOpeningHours.weekdayText 即可取得當週每日營業時間的本地化字串清單。呼叫 GMSOpeningHours.Periods 可傳回 GMSPeriod 清單,其中包含更詳細的 weekdayText 提供的資料。注意:如果地點持續營業,時段會以星期日表示午夜,closeEvent 則為空值。
  • currentOpeningHourssecondaryOpeningHours - 特定地點的假日和臨時變更。
  • addressComponentsGMSAddressComponent 物件的陣列,代表地點的地址元件。這些元件是用於擷取地點地址的結構化資訊,例如尋找地點所在的城市。請勿使用這些元件設定地址格式,而是使用 formattedAddress 屬性,提供本地化格式的地址。

    addressComponents 陣列的注意事項如下:

    • 地址元件陣列包含的元件可能比 formattedAddress 更多。
    • 除了 formattedAddress 中所含的政治實體以外,這個陣列不一定會納入內含地址的所有政治實體。
    • 兩次要求之間的回應格式不一定相同。特別是,addressComponents 的數量會因要求的地址而異,對於同一個地址,數量也可能會隨時間改變。元件在陣列中的位置可能會變更。元件類型也可能會變更。後續回應中可能會缺少特定元件。
  • userRatingsTotal:代表地點評分包含的評論數量。

GMSPlace 類別包含下列成員函式:

  • isOpen 會根據 openingHoursUTCOffsetMinutes,以及目前日期和時間,計算地點在指定時間是否營業。
  • isOpenAtDate 會根據 openingHoursUTCOffsetMinutes,以及目前的日期和時間,計算地點是否在特定日期營業。
  • 使用這些函式取得營業時間和/或日期時,原始 fetchPlaceFromPlaceID:findPlaceLikelihoodsFromUserLocationWithPlaceFields: 要求必須指定「兩個」GMSPlaceFieldOpeningHours和「GMSPlaceFieldUTCOffsetMinutes」欄位。如果缺少任一欄位,產生的 GMSPlace 物件就不會包含營業時間或日期,且呼叫會傳回 GMSPlaceOpenStatusUnknown。為確保結果正確無誤,請在原始地點要求中要求 GMSPlaceFieldBusinessStatusGMSPlaceFieldUTCOffsetMinutes 欄位。如未要求,系統會假設商家確實正常運作。

    如要瞭解如何搭配 Place Details 使用 isOpen,請觀看這部影片

取得特殊營業時間

雖然您可以透過 openingHours 取得一般營業時間,但 currentOpeningHourssecondaryOpeningHours 支援假日和臨時時間表調整。系統可以篩選及顯示這些特殊日的特殊營業時間 (如果有的話)。

Swift

    func examineOpeningHours(place: GMSPlace) {

      // Check if the current opening hours contains a special day that has exceptional hours
      guard let currentOpeningHours = place.currentOpeningHours else { return }
      if let specialDays = currentOpeningHours.specialDays {
        guard !specialDays.isEmpty else { return }
        if let specialDay = specialDays.filter { $0.isExceptional }.first  {
          // Indicate exceptional hours
        }
      }

      // Check if current opening hours contains a truncated time period
      let periods = currentOpeningHours.periods

      if !periods.isEmpty {
        for period in periods {
          let open = period.open
          let close = period.close

          if let open = open {
            let date = open.date

            if open.isTruncated {
              // Indicate truncated time period
            }
          }
        }
      }

      // Check if the place's secondary opening hours indicate when delivery is available
      let secondaryOpeningHours = place.secondaryOpeningHours
      guard let hoursType = secondaryOpeningHours.first?.hoursType else {
      return
      }

      if (hoursType == GMSPlaceHoursTypeDelivery) {
        // Indicate hours where delivery is available
      }
  }

Objective-C

- (void)examineOpeningHours:(GMSPlace *) place {

    // Check if the current opening hours contains a special day that has exceptional hours
    GMSOpeningHours *currentOpeningHours = place.currentOpeningHours;
    if (currentOpeningHours != nil) {
      NSArray<GMSPlaceSpecialDay *> *specialDays = currentOpeningHours.specialDays;
      if ([specialDays count] != 0) {
        for (GMSPlaceSpecialDay *specialDay in specialDays) {
          NSDate *date = specialDay.date;
          if ([specialDay isExceptional]) {
            // Indicate exceptional hours
          }
        }
      }
    }

    // Check if current opening hours contains a truncated time period
    NSArray <GMSPeriod *> * periods = currentOpeningHours.periods;

    if ([periods count] != 0) {
      for (GMSPeriod * period in periods) {
        GMSTimeOfWeek *open = period.open;
        GMSTimeOfWeek *close = period.close;

        if (open) {
          if ([open isTruncated]) {
            // Indicate truncated time period
          }
        }
      }
    }

    // Check if the place's secondary opening hours indicate when delivery is available
    GMSOpeningHours *secondaryOpeningHours = place.secondaryOpeningHours;
    GMSPlaceHoursType hoursType = secondaryOpeningHours.getHoursType;

    if (hoursType == GMSPlaceHoursTypeDelivery) {
      // Indicate hours where delivery is available
    }
}

透過 ID 取得地點

地點 ID 是用來識別特定地點的文字 ID,在 Places SDK for iOS 中,您可以從 GMSPlace 物件擷取地點 ID。您可以儲存地點 ID,日後再用於擷取 GMSPlace 物件。

如要依據 ID 取得地點,請呼叫 GMSPlacesClient fetchPlaceFromPlaceID: 並傳遞下列參數:

  • 包含地點 ID 的字串。
  • 一或多個 GMSPlaceField,用於指定要傳回的資料類型。
  • 如果呼叫結束自動完成查詢,則為工作階段符記。否則傳遞 nil。
  • 用於處理結果的 GMSPlaceResultCallback

API 會叫用指定的回呼方法,並傳入 GMSPlace 物件。如果找不到地點,地點物件就會是 nil。

Swift

// A hotel in Saigon with an attribution.
let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs"

// Specify the place data types to return.
let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) |
  UInt(GMSPlaceField.placeID.rawValue))!

placesClient?.fetchPlace(fromPlaceID: placeID, placeFields: fields, sessionToken: nil, callback: {
  (place: GMSPlace?, error: Error?) in
  if let error = error {
    print("An error occurred: \(error.localizedDescription)")
    return
  }
  if let place = place {
    self.lblName?.text = place.name
    print("The selected place is: \(place.name)")
  }
})

Objective-C

// A hotel in Saigon with an attribution.
NSString *placeID = @"ChIJV4k8_9UodTERU5KXbkYpSYs";

// Specify the place data types to return.
GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID);

[_placesClient fetchPlaceFromPlaceID:placeID placeFields:fields sessionToken:nil callback:^(GMSPlace * _Nullable place, NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"An error occurred %@", [error localizedDescription]);
    return;
  }
  if (place != nil) {
    NSLog(@"The selected place is: %@", [place name]);
  }
}];

在應用程式中顯示歸因資訊

當應用程式顯示從 GMSPlacesClient lookUpPlaceID:callback: 取得的資訊時,也必須顯示作者資訊。請參閱作者資訊說明文件。

進一步瞭解地點 ID

Places SDK for iOS 中使用的地點 ID 與 Places API、Places SDK for Android 和其他 Google API 中使用的 ID 相同。

每個地點 ID 只能對應一個地點,但一個地點可以有多個地點 ID。

在某些情況下,地點 ID 可能會取得新的地點 ID。舉例來說,如果商家搬遷至新地點,可能就會發生上述情況。

透過指定地點 ID 要求地點時,您可以放心,回應中一律會收到相同的地點 (如果地點仍然存在)。不過請注意,回應中可能包含的地點 ID 與要求中的地點 ID 不同。

詳情請參閱地點 ID 總覽