Place Photos (novo)

Você pode usar o SDK do Places para iOS (novo) para solicitar fotos de lugares a serem exibidas no seu aplicativo. As fotos retornadas pelo serviço de fotos têm várias origens, inclusive proprietários de empresas e contribuições de usuários.

As fotos são imagens bitmap representadas por um objeto UIImage. Uma imagem de bitmap tem um tamanho máximo de 4.800 por 4.800 pixels.

Solicitar uma imagem

Você pode solicitar até 10 fotos de um lugar:

  1. Chame [GMSPlacesClient lookUpPhotosForPlaceID], transmitindo um ID de lugar e um callback GMSPlacePhotoMetadataResultCallback. Essa solicitação chama o callback GMSPlacePhotoMetadataResultCallback com um objeto GMSPlacePhotoMetadataList.

  2. No objeto GMSPlacePhotoMetadataList no callback, a propriedade da matriz results contém as fotos, em que cada foto é representada por um objeto GMSPlacePhotoMetadata.

  3. Para cada objeto GMSPlacePhotoMetadata na matriz, chame [GMSPlacesClient loadPlacePhoto:callback:] ou [GMSPlacesClient loadPlacePhoto:constrainedToSize:scale:callback:]. Esses métodos chamam o callback com uma imagem de bitmap utilizável como UIImage.

Outra maneira de solicitar fotos de um lugar é fazer uma solicitação de Place Details (novo), incluindo GMSPlacePropertyPhotos na lista de campos. A vantagem de fazer uma chamada do Place Details é que o objeto de resposta GMSPlace pode conter as fotos e qualquer outro campo de dados que você quiser para o lugar.

Exemplo de código

O método de exemplo a seguir usa um ID de lugar e recebe a primeira foto na lista retornada. Você pode usar esse método como modelo para criar no seu 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
}

Armazenamento em cache

As fotos carregadas usando [GMSPlacesClient loadPlacePhoto:callback:] ou [GMSPlacesClient loadPlacePhoto:constrainedToSize:scale:callback:] são armazenadas em cache no disco e na memória pelo sistema de carregamento de URL Foundation no NSURLCache compartilhado.

Para configurar o comportamento de armazenamento em cache, altere o cache do URL compartilhado usando [NSURLCache setSharedURLCache:] no método application:didFinishLaunchingWithOptions: do delegado do aplicativo.

Se você não quiser que seu aplicativo compartilhe um NSURLCache com o SDK do Places para iOS, crie um novo NSURLCache e use-o exclusivamente no seu app sem defini-lo como o cache compartilhado.

Atribuições

Na maioria dos casos, as fotos de lugares podem ser usadas sem atribuição ou terão a atribuição necessária incluída na imagem. No entanto, se a instância de GMSPlacePhotoMetadata retornada incluir qualquer attributions ou authorAttribution, inclua essas atribuições no aplicativo sempre que exibir a imagem. Consulte a documentação sobre atribuições.