[swift] 오픈 API사용 해서 미세먼지 앱 만들기
미세먼지 어플을 만들어 보았습니다.
연습을 하기위하여 다양한 API를 활용해보기로 했습니다.
네이버 API로 좌표를 받으면 내 위치를 알수있는 API와
https://guide.ncloud-docs.com/docs/ko/naveropenapiv3-maps-reverse-geocoding-reverse-geocoding
공공 API를 확용하기 위한 TM 좌표값이 필요합니다.iOS에서 받아오는 좌표값은 WGS84 좌표값이었고, 근처 측정소를 찾기 위해선 TM좌표로 변환해야 했습니다. 그래서 kako의 좌표체계를 바꿔는 API를 사용하였습니다.
https://developers.kakao.com/docs/latest/ko/local/dev-guide#trans-coord
미세먼지 측정소의 위치를 확인할수 있는 공공 API와
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073877
미세먼지를 확인할수 있는 공공 API를 사용하였습니다.
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861
우선 ios에서 받아온 좌표를 주소로 바꿔주는 API
func getLocation(url: String, longitude: Double, latitude: Double, handler: @escaping(String) -> Void) {
let header1 = HTTPHeader(name: "X-NCP-APIGW-API-KEY-ID", value: NAVER_API.NAVER_CLIENT_ID)
let header2 = HTTPHeader(name: "X-NCP-APIGW-API-KEY", value: NAVER_API.NAVER_CLIENT_SECRET)
let headers = HTTPHeaders([header1,header2])
let parameters : Parameters = [
"coords" : "\(longitude),\(latitude)",
"output" : "json"
]
let alamo = AF.request(url,method: .get,parameters: parameters,headers: headers)
alamo.validate().responseJSON { response in
// debugPrint(response)
switch response.result {
case .success(let value) :
let json = JSON(value)
let data = json["results"]
let address = data[0]["region"]["area2"]["name"].string!
LocationInfo.shared.nowLocationName = address
handler(address)
case .failure(_):
let alert = UIAlertController(title: nil, message: "네트워크를 다시 확인해주세요", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
return
}
}
}
미세먼지 API를 활용하기 위해 좌표 체계를 바꾸는 API
func TM(url: String, longitude: Double, latitude: Double, handler: @escaping(userLocation) -> Void) {
var result = userLocation()
let headers:HTTPHeaders = ["Authorization" : KAKAO_API.KAKAO_KEY]
let parameters: Parameters = [
"x" : longitude,
"y" : latitude,
"output_coord" : "TM"
]
let alamo = AF.request(url, method: .get,parameters: parameters, encoding: URLEncoding.queryString ,headers: headers)
alamo.responseJSON() { response in
debugPrint(response)
switch response.result {
case .success(let value):
let json = JSON(value)
let documents = json["documents"].arrayValue
result.longitude = documents[0]["x"].double
result.latitude = documents[0]["y"].double
handler(result)
case .failure(_):
let alert = UIAlertController(title: nil, message: "네트워크를 다시 확인해주세요", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
return
}
}
}
미세먼지 API를 활용하기위한 가장 인근의 측정소 확인 API
func getNearbyMsrstn(url: String, tmX: Double, tmY: Double, handler: @escaping(String) -> Void) {
let parameters: Parameters = [
"serviceKey" : AIR_POLLUTION_STATION_API.AIR_POLLUTION_STATION_KEY,
"tmX" : tmX,
"tmY" : tmY,
"returnType" : "json"
]
let alamo = AF.request(url, method: .get,parameters: parameters, encoding: URLEncoding.default)
alamo.responseJSON() { response in
debugPrint(response)
switch response.result {
case .success(let value):
let json = JSON(value)
let stationName = json["response"]["body"]["items"][0]["stationName"].string!
LocationInfo.shared.stationName = stationName
handler(stationName)
case .failure(_):
let alert = UIAlertController(title: nil, message: "네트워크를 다시 확인해주세요", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
return
}
}
}
마지막 미세먼지 확인 API
func getfinedust(url: String, stationName: String, handler: @escaping(String, String, String) -> Void) {
let parameters: Parameters = [
"serviceKey" : AIR_POLLUTION_API.AIR_POLLUTION_KEY,
"stationName" : stationName,
"dataTerm" : "DAILY",
"returnType" : "json"
]
let alamo = AF.request(url, method: .get,parameters: parameters, encoding: URLEncoding.default)
alamo.responseJSON() { response in
switch response.result {
case .success(let value):
let json = JSON(value)
let pm10Value = json["response"]["body"]["items"][0]["pm10Value"].string!
let pm10GradeValue = json["response"]["body"]["items"][0]["pm10Grade"].string!
let dataTime = json["response"]["body"]["items"][0]["dataTime"].string!
LocationInfo.shared.pmGradeValue = pm10GradeValue
LocationInfo.shared.dataTime = dataTime
LocationInfo.shared.pmValue = pm10Value
handler(pm10Value,pm10GradeValue, dataTime)
case .failure(_):
let alert = UIAlertController(title: nil, message: "네트워크를 다시 확인해주세요", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
return
}
}
}
그리고 이 값들을 저장하고 불러올 싱글톤 객체
class LocationInfo {
static let shared = LocationInfo()
var nowLocationName: String?
var longitude: Double?
var latitude: Double?
var pmValue : String?
var pmGradeValue: String?
var dataTime: String?
var stationName: String?
private init() { }
}
이를 통해 싱글톤에 대한 공부와 escaping closure, RSET API활용하기, Alamofire, CLLocation 사용법등 많은 공부를 해볼수 있었습니다.
github - https://github.com/JangJuMyeong/AirPollutionCheck
Author And Source
이 문제에 관하여([swift] 오픈 API사용 해서 미세먼지 앱 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@isouvezz/swift-오픈-API사용-해서-미세먼지-앱-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)