Place Photos (nuevo)

Puedes usar el SDK de Places para iOS (nuevo) si quieres solicitar fotos de lugares a fin de que se muestren en tu aplicación. Las fotos que muestra el servicio de fotos provienen de diversas fuentes, como propietarios de empresas y fotos aportadas por usuarios.

Las fotos son imágenes de mapas de bits representadas por un objeto UIImage. Una imagen de mapa de bits tiene un tamaño máximo de 4,800 por 4,800 píxeles.

Solicitar una imagen

Puedes solicitar hasta 10 fotos de un lugar:

  1. Llama a [GMSPlacesClient lookUpPhotosForPlaceID] pasando un ID de lugar y una devolución de llamada GMSPlacePhotoMetadataResultCallback. Esta solicitud llama a la devolución de llamada GMSPlacePhotoMetadataResultCallback con un objeto GMSPlacePhotoMetadataList.

  2. Desde el objeto GMSPlacePhotoMetadataList de la devolución de llamada, la propiedad del array results contiene las fotos, en las que cada foto está representada por un objeto GMSPlacePhotoMetadata.

  3. Para cada objeto GMSPlacePhotoMetadata del array, llama a [GMSPlacesClient loadPlacePhoto:callback:] o a [GMSPlacesClient loadPlacePhoto:constrainedToSize:scale:callback:]. Estos métodos llaman a la devolución de llamada con una imagen de mapa de bits utilizable como una UIImage.

Otra manera de solicitar fotos de un lugar es realizar una solicitud de Place Details (nuevo) que incluya GMSPlacePropertyPhotos en la lista de campos. La ventaja de realizar una llamada a Place Details es que el objeto GMSPlace de respuesta puede contener las fotos y cualquier otro campo de datos que desees para el lugar.

Código de muestra

En el siguiente método de ejemplo, se toma un ID de lugar y se obtiene la primera foto de la lista que se muestra. Puedes usar este método como plantilla para el método que crearás en tu propia app.

Swift

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

// Request list of photos for a place
placesClient.lookUpPhotos(forPlaceID: placeID) { (photos, error) in

  guard let photoMetadata = photos.first else { return }

  // Request individual photos in the response list
  let fetchPhotoRequest = GMSFetchPhotoRequest(metadata: photoMetadata, maxSize: CGSizeMake(4800, 4800)
  placesClient.fetchPhoto(fetchPhotoRequest: fetchPhotoRequest, callback: {
    (photoURL: URL?, error: Error?) in
      guard let photoURL, error == nil else { return }
      print("Photo URL: \(photoURL)")
  })
};

Objective‑C

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

[placesClient lookUpPhotosForPlaceID:placeID callback: (GMSPlacePhotoMetadataList *list, NSError *error) {
  GMSPlacePhotoMetadata *photoMetadata = [list firstObject];

  if (photoMetadata == nil) { return }

  // Request individual photos in the response list
  GMSFetchPhotoRequest *fetchPhotoRequest = [[GMSFetchPhotoRequest alloc] initWithPhotoMetadata:photoMetadata maxSize:CGSizeMake(4800, 4800)];
  [placesClient fetchPhoto:fetchPhotoRequest, callback: ^(NSURL *_Nullable photoURL, NSError *_Nullable error) {
    if (error == null) {
      NSLog(@"Photo URL: %@", photoURL)
    }
  }];
}];

GooglePlacesSwift

// First fetch place details
// A hotel in Saigon with an attribution.
let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs"
let fetchPlaceRequest = FetchPlaceRequest(
  placeID: placeID,
  placeProperties: [ . name, .website ]
)
var fetchedPlace: Place
switch await placesClient.fetchPlace(with: fetchPlaceRequest) {
case .success(let place):
  fetchedPlace = place
case .failure(let placesError):
  // Handle error
}

// Use the place details to fetch a photo's image.
guard let photo = fetchedPlace.photos?.first else {
  // Handle place without photos.
}
let fetchPhotoRequest =
  FetchPhotoRequest(photo: photo, maxSize: CGSizeMake(4800, 4800))
switch await placesClient.fetchPhoto(with: fetchPhotoRequest) {
case .success(let uiImage):
  // Handle image.
case .failure(let placesError):
  // Handle error
}

Almacenar en caché

Las fotos que se cargan con [GMSPlacesClient loadPlacePhoto:callback:] o [GMSPlacesClient loadPlacePhoto:constrainedToSize:scale:callback:] se almacenan en caché en el disco y en la memoria a través del sistema de carga de URL de Foundation en el NSURLCache compartido.

Para configurar el comportamiento de almacenamiento en caché, puedes cambiar la caché de URL compartida con [NSURLCache setSharedURLCache:] en el método application:didFinishLaunchingWithOptions: del delegado de la aplicación.

Si no quieres que tu aplicación comparta un NSURLCache con el SDK de Places para iOS, puedes crear un NSURLCache nuevo y usarlo exclusivamente en tu app sin configurarlo como caché compartida.

Atribuciones

En la mayoría de los casos, las fotos de lugares se pueden usar sin atribución o tendrán la atribución requerida incluida como parte de la imagen. Sin embargo, si la instancia de GMSPlacePhotoMetadata que se muestra incluye cualquier attributions o authorAttribution, debes incluir estas atribuciones en tu aplicación dondequiera que muestres la imagen. Consulta la documentación sobre las atribuciones.