본문 바로가기
SwiftUI Project/SwiftUI Troubleshooting

[날씨의 i] 첫 WidgetKit 도전..! 험난했던 시작 (WidgetKit 추가와 AppGroup설정, UserDefaults로 데이터 공유)

by thekoon 2023. 9. 10.

안녕하세요!

최근에 날씨의 i를 출시하고

소소한 기능 개선과 버그 픽스를 하며 보냈습니다:)

완성하고 어느정도 업데이트로 앱이 안정되다보니 

조금 느슨해져서 뭘 할까..하다가

SwiftUI 스터디에 가입하고 오랜만에 SwiftUI를 해보자! 마음먹었습니다ㅎㅎ

 

초기에 날씨앱을 만들자고 생각할때

위젯은 필수로 있어야 된다고 생각했었는데요

UIKit 위주로 만들다 보니

SwiftUI만 사용해야하는 위젯킷은 왠지 뒤로 계속 미루었던거 같네요ㅠㅠ

 

오랜만에 하는 SwiftUI.. 재미있겠다! 하고 WidgetKit을 추가하는 순간

제가 알던 SwiftUI가 아니라 이상한 코드들이 있어서 멘붕에 빠졌습니다.

 

덕분에 일주일동안 공식문서부터 차근차근 시작해 위젯킷을 공부하고, SwiftUI도 복습하고,

다양한 시행착오를 겪으며..겨우 위젯을 그릴 수 있게 되었는데요

지금까지 한 것들을 간단하게 정리해보려 합니다:)

 

https://developer.apple.com/documentation/widgetkit/

 

WidgetKit | Apple Developer Documentation

Extend the reach of your app by creating widgets, watch complications, and Live Activities.

developer.apple.com

 

우선 위젯은 AppExtension으로 본 App과 데이터 연동이 되지 않습니다.

이미 NotificationContentsExtension할때 삽질을 많이해서 어느정도 알고는 있었는데요

이번에는 AppGroup으로 데이터를 공유해보자 생각했습니다!

WidgetKit을 추가하고, 동일한 id로 앱그룹을 만들어 줍니다.

그리고 UserDefault로 WidgetKit에 필요한 데이터를 공유해서 사용하려 합니다.

extension으로 shared를 만들고 AppGroup의 Id를 설정해놓으면 데이터를 저장하고, 불러오는데 편리합니다.

 

[저장하기]

[불러오기]

 

우선 위젯에서 필요한 데이터들이

1. 현재 유저의 좌표

2. 현재 좌표를 바탕으로 기상청 서버에 데이터 요청

3. 받은 데이터를 바탕으로 날씨 아이콘, 유저 위치, 온도, 강수확률 등 간단한 데이터라고 생각했는데요

 

처음에는 위젯이 자체적으로 GPS를 요청하고, 좌표를 보내고, 위젯을 그리려고 했었는데

생각보다 쉽지 않았습니다.

본 앱에서 위치권한을 동의했다 하더라도 위젯은 따로 위치권한을 요청해야하고,

중간중간 필요할때마다 GPS 사용하는것도 비효율적이라 생각했습니다. 

 

그래서 시행착오 끝에

본 앱의 최신 GPS 좌표 정보를 UserDefault로 저장하고,

WidgetKit에서 그 위치좌표를 바탕으로 기상청 서버에 데이터를 요청하기로 했습니다!

 

LocationService에서 앱의 위치를 GPS로 얻고,

기상청에서 사용하는 X, Y좌표로 변환한 convertedX, convertedY값을 UserDefaults에 저장했습니다.

 

그리고 WidgetKit에 WeatherNetwork Class를 만들어 가져온 좌표를 바탕으로 기상청 서버에 데이터를 요청하는 URL을 만들었습니다.

그리고 Combine을 사용해 데이터 처리를 시도해보았는데요

오랜만에 Combine을 해서 다 까먹었었지만

GPT한테 물어보며 코드를 작성했습니다.

Combine을 사용하면 코드가 확 줄어들어 편리한데요

특히 .retry(5)로 통신 재시도를 5번 정도 시도하게 만들어서 혹시 서버와 통신이 실패하더라도 재시도 하도록 만들었습니다.

간단하니 좋네요ㅎㅎ

 

이제 어느정도 준비는 끝났고

본격적으로 WidgetKit을 적용해보려 하는데요 

글이 길어져서 다음 글로 돌아오겠습니다!

궁금하신 분들 놀러오세요~!