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をパースするのが少し面倒だが、構造体を用意してパースすれば良い。