iOS App Settings.Bundle 各種用法,測試環(huán)境切換

App Settings.Bundle

寫在前邊

Settings.Bundle 是App的配置項, 用戶和測試可以在外圍對于App的部分信息進行修改, 是的App的運行環(huán)境變的可配置, 對于測試尤其使用.

我們也可以結合Build Configuration針對不同的編譯環(huán)境進行個性化設置, 當然, 包括移除Setting(有時候Production版本是不需要Setting的)

本文分為三個部分:

  • Setting 用法: 詳細的數(shù)據(jù)結構
  • 應用場景: 使用注意事項
  • 動態(tài)配置: 動態(tài)添加Setting

Setting 用法

Settings.Bundle支持六種配置項分別是:

  • TextField
  • MultiValue
  • Title
  • Group
  • Slider
  • ToggleSwitch

TextField

數(shù)據(jù)結構:

image

字段:

  • Type 類型,默認是 Text Field
  • Title 顯示的Title
  • Identifier 標識符,用來獲取配置項的配置內容
  • Default Value 默認值
  • Autocorrection Style 自動糾錯(我很討厭這個功能)
  • Autocapitalization Style 大小寫類型(字符 句子 全部)

效果:

image

MultiValue

數(shù)據(jù)結構:

image

字段:

  • Type 類型,默認是 Multi Value
  • Title 顯示的Title
  • Identifier 標識符,用來獲取配置項的配置內容
  • Default Value 默認值
  • Values 可供選擇的值數(shù)組
  • Titles 與選擇值對應的顯示文本

效果:

image
image

Title

數(shù)據(jù)結構1:

image
  • Type 類型,默認是Title
  • Title 顯示的Title
  • Identifier 標識符,用來獲取配置項的配置內容
  • Default Value 默認值

效果:

image

數(shù)據(jù)結構2:

image
  • Values 可供選擇的值數(shù)組
  • Titles 與選擇值對應的顯示文本

相對于結構1, 多出了Values和Titles兩個字段, 此時要注意的是, Default Value只能取自于Values中的某一個元素, 否則顯示為空

效果圖:

image

Group

Group可以認為是一個用在做分組的文字, 就像Grouped TableView的效果

數(shù)據(jù)結構:

image
  • Type 類型,默認是Group
  • Title 顯示的Title

效果:

image

ToggleSwitch

選擇開關

數(shù)據(jù)結構:

image
  • Type 類型,默認是 Toggle Switch
  • Title 顯示的Title
  • Identifier 標識符,用來獲取配置項的配置內容
  • Default Value 默認值
  • Value for OFF 關閉時對應的值(貌似沒用)
  • Value for ON 打開時對應的值(貌似沒用)

效果圖:

image

Slider

數(shù)據(jù)結構:

image
  • Type 類型,默認是 Slider
  • Title 顯示的Title
  • Identifier 標識符,用來獲取配置項的配置內容
  • Default Value 默認值
  • Minimum Value:最小值
  • Maximun Value:最大值
  • Min Value Image Filename:最小值端圖片
  • Max Value Image Filename:最大值端圖片

注意:

Image Filename 不能放在主文件夾中,而是需要放在Settings捆綁包中,才能夠通過 Min/Max Value Image Filename 設置使用, 如:

image

效果圖:

image

關于字段的官方說明:

[圖片上傳失敗...(image-ff291b-1534505621730)]

應用場景

添加Settings.Bundle的最終目的還是和app進行交互(廢話),Settings中的任何選型都可以用代碼獲得


it is important to understand that until the user actually changes the value of
 the setting nothing is actually set. If you check for the setting in your 
 application it will actually return nil unless you set a default value. 

需要注意的是, 在用戶實際修改了setting里的數(shù)據(jù)之前 , 這時配置數(shù)據(jù)并沒有真正的寫入到app的NSUserDefaults中, 此時用NSUserDefaults獲取的值都是空的. 比如,直接調用以下代碼:


- (void)testSetting {
    NSUserDefaults *defaults  = [NSUserDefaults standardUserDefaults];
    NSString *text = [defaults valueForKey:@"selecter"];
    if (text) {
        NSLog(text);
    } else {
        NSLog(@"nothing");
    }
}

結果將是:

2018-08-17 18:01:27.920247+0800 AppSetting[8672:394359] nothing

image

也就是說此時的setting并未生效, 但是如果用戶在setting中修改過selecter(setting中的選項)一個值, 獲得的數(shù)據(jù)將不為空:

2018-08-17 18:08:22.177436+0800 AppSetting[8795:404984] 1

image

對此, 我們的處理方案是, 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中調用以下函數(shù), 將所有的setting數(shù)據(jù)注冊到app中:

- (void)registerDefaultsFromSettingsBundle
{
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) {
        NSLog(@"Could not find Settings.bundle");
        return;
    }
    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key) {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
        }
    }
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
}

代碼

動態(tài)配置

一般情況下, 我的環(huán)境配置(Build Configuration)至少分四種:

  • Dev 開發(fā)
  • Release 測試
  • Staging 預發(fā)布
  • Production 生產
    然后分別給予不同的宏定義, 以保證我們切換編譯環(huán)境時, 做到代碼零修改, Build Configuration配置

1. 創(chuàng)建工程 DynamicSetting

2. 創(chuàng)建相關目錄

在工程目錄下創(chuàng)建文件夾Setting以及子文件夾ReleaseStaging(一般生產環(huán)境不需要setting, 當然這要依據(jù)具體的業(yè)務需求), 并添加到工程中(不添加到工程也行, 此處只是為了方便修改)

image

3. 創(chuàng)建配置

點擊工程文件, 選中info, 在Configurations下點擊+, 復制一個Configuration(我一般復制Release, 這樣發(fā)出去的ipa都去掉日志等不必要的操作 具體依據(jù)業(yè)務需求修改)

image

4. 添加Setting.bundle

新建Setting.Bundle, 但不要添加到當前Target中, 并分別保存到ReleaseStaging文件夾下:

不要添加到當前Target

不要添加到當前Target

不要添加到當前Target

image

創(chuàng)建完成后的工程, 是這個樣子的:

image

運行XCode, 我們在模擬器中的Setting中找不到對應的DynamicSetting(廢話, 都沒添加到Target, 能顯示才怪!!!)

5. 添加拷貝腳本

不添加到Target的原因就是 , 我們要用腳本吧Setting.Bundle拷貝到ipa中.
選中"Target", 切換到Build Phases, 點擊+, 選中New Run Script Phase

image

,

添加腳本:

if [ ${CONFIGURATION} = "Debug" ]; then
cp -r ${PROJECT_DIR}/${PROJECT_NAME}/Setting/Release/Settings.bundle ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
fi

if [ ${CONFIGURATION} = "Release" ]; then
cp -r ${PROJECT_DIR}/${PROJECT_NAME}/Setting/Release/Settings.bundle ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
fi

if [ ${CONFIGURATION} = "Staging" ]; then
cp -r ${PROJECT_DIR}/${PROJECT_NAME}/Setting/Staging/Settings.bundle ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
fi

image

6 修改Setting

6.1 開發(fā)環(huán)境設置

修改Release文件加下的.plist文件 :

image

選中edit scheme, 切換Build Configuration:

image

運行XCode, 在模擬器上查看 Setting:

image

6.1 預發(fā)布環(huán)境設置

修改Staging文件加下的.plist文件 :

image

選中edit scheme, 切換Build Configuration:

image

運行XCode, 在模擬器上查看 Setting:

image

note: 由于開發(fā)環(huán)境我們沒有添加相應腳本, 所以在Production下運行app, 是沒有Setting

代碼

參考

Adding a settings bundle to an iPhone App

Application Settings Bundle Part – I

iOS之Settings.Bundle

原文鏈接:http://www.itdecent.cn/p/784626ea052c
注意:版權歸作者所有,我僅僅是轉載。

【重】iOS開發(fā)調試技巧通過Settings Bundle在App設置中切換服務器環(huán)境:http://www.itdecent.cn/p/212b467b191d

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容