swiftapigoogle-placesgmsmapviewgmsplace

Swift 4 Get multiples places from Google Places API


I have trouble with fetching multiples places from Google Places API. The problem is... if i fetch only one pin type like Bars, its ok, no problem. But if i trying to get Restaurants, Bars, Casino... multiples types, it gives my only first place, in our case Restaurants.

I tried make same request with Postman with link below... but for example

I use this code to get places i want:

func fetchPlacesNearCoordinate(_ coordinate: CLLocationCoordinate2D, radius: Double, types:[String], completion: @escaping PlacesCompletion) -> Void {

    var urlString = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=\(coordinate.latitude),\(coordinate.longitude)&radius=\(50000)&rankby=prominence&sensor=true&key=\(googleApiKey)"
    let typesString = types.count > 0 ? types.joined(separator: "|") : "food"
    urlString += "&types=\(typesString)"
    urlString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? urlString

    guard let url = URL(string: urlString) else { completion([]); return }

    if let task = placesTask, task.taskIdentifier > 0 && task.state == .running {
        task.cancel()
    }

    DispatchQueue.main.async {
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    }

    placesTask = session.dataTask(with: url) { data, response, error in

        if data != nil{
            for el in data!{
                //print(el)
            }
        }
        var placesArray: [PlaceContent] = []
        defer {
            DispatchQueue.main.async {
                UIApplication.shared.isNetworkActivityIndicatorVisible = false
                completion(placesArray)
            }
        }

        guard let data = data else { return }

        do{
            let decode = try JSONDecoder().decode(GooglePlacesAnswer.self, from: data)
            placesArray = (decode.results?.map{ $0.toPlaceContent() }) ?? []
        } catch let value{
            print(value.localizedDescription)
        }
    }
    placesTask?.resume()
}

Solution

  • You can't get places for multiple types as stated in official documentation. You have to make multiple requests and combine the results.

    https://developers.google.com/maps/documentation/javascript/places

    type — Restricts the results to places matching the specified type. Only one type may be specified (if more than one type is provided, all types following the first entry are ignored). See the list of supported types.