[swift] 오픈 API사용 해서 미세먼지 앱 만들기

8037 단어 swiftswift

미세먼지 어플을 만들어 보았습니다.

연습을 하기위하여 다양한 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

참고 - https://ios-dev-skyline-23.tistory.com/entry/Swift%EB%A1%9C-%EB%AF%B8%EC%84%B8%EB%A8%BC%EC%A7%80-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0

좋은 웹페이지 즐겨찾기