רכיב מתקדם של פרטי מקום
גרסת 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. בתוכן מותאם אישית צריך לציין במפורש את המקור שלו.
לא מומלץ
אסור לכלול מודעות, טקסט שיווקי, הנחות שיווקיות או הנחיות להרשמה בתוך מאגרי מיקומים מותאמים אישית.
דוגמאות ל-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) } } }