이번 포스트에서는 위젯과 애플리케이션 간의 데이터 공유 방법에 대해 정리하고자 한다.

애플의 공식 문서인 App Extension Programming Guide에서는 다음과 같이 설명하고 있다.

To enable data sharing, use Xcode or the Developer portal
to enable app groups for the containing app and its contained app extensions.
Next, register the app group in the portal and specify the app group 
to use in the containing app.

위젯과 애플리케이션의 데이터 공유를 위해서는 공통적으로 사용할 App group을 등록해 주어야 한다는 의미로, App group이 등록되면 UserDefaults(suiteName:)를 통해 접근이 가능하다.

App Group 지정하기


PROJECT에서 [Capability]-[App Groups]를 추가한 후 새로운 App Group을 생성한다. 이 때, APP과 Widget 둘 다 App Group을 생성해주어야 하며, 같은 App Group Identifier를 등록해 주어야 한다.


UserDefaults를 활용하여 데이터 공유하기


이렇게 등록한 App Group의 데이터를 UserDefaults를 통해 불러올 수 있다. extension을 통해 코드를 단순화시킬 수 있으나 제대로 동작하는지 테스트를 위해 UserDefaults를 그대로 호출하였다.

앱에서 공유할 데이터를 다음과 같이 set을 통해 저장하였고,

UserDefaults(suiteName: "group.com.sbk.todaycommit")!.set(token, forKey: "token")

이를 위젯에 표시하기 위해 string 형태로 변형한 후, Text로 표시하였다.

var body: some View {
    if let token = UserDefaults(suiteName: "group.com.sbk.todaycommit")?.string(forKey: "token") {
        Text(token)
    } else {
        Text("토큰 값 안나와유ㅠㅠ")
    }
}

데이터가 제대로 저장되었다면 위젯 실행 결과는 Automatic preview가 아닌 실제 빌드를 통해 확인 가능하다.


참고: https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1
https://eunjin3786.tistory.com/213
https://stackoverflow.com/questions/63922032/share-data-between-main-app-and-widget-in-swiftui-for-ios-14