반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기 본문

오뚝이 개발자/SwiftUI

SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기

rriver2 2022. 8. 7. 18:14
반응형

SwiftUI Widget 딱대.. (1/4) : WidgetKit 설명

 

이번 블로그에서는 앱 내의 데이터를 위젯으로 연결하는 방법에 대해 알아볼 거다.

 

내가 이번에 만들고자 하는 앱에서는 제일 최근에 재생한 음악이 위젯에 떠야 하기 때문에 앱과 위젯 사이에 데이터를 공유하는 게 필요했다.

정말 간단한 정보만 공유하기 때문에,, userDefault를 사용하고자 했지만, 안됐다..

이거 때문에 삽질을 많이 했는데... 찾아본 결과 App과 extention으로 추가한 widget은 같은 앱 내에 있지만, 각각 다른 container를 가지고 있기 때문에 userDefault가 공유되지 않는다고 한다.

그래서 Option으로 표시된 회색 박스 ! shared Container을 사용해야지 앱과 위젯 둘 사이에 공통적으로 쓸 수 있는 데이터가 생긴다.

 

 

shared Container을 사용하는 방법에 App Group을 사용하는 방법이 있었다,

App Group에 대해 알아보니까 같은 개발자의 앱일 때 해당 개발자의 앱 내에서 공유할 수 있는 데이터를 저장할 때 사용한다고 한다.

 

1️⃣ App Group 설정

동일한 app groups의 identifier을 appwidget 각각 추가한다.

 

 

2️⃣ App Group 사용법

값넣기

userDefault(이전 블로그)와 쓰는 방법이 거의 똑같은데 다른 점은 저장할 때 이렇게 지정했었던 app group 명을 적어줘야 한다는 거다 !

 UserDefaults(suiteName: "group.widget.relaxOn")!.set(encodedData, forKey: "smallWidgetData")

 

불러올 때는 이렇게 불러오면 된다.

UserDefaults(suiteName: "group.widget.relaxOn")!.value(forKey: "smallWidgetData")

 

 

+) manager 사용하기

나는 이렇게 manager을 만들어서 썼다. 나는 struct을 넣었기 때문에 저장하고 값을 빼낼때 decode, encode가 필요했다.

class WidgetManager {
    static func addMainSoundToWidget(imageName: String, name: String, id: Int) {
        let data = SmallWidgetData(imageName: imageName, name: name, id: id)
        if let encodedData = try? JSONEncoder().encode(data) {
            UserDefaults(suiteName: "group.widget.relaxOn")!.set(encodedData, forKey: "smallWidgetData")
        }
        WidgetCenter.shared.reloadTimelines(ofKind: "RelaxOnWidget")
    }
}
private func loadLatestMixedSoundData() -> Timeline<CDWidgetEntry> {
        
        let entry: CDWidgetEntry
        
        if let widgetData = UserDefaults(suiteName: "group.widget.relaxOn")!.value(forKey: "smallWidgetData") as? Data,
           let data = try? JSONDecoder().decode(SmallWidgetData.self, from: widgetData) {
            entry = CDWidgetEntry(imageName: data.imageName, id: data.id, name: data.name)
        } else {
            entry = CDWidgetEntry()
        }
        
        return Timeline(entries: [entry], policy: .never)
}

 

반응형
Comments