- Total
꿈꾸는리버리
SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기 본문
☁️ Widget 시리즈
기본 시리즈
SwiftUI Widget 딱대.. (1/3) 위젯 기본 개념 + 구현
SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기
SwiftUI Widget 딱대.. (3/3) : 위젯을 눌렀을 때 다른 화면으로 뜨게 하기
에러 시리즈
SwiftUI Widget 딱대(짐).. : 위젯 memory 제한
SwiftUI Widget 딱대(짐).. : localization 적용
SwiftUI Widget 딱대(짐).. : 위젯에 폰트가 안 먹혀요...
SwiftUI Widget 딱대(짐).. : 딥링크가 안되는 뎁숑 ?
이번 블로그에서는 앱 내의 데이터를 위젯으로 연결하는 방법에 대해 알아볼 거다.
내가 이번에 만들고자 하는 앱에서는 제일 최근에 재생한 음악이 위젯에 떠야 하기 때문에 앱과 위젯 사이에 데이터를 공유하는 게 필요했다.
정말 간단한 정보만 공유하기 때문에,, userDefault를 사용하고자 했지만, 안됐다..
이거 때문에 삽질을 많이 했는데... 찾아본 결과 App과 extention으로 추가한 widget은 같은 앱 내에 있지만, 각각 다른 container를 가지고 있기 때문에 userDefault가 공유되지 않는다고 한다.
그래서 Option으로 표시된 회색 박스 ! shared Container을 사용해야지 앱과 위젯 둘 사이에 공통적으로 쓸 수 있는 데이터가 생긴다.
shared Container을 사용하는 방법에 App Group을 사용하는 방법이 있었다,
App Group에 대해 알아보니까 같은 개발자의 앱일 때 해당 개발자의 앱 내에서 공유할 수 있는 데이터를 저장할 때 사용한다고 한다.
1️⃣ App Group 설정
동일한 app groups의 identifier을 app과 widget 각각 추가한다.
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)
}
'오뚝이 개발자 > SwiftUI' 카테고리의 다른 글
swiftUI list drag and drop (0) | 2022.09.07 |
---|---|
SwiftUI Widget 딱대.. (3/3) : 위젯을 눌렀을 때 다른 화면으로 뜨게 하기 (0) | 2022.08.07 |
SwiftUI Widget 딱대.. (1/3) 위젯 기본 개념 + 구현 (0) | 2022.08.06 |
SwiftUI launchScreen(splash Image) 만들기 ( delay가 가능한.. ) (0) | 2022.08.04 |
SwiftUI : StateObject 실험실 (2) | 2022.06.02 |