
앱 테스트를 위해서는 설정페이지를 만들어야 하는 경우가 있습니다. 이러한 경우 앱 내에 설정 페이지를 넣어도 되지만 iOS에서 기본으로 지원해주는 Setting Bundle 기능을 이용하여 손쉽게 구현 할 수도 있습니다.

다음의 경우는 Setting Bundle 을 이용하기에 충분한 조건들 입니다.
1. 디버그 버전에서 앱 테스트를 위하여 값들을 변경해보고 싶은 경우
2. `UserDefaults` 에 저장된 값을 가지고 테스트를 해야하는 경우
위 조건을 만족한다면 나의 앱에 어떻게 Setting Bundle 을 추가할 수 있을지 한번 알아보도록 하겠습니다.
iOS Setting Bundle 어떻게 세팅해야 할까? 🤔
설정은 정말 간단한 편이다. 새로운 파일을 추가하여 Setting Bundle 로 추가를 하면 됩니다.
해당 기능을 적용하기 위해서 다양한 블로그를 검색해 보았는데 상세한 가이드는 없어 잠깐 혼란스러웠지만, 애플 공식문서에 나와 있는데로 해주니 금방 해결 할 수 있었습니다.
하지만 초반에 영문이라 읽지않고 넘어간 부분도 있고 해서… 한글로 상세하게 정리를 해볼까 합니다.
01. 프로젝트에 Setting Bundle 추가하기
New File-Resource항목의Setting Bundle를 클릭합니다.

Settings.bundle파일이 추가되었다면 성공!

02. plist 파일을 형식에 맞게 수정하기
파일을 추가하는 과정은, 여러 블로그에 친절하게 설명되어 있지만 이후 설정은 어떻게 해야하는 것인지에 대해서는 정리가 되어있는 블로그를 찾을 수 없었습니다. 이곳 을 참조 하여 데이터를 채워야 하는데 문서가 영어로 작성되어있어 어렵게 느껴지지만 이 글을 통해 하나씩 차근차근 풀어나가 보겠습니다.
먼저, 추가를 하게되면 Settings.bundle 내에 Root.plist 라는 파일이 생성이 됩니다.
Root.plist의 기본구조

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Group</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>Name</string>
<key>Key</key>
<string>name_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Enabled</string>
<key>Key</key>
<string>enabled_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSSliderSpecifier</string>
<key>Key</key>
<string>slider_preference</string>
<key>DefaultValue</key>
<real>0.5</real>
<key>MinimumValue</key>
<integer>0</integer>
<key>MaximumValue</key>
<integer>1</integer>
<key>MinimumValueImage</key>
<string></string>
<key>MaximumValueImage</key>
<string></string>
</dict>
</array>
</dict>
</plist>
Settings.bundle 이 추가되면 기본적으로 안에 들어있는 Root.plist 파일은 다음과 같은 구조로 되어있습니다. 코드로 보면 어렵게 느껴지지만 구조를 이해한다면 전혀 어렵지 않으니 천천히 살펴보겠습니다.
Preference Items 는 무엇일까요?
아이템은 다음과 같이 6가지 타입을 가집니다.
Group
설정페이지에 보여질때 그룹 단위로 표시해줍니다. 공통의 성격을 가지고 있는Item들을 묶기에 적합합니다.
| Key | ValueType | Description | option |
|---|---|---|---|
| Type | String |
PSGroupSpecifier 이라는 타입을 가집니다. |
필수 |
| Title | String |
그룹의 제목을 나타냅니다. | 다국어가능 |
| FooterText | String |
테이블 하단에 부가적인 설명을 표시할때 사용할 수 있습니다. 최대 5라인 까지 표시할 수 있습니다. |
다국어가능 |
| SupportedUserInterfaceIdioms | Array |
특정 디바이스에서만 노출을 할지에 대한 옵션을 정할 수 있습니다. | 선택 |
Multi Value
다양한 값들 중에서 한가지를 선택하게 하고 싶을 경우 사용합니다.
서버선택과 같은 옵션을 넣을때 유용합니다.
| Key | ValueType | Description | option |
|---|---|---|---|
| Type | String |
PSMultiValueSpecifier 이라는 타입을 가집니다. |
필수 |
| Title | String |
제목을 나타냅니다. | 다국어가능 |
| Key | String |
UserDefaults 키를 나타냅니다. |
- |
| DefaultValue | Any |
기본값을 나타냅니다. | 선택 |
| Values | Array |
값의 배열입니다. | 선택 |
|Titles|Array| 값의 제목 배열입니다. | 선택 |
|ShortTitles|Array| 선택된 값에 대한 제목 배열입니다. | 선택 |
|SupportedUserInterfaceIdioms|Array| 특정 디바이스에서만 노출을 할지에 대한 옵션을 정할 수 있습니다. | Phone, Pad
(선택 및 생략가능) |
|DisplaySortedByTitle|Boolean| 제목에 의해 정렬할지 설정할 수 있습니다. | 선택 |
Slider
슬라이드 형태로 값을 선택할 경우 사용합니다.
숫자값을 조정하는 옵션을 넣을때 유용할것 같아요.
| Key | ValueType | Description | option |
|---|---|---|---|
| Type | String |
PSSliderSpecifier 이라는 타입을 가집니다. |
필수 |
| Key | String |
제목을 나타냅니다. | 다국어가능 |
| DefaultValue | Real |
UserDefaults 키를 나타냅니다. |
필수 |
| MinimumValue | Real |
최소값을 나타냅니다. | 필수 |
| MaximumValue | Real |
최대값을 나타냅니다. | 필수 |
| MinimumValueImage | String |
최소값을 나타낼 21x21 이미지를 설정할 수 있습니다. |
선택 |
| MaximumValueImage | String |
최대값을 나타낼 21x21 이미지를 설정할 수 있습니다. |
선택 |
| SupportedUserInterfaceIdioms | Array |
특정 디바이스에서만 노출을 할지에 대한 옵션을 정할 수 있습니다. | Phone, Pad (선택 및 생략가능) |
Text Field
Write하여야하는 데이터를 세팅할때 사용하며, 사용자에게 값을 입력받고자 할때 사용합니다.
| Key | ValueType | Description | option |
|---|---|---|---|
| Type | String |
PSTextFieldSpecifier 이라는 타입을 가집니다. |
필수 |
| Title | String |
제목을 나타냅니다. | 다국어가능 |
| Key | String |
UserDefaults 키를 나타냅니다. |
- |
| DefaultValue | String |
기본값을 나타냅니다. | 선택 |
| IsSecure | Boolean |
패스워드 필드처럼 암호화 해야하는 항목인지 선택할 수있습니다 기본값은 false 입니다. |
선택 |
| KeyboardType | String |
기본으로 사용될 키보드 타입을 선택합니다 기본값은 Alphabet 입니다. |
Alphabet,NumbersAndPunctuation,NumberPad,URL, EmailAddress |
| AutocapitalizationType | String |
자동으로 대문자 교정 옵션에 대한 타입입니다. 기본값은 None 입니다. |
None,Sentences,Words,AllCharacters |
| AutocorrectionType | String |
자동 내용 교정에 대한 타입입니다. 기본값은 Default 입니다. |
Default, No, Yes |
| SupportedUserInterfaceIdioms | Array |
특정 디바이스에서만 노출을 할지에 대한 옵션을 정할 수 있습니다. | Phone, Pad (선택 및 생략가능) |
Title
ReadOnly데이터를 세팅할때 사용하며, 사용자의 데이터를 표현할때 유용합니다.
| Key | ValueType | Description | option |
|---|---|---|---|
| Type | String |
PSTitleValueSpecifier 이라는 타입을 가집니다. |
필수 |
|Title|String| 제목을 나타냅니다. | 다국어가능 |
|Key|String| UserDefaults 키를 나타냅니다. | - |
|DefaultValue|String| 기본값을 나타냅니다. | 선택 |
|Values|Array| 값의 배열입니다. | 선택 |
|Titles|Array| 값의 제목 배열입니다. | 선택 |
|SupportedUserInterfaceIdioms|Array| 특정 디바이스에서만 노출을 할지에 대한 옵션을 정할 수 있습니다. | Phone, Pad
(선택 및 생략가능) |
Toggle Switch
Boolean으로 설정되어있는 값을 변경할때 사용합니다, on/off 가 필요한 설정 데이터를 세팅할때 유용합니다.
| Key | ValueType | Description | option |
|---|---|---|---|
| Type | String |
PSToggleSwitchSpecifier 이라는 타입을 가집니다. |
필수 |
| Title | String |
제목을 나타냅니다. | 다국어가능 (필수) |
| Key | String |
UserDefaults 키를 나타냅니다. |
필수 |
| DefaultValue | Any |
기본값을 나타냅니다. | 필수 |
| TrueValue | Any |
Switch 상태를 On 으로 표현하고 싶을때 사용합니다. |
- |
| FalseValue | Any |
Switch 상태를 Off 으로 표현하고 싶을때 사용합니다. |
- |
| SupportedUserInterfaceIdioms | Array |
특정 디바이스에서만 노출을 할지에 대한 옵션을 정할 수 있습니다. | Phone, Pad (선택 및 생략가능) |
위의 테이블을 참고하여 현재 앱에 추가하고자 하는 Setting.bundle 을 구성하시면 됩니다.
기본적으로 가장 많이 사용하는 Group, TextField, Title, Toggle Switch 위주로 보시면 좋습니다
필수 라고 적혀있는값은 필수사항이므로 꼭 값이 들어가야 합니다.
내용을 쉽게 구성하는법 🍯
위에 있는 테이블을 보고 대략적으로 어떤식의 값들이 있는지는 알았으니 이제 나의 환경에 맞게 구성을 해야겠죠?
제가 구성을 직접해보니 다음과 같은것들이 불편 했습니다.
Property List에디터로 새로운Row를 추가하면 무조건 최상단에 붙습니다.Source로 수정하자니 너무 어려워요 😢
그래서 저는 이렇게 작업했습니다.
- 최초 생성된
Root.plist파일의 내용중 불필요한 아이템은 지웁니다.

Property List Editor을 통해서 필요한 값을 만듭니다.

Source View로 접근해서 자동 생성된코드를 원하는 위치로 변경합니다.

- 작업하고자 하는 내용이 일정 패턴이 반복된다면 코드를
복붙해서 재활용합니다.
Example 📦
Setting.bundle 을 구성하는 기본적인 예제를 Github 에 업로드 해두었습니다.
예제는 Setting.bundle를 이용해 테스트를 위한 환경을 설정하는 Use-case 로 구성해보았습니다.
⚠️ 참고용으로만 봐주세요!
실서비스 배포시에는릴리즈스키마 일 경우 해당 세팅을 뺴고 배포하는 등의 추가 설정이 필요합니다.
References 🔎
위 내용을 정리하면서 참고했던 내용들을 하단에 링크로 남깁니다.
제가 정리한 내용은 Setting Bundle 을 처음 접해보시는 분들에게 초점이 맞춰져 있으며 부족한 부분이 있다면 언제든지 코멘트를 통해 알려주시면 즉시 반영하겠습니다.
-
Implementing an iOS Settings Bundle - by Apple Documents
-
[30분 완성] iOS 앱 개발자 도구로 세상을 이롭게 하기 - by 뱅크샐러드 기술블로그
Comments