SwiftUI) WidgetKit을 사용해서 Widget을 만들기(4) - 앱에서 위젯으로 데이터 보내기 app Group
앱에서 위젯으로 데이터를 보내줘야할 경우가 당연하게 생긴다. (그냥 하드코딩 하고싶지는 않자나?)
다음과 같은 방법을 통해서 데이터를 보내줄수 있다.
1. App Group 추가해주기
우리의 메인 앱의 Target으로 가게 되면 거기에서
Signing & Capabilityies에서 all 왼쪽에 있는 + Capability를 누르면
appGroups를 추가할수 있다.
해당 방법을 통해서 위젯과 앱 둘다 appgroups를 추가 하고 동일한 groupId로 설정해준다.
app Groups란?
동일한 팀이 개발한 앱 사이의 공유 컨테이너를 액세스 가능하도록 하는 그룹을 생성하는것이다.
이를 통해 프로세스간의 통신을 할수 있도록 한다.
$(TeamIdentifierPrefix).com.example.mygroup
를 사용해서 자동으로 ID를 확인하고 넣어줄수 있다. 뒤에 group은 자동으로 넣도록.
보통 그룹을 생성할때는
group.com.
과 같은 방법으로 만들어주는거를 추천한다.
2. UserDefaults를 공유 설정
기존의 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"
샘플코드
굉장히 만족스럽게 잘 나온다.