Search
🎟️

UserDefault with App Group

생성일
2020/09/23 12:23
태그
iOS
속성
속성 1
속성 2
2021/01/30 08:41
Today Extension, Widget ExtensionUserDefaults.standard 의 데이터에 접근이 불가능한 상황을 해결하기 위해 App Group 이란 것을 사용한다.

1. App Group 만들기

애플 개발자 홈페이지의 Account > Identifieres 에서 App Groups 를 추가해야 한다.
Identifier는 groups.{앱 bundle ID} 로 작성해 주면 된다

2. Capability 추가

프로젝트 설정의 Signing & Capabilities > + Capability 버튼을 클릭해 1번 과정에서 만든 ID를 선택해준다.
프로젝트 설정에서 UserDefault 를 공통으로 사용할 Target 에 모두 적용이 필요하다
Configuration 도 주의해야 한다. All 에 적용해야 Debug 나 Release 한쪽에서만 정상동작하는 실수를 피할 수 있다.

3. UserDefault 초기화

AS-IS
let userDefaults = UserDefaults.standard
Swift
복사
TO-BE
let userDefaults = UserDefaults.init(suitName: group.io.github.monibu1548.mosi)
Swift
복사

4. 이렇게 행복하게 끝이나면 좋겠지만

UserDefaults.standard 에 저장된 기존 과거들은 UserDefault.init(suitName:) 으로 생성한 UserDefault 에서 접근할 수 없기 때문에 Migration 과정이 필요하다.
만약 운영하던 앱에서 UserDefault.init(suitName:) 가 무작정 들어간다면 유저들은 데이터가 초기화 되는 현상이 발생하게 된다.
FYI) StackOverflow 에서 검색한 방법
func migrateUserDefaultsToAppGroups() { // User Defaults - AS-IS let userDefaults = UserDefaults.standard // App Groups Default - TO-BE let groupDefaults = UserDefaults(suiteName: "group.myGroup") // Key to track if we migrated let didMigrateToAppGroups = "DidMigrateToAppGroups" if let groupDefaults = groupDefaults { if !groupDefaults.bool(forKey: didMigrateToAppGroups) { // UserDefaults.standard 에서 값을 꺼내 App Group UserDefault에 적용하는 로직 for key in userDefaults.dictionaryRepresentation().keys { groupDefaults.set(userDefaults.dictionaryRepresentation()[key], forKey: key) } groupDefaults.set(true, forKey: didMigrateToAppGroups) } else { } } }
Swift
복사