רכיב מתקדם של פרטי מקום

גרסת Advanced של הרכיב Place Details (פרטי מקום) מציעה את אותן תכונות כמו Places Details Essentials (פרטי מקום – גרסת Essentials). בנוסף, אפשר לבחור אם להציג את שם המקום, להגדיר את לחצני הפעולה של הרכיב ולהחיל אפשרויות חיפוש וסינון על הביקורות והמדיה שמוצגות.

הגדרות מתקדמות של פרטי מקום

כדי לקבל גישה לתכונות המתקדמות, צריך להשתמש ב-AdvancedPlaceDetailsView או ב-AdvancedPlaceDetailsCompactView.

אפשרויות להצגת תוכן

אתם יכולים לציין איזה תוכן יוצג באמצעות הערכים המנויים ב-AdvancedPlaceDetailsContent. אתם יכולים להגדיר את כל התוכן שמוגדר בפרטים חיוניים על מקומות, וגם לבחור אם שם המקום יוצג.

הגדרת לחצני פעולה

כדי להסיר או להתאים אישית את לחצני הפעולה, משתמשים בשיטות .cornerActions ו-.mainActions של AdvancedPlaceDetailsView או AdvancedPlaceDetailsCompactView.

דרישות לייחוס חזותי

תצוגה קומפקטית של פרטי מקום עם לחצנים בהתאמה אישית
תצוגה קומפקטית של פרטים מתקדמים על מקום עם לחצן בהתאמה אישית

חשוב: עליכם להבהיר למשתמשי הקצה מתי כפתור פעולה מותאם אישית ישתף מידע על המשתמשים עם צד שלישי שאינו Google. דרישות לגבי שיוך חזותי

בדוגמה שמשמאל מוצגת תמונה מותאמת אישית שמבהירה שפרטי המשתמש יישלחו אל Altostrat.

שימוש באפשרויות חיפוש וסינון

כדי להפעיל חיפוש וסינון של מדיה או ביקורות, משתמשים בשיטות .searchMediaOptions ו-.searchReviewOptions של AdvancedPlaceDetailsView או AdvancedPlaceDetailsCompactView.

יצירת משבצות תוכן בהתאמה אישית

אפשרויות מיקום מותאמות אישית של משבצות תוכן

משבצות תוכן בהתאמה אישית מאפשרות לכם להוסיף תוכן משלכם (כמו סיכומים שנוצרו על ידי AI, חותמות זמן של מסלול נסיעה או תגים בהתאמה אישית) ישירות לאזורי פריסה מוגדרים מראש.

כדי להוסיף תוכן מותאם אישית, משתמשים בשיטה .placeDetailsCompactContentSlot של AdvancedPlaceDetailsCompactView. המיקומים האפשריים הם .basicSectionTop ו-.basicSectionBottom.

דרישות שיוך והצעות לתוכן במשבצות תוכן

כשמציבים משבצת תוכן בהתאמה אישית, הגילוי הנאות מתעדכן באופן אוטומטי כדי להבהיר איזה תוכן מסופק על ידי Google ואיזה תוכן מסופק על ידי צדדים שלישיים.

מומלץ

חשוב לשמור על היררכיה חזותית ברורה בין פרטי המקום ב-Google לבין התוכן המותאם אישית, כדי למנוע אי בהירות לגבי מקור המידע.

מניעת אי-בהירות לגבי מקור המידע

מומלץ

כדאי להציג תובנות מותאמות למיקום ולמטרות המיידיות של המשתמשים. תוכן מותאם אישית כמו חלונות הזמנה בזמן אמת או זמינות נוכחית עוזר למשתמשים לקבל החלטות מהירות יותר ומבוססות יותר.

מקבלים תובנות חשובות

לא מומלץ

אל תשכפלו פרטים קיימים במקום ב-Google, כמו דירוגים, ביקורות או שעות פעילות, גם אם הסתרתם את התוכן ש-Google סיפקה. הפעולה הזו עלולה לבלבל את המשתמשים לגבי המקור של התוכן והאם הוא מגיע מ-Google או מצד שלישי.

לא לשכפל פרטים קיימים של מקומות ב-Google

לא מומלץ

אסור להציג טענות או תגים ללא ציון מקור (לדוגמה, 'המלצה מובילה!') שאפשר לטעות ולחשוב שהם אישורים רשמיים של Google. בתוכן מותאם אישית צריך לציין במפורש את המקור שלו.

לא להציג תגים או טענות ללא ציון מקור

לא מומלץ

אסור לכלול מודעות, טקסט שיווקי, הנחות שיווקיות או הנחיות להרשמה בתוך מאגרי מיקומים מותאמים אישית.

אין לכלול מודעות, טקסט שיווקי, הנחות שיווקיות או הנחיות להרשמה למינוי

דוגמאות ל-Place Details מתקדמים

השמטת שם המקום

כדי להשמיט את שם המקום, לא כוללים את .name בפרמטר content של AdvancedPlaceDetailsConfiguration.

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  // Query for loading the place details component.
  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  @State private var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content:[.address()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
  }
}

הסרת כפתורי פעולה

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ _ in
      return []
    }
  }
}

הוספת פעולות מוגדרות מראש ופעולות בהתאמה אישית

בדוגמה הזו נוספת למשתמש אפשרות להוסיף מקום למועדפים או להסיר אותו מהמועדפים, בנוסף לפעולה המוגדרת מראש פתיחה במפות.

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  
  @State var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ place in
      var actions: [MainPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart.fill"),
              label: "Unfavorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart"),
              label: "Favorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
    .cornerActions { place in
      var actions: [CornerPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart.fill"),
              accessibilityLabel: "Unfavorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart"),
              accessibilityLabel: "Favorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
  }

  func toggleFavorite(_ placeID: String) {
    if favoritePlaces.contains(placeID) {
      favoritePlaces.remove(placeID)
    } else {
      favoritePlaces.insert(placeID)
    }
  }
}

סינון ביקורות ותמונות וסרטונים

בדוגמת הקוד הזו מוצגים רק מדיה וביקורות שמוזכר בהם המונח 'קפה'.

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee")
  let searchReviewsOptions = SearchReviewsOptions(query: "coffee")

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: [.media(), .reviews()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { _ in }
    )
    .searchMediaOptions(searchMediaOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
    .searchReviewsOptions(searchReviewsOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
  }
}

יצירת משבצות תוכן

בדוגמה הזו, התוכן מתווסף למשבצות basicSectionTop ו-basicSectionBottom.

Swift

import SwiftUI
import PlacesSwift

struct ItineraryCard: View {
    static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

    @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
      identifier: .placeID(peetsCoffeePlaceID)
    )

    var body: some View {
      AdvancedPlaceDetailsCompactView(
        orientation: .vertical,
        query: $query,
        configuration: AdvancedPlaceDetailsCompactConfiguration(
          content: AdvancedPlaceDetailsCompactView.allContent,
          theme: PlacesMaterialTheme()
        ),
        placeDetailsCallback: { _ in }
      )
      .placeDetailsCompactContentSlot(position: .basicSectionTop) { place in
        Text("Day 2 • 2:30 PM")
          .font(.caption)
          .fontWeight(.bold)
          .foregroundColor(.accentColor)
      }
      .placeDetailsCompactContentSlot(position: .basicSectionBottom) { place in
        VStack(alignment: .leading, spacing: 4) {
          Text("AI Notes")
            .font(.caption)
            .bold()
          Text("Great quiet atmosphere for morning meetings. Famous for house-roasted pour-overs.")
            .font(.footnote)
            .foregroundColor(.secondary)
        }
        .padding(8)
        .background(Color(.systemGray6))
        .cornerRadius(8)
      }
    }
}