맛동산이

SwiftUI) WidgetKit을 사용해서 Widget을 만들기(4) - 앱에서 위젯으로 데이터 보내기 app Group 본문

앱/SwiftUI

SwiftUI) WidgetKit을 사용해서 Widget을 만들기(4) - 앱에서 위젯으로 데이터 보내기 app Group

진ddang 2023. 8. 28. 15:11

앱에서 위젯으로 데이터를 보내줘야할 경우가 당연하게 생긴다. (그냥 하드코딩 하고싶지는 않자나?)

다음과 같은 방법을 통해서 데이터를 보내줄수 있다.

1. App Group 추가해주기

우리의 메인 앱의 Target으로 가게 되면 거기에서

Signing & Capabilityies에서 all 왼쪽에 있는 + Capability를 누르면

Untitled.pngUntitled.png

appGroups를 추가할수 있다.

해당 방법을 통해서 위젯과 앱 둘다 appgroups를 추가 하고 동일한 groupId로 설정해준다.

app Groups란?

Untitled.png

동일한 팀이 개발한 앱 사이의 공유 컨테이너를 액세스 가능하도록 하는 그룹을 생성하는것이다.

이를 통해 프로세스간의 통신을 할수 있도록 한다.

스크린샷_2023-08-27_오후_11.17.04.png

$(TeamIdentifierPrefix).com.example.mygroup 

를 사용해서 자동으로 ID를 확인하고 넣어줄수 있다. 뒤에 group은 자동으로 넣도록.

보통 그룹을 생성할때는

group.com.

과 같은 방법으로 만들어주는거를 추천한다.

2. UserDefaults를 공유 설정

Untitled.png

기존의 standard로 만들어진 UserDefaults를 사용하는것이 아닌. 새로이 suiteName으로 init한다.

suteName으로 init하는 이유는 특정 데이터베이스로 접근하기 위한 것

extension UserDefaults {     static var shared: UserDefaults {         let appGroupId = "group.clocks"         return UserDefaults(suiteName: appGroupId)!     } } 

이렇게 만들어주자!

💡 중요한점은 appGroupid 가 위에서 만들었던 appGroupIdentifier와 동일하도록 한다.

3. 공유된 UserDefaults에 정보 저장하기

공유된 UserDefaults를 사용하기 위해서는 기존의 UserDefaults.standard가 아닌 아까 만든 suiteName으로 생성된 userdefaults를 사용해야한다.

하지만 SwiftUI에서는 @AppStoreage 프로퍼티 래퍼를 사용해서 UserDefaults를 사용하는데 어떻게 해야할까?

답은 간단하다.

기존의 코드에서 store라는 파라미터를 통해서 명시적으로 어느 userDefault에 저장할지를 알려주면된다.

var currentSelectedGlobalTime = "Africa/Algiers" UserDefaults.shared.set(currentSeletedGlobalTime, forKey: "timezone") 

4. 공유된 정보 가져오기

위젯에서 이제 명시적으로 불러오기만 하면 된다.

옵셔널 처리는 거지같이 햇습니다.

UserDefaults.shared.string("globalTimeID") ??  "none" 

샘플코드

Untitled.pngUntitled.pngUntitled.png

굉장히 만족스럽게 잘 나온다.

반응형