잡초의 일지

[Swift] [SwiftUI] 기상청 API 이용한 날씨 앱 만드는 일지 본문

Just for fun/iOS

[Swift] [SwiftUI] 기상청 API 이용한 날씨 앱 만드는 일지

JabCho 2020. 8. 10. 21:46
728x90
반응형
SMALL
이 글은 두서없이 적은 일지 입니다.
정리하여 적은 글은 아래의 링크입니다.

정리된 글 링크 :

alicecodealice.tistory.com/140

 

기상청 api를 사용 할 때 유의하여야 할 점 :

1. 시시각각 변하는 정보를 주지 않는다. 1시간 단위의 정보를 준다. --> 이게 가장 띠용이었다. 분 단위의 정보인줄 알고 사용했는데..

2. json 파일을 자세히.. 제대로 보아야 한다..어떤 타입인지 확인이 필요하다. 스트링인지, 정수인지 그런것. --> 오랜만에 작동시켜보려고 했는데, 작동하지 않았고, 코드상의 오류인줄 알고 코드를 고치려 했으나, 타입 오류였다. 숫자형태였던 자료형들이 모두 String이 되었다. 

3. 생각나는대로 더 적겠다.

 

참고

기상청 api를 이용하기 전에, openweathermap이라는 곳의 api를 이용해서 소소하게 만들어봤다.

openweathermap.org

 

Сurrent weather and forecast - OpenWeatherMap

Dashboard and Agro API We provide satellite imagery, weather data and other agricultural services that are based on geodata. By using Agro API , you can easily power your solution based on this information. Dashboard is a visual service where you can easy

openweathermap.org

 

기상청에서도 api를 지원한다는걸 알고 그걸 써보고 싶었다.

아래의 깃헙을 참고해서 기상청 api를 연결해 봤다.

 

github.com/irmusyafa/ios-weatherapp-swiftui

 

irmusyafa/ios-weatherapp-swiftui

iOS WeatherApp with SwiftUI. Contribute to irmusyafa/ios-weatherapp-swiftui development by creating an account on GitHub.

github.com

 

시도

많은 시행착오들이 있었다.

대부분 형식이 비슷하기 때문에, json형태로 받으면 하던대로 하면 됐었다.

하지만, 계속 codingkey를 찾을 수 없다는 에러가 났고, ......

왼쪽: 기상청api, 오른쪽: openweathermap api

내가 코드를 잘못 적었다는 것을 알았다..

위의 사진에서 ItemDetails에 나타나는 변수의 자료형은 모두 String이어야 한다. 이것을 고치면 제대로 작동한다. 

자꾸 body에서 item을 찾을수 없다고 하길래 뭔 헛소린가 했는데.. items 안에 item이 있고,

그 item은 ItemDetails배열 형태이면서(내가정해준이름) ItemDetails안에 내가 쓸 자료들이 있다는것을 알고 띠용 해버렸다...

몇일을 이걸 보고 있었는데도 몰랐다니..;;;

그래서 고치고서 돌려보니까, 한동안 하얀 화면에 error가 나오다가 success가 뜨고 서울의 기온이 나왔다.

근데 이상하게 나왔다.. 이건 더 알아봐야 할 것 같다.

 

일단 요상한 데이터였어도, 데이터를 불러오는것 자체에 성공했다는것이 너무 기쁘다 진짜.ㅠㅠㅠ

 

-----------------------------------------------

얼음 먹고 생각났는데, 날짜를 잘못 설정해서 이상한 숫자가 나온것 같다.

다시 설정해야겠다.

해보니, 됐다.

ㅋㅋㅋ.. 바보였다..

여기 링크에서 날짜와 시간을 바꿔주면 된다.

 

 

근데, 실시간 정보는 못받는거 같다.......... 

한시간 단위의 정보를 준다..

 

2020-08-13--------------------------------------------------------------------------------------------------------------------------------

datepicker와 picker를 구현해서 각각 날짜와 시간을 받도록 했다. (다 하고 생각해보니까 지역도 정해줘야된다)

@State로 받은 값을 다른곳에서 쓰려고 viewmodel의 observableobject를 이용해서 published와 observed로 썼다.

하지만, 생각해도 해봤는데, get data() 할때 오류가 난다. 음... 왜 오류가 나는것일까..?

예전에 보고 따라하던 weatherapp에서 city넣는 textfield를 참고해서 봐야겠다. 

텍스트필드나 피커나 비슷하겠지??

 

그리고 url 주소를 사용할때 medium.com/swift2go/building-safe-url-in-swift-using-urlcomponents-and-urlqueryitem-alfian-losari-510a7b1f3c7e

 

Building Safe URL in Swift Using URLComponents and URLQueryItem — Alfian Losari

Constructing URL is a routine task that every Swift developers do when building an iOS application. It’s very important to make sure the…

medium.com

여기를 보면, query로 간단하게 넣을 수 있다. 이걸 이용해서 코드를 좀 바꿔봐야겠다.

 

이전에 따라했던 코드를 보면서 힌트를 얻어서 picker에서 받은 값을 url에 넣을 수 있게 되었다.

근데 

이렇게 값이 나오긴 하는데

두번째 클릭했을 때 처음에 바라던 값이 나오고, 아무것도 하지 않아도 그냥 버튼을 누르면 막 .. 바뀐다.. 왜인지는 모르겠다..

 

숫자가 커지는 이유는 알았다.

만약에 내가 20200808일 05시를눌렀다면, 05~06시의 온도를 재기 때문에, 그 다음인 07시를 자동으로 넘겨주는것같다.

 

너무 기뻐서 입틀막했따

picker에서 받은 값을 url에 넣는것을 성공했다.

 

이제 ui를 이쁘게 꾸며야겠다. 

너무 신난다

 

지금까지 되긴 되지만 고쳐야 하는것 -> picker의 view레이아웃 문제, location 표시. location이 안뜨기 때문에 내가 정한 위치의 날씨를 받는것인지 모른다. ... 왜... 안되는거지?

 

stackoverflow.com/questions/60029060/swiftui-actionsheet-picker

 

SwiftUI ActionSheet Picker

I'm trying to create in SwiftUI an action sheet that appears after pressing a button and allow the user to select and return an item throught a picker (like this https://imgur.com/a/IbS7swX). Any ...

stackoverflow.com

그리고 여기 보면 picker를 action sheet 로 나오게 하는게 있다. 이런 방법도 좋을것 같다.

app.quicktype.io

 

Instantly parse JSON in any language | quicktype

 

app.quicktype.io

그리고 json파일을 파싱하도록 쉽게 코드를 바꿔주는 사이트도 있다.

 

2020-08-14----------------------------------------------------------------------------------------------------------------

developer.apple.com/forums/thread/120790

 

UITableViewAlertForLayoutOutsideVi… | Apple Developer Forums

Hi i get an error [TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcin

developer.apple.com

여길 보니, 경고는 무시해도 되는듯 해보인다.

 

그러나, 여전히 location이 읽히지 않는다.. 무엇이 잘못되었길래 그런걸까...... String타입인것 외에 다를게 없을텐데...

 

2020-08-16----------------------------------------------------------------------------------------------------------------

 

picker의 selection이 int형으로 받아야 해서 그랬떤 것이다. list안에 있는 값을 받는줄 알았는데 n번째 로 받는것 같다. 이제 숫자로 받은 값을 list에 대응해서 string으로 바꿔주면 완벽하게 끝나겠다!

 

아 그리고 https 가 아닌 http를 사용하기 때문에 info.list였나 거기서 설정에서 바꿔주어야 한다. 
daheenallwhite.github.io/ios/xcode/2019/11/13/iOS-HTTP/

 

all white cheat sheet-Dana's Swifty Log

Swift, iOS, programming, tech, 앱 개발

daheenallwhite.github.io

2020-12-28----------------------------------------------------------------------------------------------------------------

정돈되지 않았던 UI를 고치기 위해, 좀 더 세부적으로 디자인을 설계하였다.

 

2021-01-09----------------------------------------------------------------------------------------------------------------

 

디자인을 고치기 위해 들어갔지만, 실행이 되지 않아 원인을 분석 해 본 후 

그래도 실행이 되지 않으면 다시 만들어야 하겠다...

 

왜 .. 안되는지 원인을 찾지 못하였다.. 

심지어 오랫동안 코드를 안봤다보니, 내용도 잊어버려서 

아예 다시 만드는것이 더 나을수도 있겠다. 

 

디자인까지 3일이면 모두 만드는것이 가능할것 같다. 이번 주말 안에 하는것을 목표로 해야 겠다.

========================================================================

1. 우선, 인증키에 문제가 있는것은 아닌지, 

간단하게 확인을 해본다.

인증키를 넣은 url을 주소창에 치니, 맞는 정보가 나왔다.

인증키에는 문제가 없다.

 

2. UI때문에 일어난 문제일까.

생각해보니, 먼저 버튼이 뜨고, 그 버튼을 누르면 값이 나오는 구조였는데, 버튼조차 나오지 않았다.

그렇다면 UI로 값을 읽는 과정에서 잘못된것일까

UI 부분을 보아도, 먼저 조건으로 success일 때 버튼이 뜨도록 했기 때문에, 일단 이것이 fail이 되는 문제를 해결해야 한다.

그렇다면, UI로 인해 일어나는 문제는 아니다. 

 

 UI에서 조건을 해제한 후 시험해 보았더니, 

날짜, 위치 등 UI에서 사용자가 설정하는 값은 잘 표기되었지만, 

정보를 불러오는 온도 부분만 나오지 않았다.

 

 UI에는 문제가 없으며, 정보를 불러오는 과정에서 문제가 있다.

 

3. 코드 내에서 잘못된 부분이 있는지

중간중간 값을 프린트하며 확인한다.

 

우선, 에러 메시지가 뜬 곳부터 살펴본다.

시뮬레이터에 Text로 error라고 뜨고, 콘솔창에 stateView: failed라고 뜨기 때문에,

이것들이 프린트 되는 이유들을 찾아간다.

 

updateStateView()에서 stateCurrnetWeather가 failed이기 때문에 stateView가 failed가 되고 콘솔창에 출력이 된 것이었다.

 

그렇다면 왜 stateCurrentWeather가 failed가 된걸까 찾는다.

 

getData()에서 updateStateView()아래에 retry()를 하면 계속 fail하는것을 볼 수 있다.

- 이 코드는, 우선 defined된 정보를 보여준 다음, 사용자가 정보를 입력하면 retry()를 이용해 정보를 다시 getData()한다.

그렇다면, 처음 defined 될 때 이상이 생겨 안나타나는것이라고 할 수 있겠다.

따라서 잠시 UI의 조건을 해제한 후 retry()를 통해 콘솔에 나오는 값을 보았다. 

여전히 문제가 해결되지 않는 것으로 보아, getData()에서의 문제인것 같다.

 

요청하는 url의 문제인지 확인하기 위해 request를 프린트 하여 확인해 보았다.

그 결과, url에는 문제가 없는것으로 보아, 디코딩 할 때의 문제인것 같다.

 

4. 디코딩 할 때 코드의 문제인가

getBaseRequest를 확인한다.

 

아, 혹시 swift5로 업데이트 되면서 무언가 지원하지 않는것이 생긴걸까.. 다시 만드는게 더 빠를것 같은 느낌이 든다.

 

==============================================================================

어디에서 문제가 생기는지 알 수 없을것 같다.. 

새로운 버전으로 UI를 이쁘게 고쳐서 다시 만든 후, 포스팅 하겠다.

완성본 코드는 포스팅에 올리겠다.

 

비록 오류를 찾지 못했지만, 그것은 아직 내가 부족하기 때문이라고 생각한다.

(계속해서 무엇때문에 안되는것인지 찾을것이다. 지금은 이것만 매진하기에는 낭비라고 생각하여 새로 만들면서 공부할 계획이다.)

따라서 차근차근 다시 처음부터 만들면서 고민해 보는것이 나에게 더 도움이 되는 방향이라고 생각된다.

 

2021-03-04----------------------------------------------------------------------------------------------------------------

코드상의 오류인줄 알고 거의 반정도 포기해 있던 상태였다. (절대 틀리지 않은것 같은데 작동하지 않았기 때문이다.)

알고보니, Double 타입이었던 자료형이 String형으로 바뀌어서 그랬다. 

데이터를 제공한 측에서 이런 점을 명시해 주었으면 좋겠다.

728x90
반응형
LIST
Comments