【Swift】FoursquareのPlaces APIを使ってみた

Swiftには`MKMapView`がありこれを使うと地図を表示できる。

周辺のスポット検索ができないかと思っていたところFoursquareにたどり着いた。

https://www.foursquare.com/developers/apps

登録してログインすると、ClientIDとClientSecretが手に入るのでこれを使う。

以下のようにパラメータを設定してリクエストを投げる。

https://api.foursquare.com/v2/venues/search
  ?client_id=CLIENT_ID
  &client_secret=CLIENT_SECRET
  &ll=40.7,-74
  &query=sushi
  &v=YYYYMMDD
  • 「ll」は経度緯度を指定する。”40.7,-70″。
  • 「query」は探したいジャンルを指定する。”sushi”。
  • 「v」はAPIのバージョン,日付を設定する。20200505。
  • 「radius」で検索範囲を指定できる。単位はメートル。100。

以下のコードを書いてみた。

環境はSwift5, iOS13.

    func doubleToCoordinate(lat:Double,lng:Double) -> CLLocationCoordinate2D{
        var loc = CLLocationCoordinate2D()
        loc.latitude = lat
        loc.longitude = lng
        return loc
    }
    
    func searchAroundVenue(loc:CLLocationCoordinate2D){
        
        let clientId = "JN0UJMZ0・・・"
        let clientSecret = "5MXF4GN・・・"
        let loc = coordinateToString(loc: loc)
        let radius = 500
        let version = "20200601"
        let query = "sushi"
        
        var url = "https://api.foursquare.com/v2/venues/explore?&client_id=" + clientId
        url += "&client_secret=" + clientSecret
        url += "&v=" + version
        url += "&ll=" + loc
        url += "&query=" + query
        url += "&radius=" + String(radius)
        
        let req_url = URL(string: url)
        let req = URLRequest(url: req_url!)
        let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)
        
        let dispatchGroup = DispatchGroup()

        dispatchGroup.enter()
        
        let task = session.dataTask(with: req, completionHandler: {
            (data, response, error) in
            session.finishTasksAndInvalidate()
            print(String(data:data!, encoding:String.Encoding(rawValue: String.Encoding.utf8.rawValue))!)
            //JSONをパースする処理を書く
            dispatchGroup.leave()
            })
        
        task.resume()

        dispatchGroup.notify(queue: .main){
          //パースした内容を使って何かする!
            }
        }
        
    }

`dataTask`でURLにアクセスするようにしている。

dataTaskは別スレッドで処理されるので、DippatchGroupを使って非同期処理が終わるのを待つ。

SwiftだとJSONをパースするのが少し面倒だが、構造体を用意してパースすれば良い。