天天看點

應用程式偏好設定(轉)

應用程式偏好設定

在傳統的桌面應用程式中,偏好設定是一些專門面向應用程式的設定,用于配置應用程式的行為和外觀。iPhone OS也支援應用程式偏好設定,但并不将它作為應用程式整體的一部分。在iPhone OS上,應用程式級别的偏好設定并不由各個程式本身的定制界面來顯示,而是由系統提供的Settings程式統一顯示。

為了将定制的應用程式偏好設定內建到Settings程式中,您必須在應用程式包的頂級目錄中包含一個特殊格式的Settings​​程式包​​,由它負責将應用程式的偏好設定資訊提供給Settings程式,而Settings程式則負責對其進行顯示,并将使用者提供的值寫入偏好設定資料庫。在運作時,您的應用程式可以通過标準的API取得這些偏好設定的值。本章的下面部分将描述Settings程式包的格式,以及用于取得偏好設定值的API。

偏好設定的指導原則

将偏好設定加入到Settings程式的做法最适合于效率工具類型的應用程式,以及偏好設定值配置完成後很少再改變的程式。Mail程式就是一個例子,它通過這種形式的偏好設定來存儲使用者賬戶資訊及消息檢查設定。由于Settings程式可以按層次進行顯示,是以當您有大量的偏好設定時,通過Settings程式來進行操作也是比較合适的,在自己的應用程式中提供同樣的偏好設定集合可能需要太多螢幕,而且可能造成使用者的混淆。

當您的應用程式隻需要少數的選項,或者使用者需要經常改變這些選項時,應該認真考慮是否用Settings程式來管理。舉例來說,工具程式更适合在主視圖的背面提供定制的配置選項,即在視圖上通過一個特殊的控件翻轉視圖,顯示應用程式的選項,再通過另一個控件将視圖翻轉回來。對于簡單的應用程式,這種方式使使用者可以立即通路應用程式選項,比使用Settings程式友善得多。

對于遊戲和其它全屏程式的預置,可以使用Settings程式或自行實作定制的螢幕。定制螢幕通常更适合遊戲程式,因為偏好設定可以處理為遊戲設定的一部分。當然,您也可以使用Settings程式,如果您認為那樣對遊戲的使用流程更好的話。

請注意:永遠不要使偏好設定同時存在于Setting程式和自定義的應用程式螢幕上。舉例來說,如果工具類應用程式在主視圖的背面有偏好設定,則在Settings程式中就不應該再有可配置的設定。如果您的應用程式需要進行偏好設定,則請僅選擇和使用一種方案。

偏好設定的接口

Settings程式實作了一組有層次的頁面,用于通路應用程式的偏好設定。Settings程式的主視圖顯示了可以進行偏好設定的系統程式及第三方應用程式,使用者選擇一個第三方程式後會進入該程式的偏好設定頁面。

每個應用程式都至少有一個偏好設定頁面,我們稱為首頁面。如果您的應用程式隻有少數幾個偏好設定,則一個首頁面可能就夠了。然而,如果偏好設定太多,在首頁面上放不下,也可以加入更多頁面。這些額外的頁面就成為首頁面的子頁面,使用者通過輕觸特定類型的偏好設定來通路這些頁面。

您顯示的每一個偏好設定都必須具有特定的類型。偏好設定的類型定義了Settings程式如何對其進行顯示。大多數偏好設定類型都和某種類型的、用于進行設定的控件相關聯,而另外一些類型則提供一種偏好設定的組織方式。表9-1列出了Settings程式支援的各種元素類型,以及如何用這些類型來實作自己的偏好設定頁面。

表 9-1  偏好設定元素的類型

元素類型 描述
文本框

文本框類型顯示一個可選的标題和一個可編輯的文本輸入框,适用于需要使用者輸入自定義字元串的偏好設定。

這個類型的鍵是​

​PSTextFieldSpecifier​

​。
标題 标題類型顯示一個隻讀的字元串,适用于顯示隻讀字元串的偏好設定(如果偏好設定包含隐含或非直接的值,這個類型可以将可能的值映射為字元串)。

​PSTitleValueSpecifier​

撥動開關 撥動開關類型顯示一個ON/OFF撥動按鍵,适用于配置值為二選一的偏好設定。這個類型通常用于表示包含布爾值的偏好設定,但也可以用于表示包含非布爾值的偏好設定。

​PSToggleSwitchSpecifier​

滑塊 滑塊類型顯示一個滑塊控件,适用于值為一個範圍的偏好設定。這個類型的值是一個實數,值的最小和最大值由您來指定。

​PSSliderSpecifier​

值清單 值清單類型使使用者可以從一個值的清單中選擇其一,适用于支援多個互斥值的偏好設定,這些值的類型可以是任意的。

​PSMultiValueSpecifier​

組類型使您可以将幾組不同的偏好設定組織到一個頁面上。組類型并不表示一個可配置的偏好設定,而隻是包含一個标題字元串,顯示在一或多個可配置的偏好設定之前。

​PSGroupSpecifier​

子頁面 子頁面類型使使用者可以通路新的偏好設定頁面,适用于實作多層次的偏好設定。有關如何配置和使用這個類型的更多資訊,請參見​​“多層次的偏好設定”​​ 。這個類型的鍵是 ​

​PSChildPaneSpecifier​

各種偏好設定類型的詳細格式資訊請參見​​Settings程式的結構參考​​。如果要了解如何建立和編輯Setting程式的頁面檔案,則請參見​​“添加和修改Settings程式包”​​部分。

Settings程式包

在iPhone OS中,開發者通過一種特殊的Settings​​程式包​​來指定應用程式的偏好設定,這種程式包命名為​

​Settings.bundle​

​,駐留在應用程式程式包的頂級目錄上。該程式包中包含一或多個Settings頁面檔案,用于定義應用程式偏好設定的詳細資訊;還可以包含顯示偏好設定需要的其它支援檔案,比如圖像或本地化檔案。表9-2列出了一個典型Settings程式包的内容。

表9-2  ​

​Settings.bundle​

​目錄下的内容

項目名稱

​Root.plist​

這個Settings頁面檔案包含根頁面的偏好設定,它的内容在​​“Settings頁面檔案的 格式”​​ 部分有更詳細的描述。
其它​

​.plist​

​檔案
如果您需要通過多個子面闆來建構一組有層次結構的偏好設定,則每個子面闆的内容都分别存儲在不同的Settings頁面檔案中。您需要負責命名這些檔案,并将它們關聯到正确的子面闆上。
一或多個​

​.lproj​

​ 目錄
這些目錄用于存儲Settings頁面檔案的本地化字元串資源。每個目錄都包含一個字元串檔案,檔案的标題在Settings頁面中指定。這些字元串檔案為偏好設定提供可以直接顯示給使用者的本地化内容。
其它圖像 如果您使用滑塊控件,則可以将滑塊的圖像存儲在程式包的頂級目錄下。

除了Settings程式包之外,應用程式的程式包中還可以包含應用程式設定的定制圖示。如果應用程式包的頂級目錄含有名為​

​Icon-Settings.png​

​的檔案,則該檔案包含的圖示會被Settings程式用于辨別應用程式的偏好設定。如果不存在這樣的檔案,Settings程式會轉而采用應用程式的圖示檔案(預設為​

​Icon.png​

​),并進行必要的縮放處理。您的​

​Icon-Settings.png​

​檔案必須是29 x 29像素的圖像。

在啟動時,Settings程式會檢查每一個定制的應用程式是否包含Settings程式包,并對其進行裝載,然後将相應的應用程式名稱和圖示顯示在Settings程式的首頁面上。當使用者輕觸您的應用程式對應的行時,Settings程式會裝載Settings程式包的​

​Root.plist​

​頁面檔案,并根據該檔案的定義顯示應用程式的主設定頁面。

除了裝載程式包的​

​Root.plist​

​頁面檔案之外,Settings程式還會在必要時裝載與該檔案相關聯的語言資源。每個Settings頁面檔案都可以有一個關聯的​

​.strings​

​檔案,用于包含可見字元串的本地化值。在準備顯示偏好設定資訊時,Settings程式會根據使用者偏好的語言來尋找相應的字元串資源,并在顯示之前替換偏好設定頁面中對應的内容。

Settings頁面檔案的格式

Settings程式包中的每個Settings頁面檔案都以iPhone設定​​屬性清單​​的檔案格式(它是一種結構化的檔案格式)進行存儲。編輯Settings頁面檔案的最簡單方法,就是使用Xcode内置的編輯器元件,具體做法請參見​​“為Settings頁面的編輯做準備”​​部分;您也可以用屬性清單編輯器程式來進行編輯,它是Xcode的工具之一。

請注意:在連編時,Xcode會将工程中基于XML的屬性檔案自動轉換為二進制格式,轉換過程是連編時自動完成的,目的是節省磁盤空間。

每個Settings頁面檔案的根元素都包含表9-3列出的鍵。事實上,隻有一個鍵是必須的,但我們推薦包含所有的兩個鍵。

表9-3 Settings頁面檔案中的根鍵

類型

​PreferenceSpecifiers​

​(必須包含)
數組 這個鍵的值是一個​​字典數組​​,數組中的每個字典都包含一個偏好設定元素的資訊。有關元素類型清單請參見​​表9-1​​,與元素類型相關聯的鍵的描述,則請參見​​Settings程式的結構參考​​。

​StringsTable​

字元串 和這個頁面檔案相關聯的字元串檔案的名稱。程式包中專用于語言的工程目錄應該包含這個字元串檔案的一個拷貝(帶有相應的本地化字元串)。如果您沒有包含這個鍵,則表示頁面檔案中的字元串沒有被本地化。有關如何使用這些字元串的資訊,請參見​​“本地化資源”​​部分。

多層次的偏好設定

如果您希望以一定的層次結構組織偏好設定,則您定義的每個頁面都必須有它自己的​

​.plist​

​檔案,每個​

​.plist​

​檔案包含一組僅在該頁面顯示的偏好設定。應用程式偏好設定的首頁面總是存儲在​

​Root.plist​

​檔案中,其它頁面則可以根據自己的喜好進行命名。

為了建立父子頁面之間的連接配接,您需要在父頁面中包含一個子面闆元素。子面闆元素負責占據一行,在使用者觸擊時顯示一個新的設定Settings頁面。子面闆元素的​

​File​

​鍵辨別一個​

​.plist​

​檔案的名稱,該檔案負責定義子頁面的内容;​

​Title​

​鍵則辨別子頁面的标題,該标題也作為子面闆元素行的文本。Settings程式會自動提供子頁面的漫遊控制,使使用者可以回到父頁面。

圖9-1展示了一組多層次的頁面是如何工作的。圖的左邊顯示了​

​.plist​

​檔案,右邊則顯示各個頁面之間的關系。

圖9-1  用子面闆組織偏好設定

有關子面闆元素及其關聯鍵的更多資訊,請參見​​Settings程式的結構參考​​。

本地化資源

由于偏好設定中包含使用者可見的字元串,是以您應該在Settings程式包中為那些字元串提供本地化版本。對于程式包支援的每種本地化語言,偏好設定頁面都可以有一個​

​.strings​

​檔案與之對應。當Settings程式碰到一個支援本地化的鍵時,就會在相應本地化版本的​

​.strings​

​檔案中尋找比對的鍵,如果找到了,就顯示與之關聯的值。

在尋找諸如​

​.strings​

​檔案這樣的本地化資源時,Settings程式遵循和Mac OS X程式一樣的規則,即首先尋找與使用者偏好語言相比對的本地化資源,如果該版本的資源不存在,再選擇預設語言的版本。

有關字元串檔案的格式、語言工程目錄、以及如何從程式包中取得特定語言資源的相關資訊,請參見​​國際化程式設計主題​​。

添加和修改Settings程式包

Xcode提供了一個為目前工程添加Settings​​程式包​​的模闆。預設的Settings程式包中包含一個​

​Root.plist​

​檔案,以及一個用于存放本地化資源的預設語言目錄。您可以在這個基礎上進行擴充,加入Settings程式包需要的其它屬性清單檔案和資源。

添加Settings程式包

通過如下步驟可以為您的Xcode工程添加一個Settings程式包:

  1. 選擇File > New File.
  2. 選擇iPhone OS > Settings > Settings Bundle template.
  3. 将檔案命名為

    Settings.bundle

    .

除了在工程中添加一個新的Settings程式包之外,Xcode還自動将該程式包加入到應用程式目标的Copy Bundle Resources連編階段中。這樣,您需要做的就隻是修改Settings程式包中的​​屬性清單​​檔案和添加其它資源了。

新添加的​

​Settings.bundle​

​程式包具有如下結構:

Settings.bundle/      
Root.plist      
en.lproj/      
Root.strings      

為Settings頁面的編輯做準備

用Settings程式包模闆建立Settings程式包之後,您可以将結構檔案(schema file)的内容進行格式化,使它們更容易編輯。下面的步驟向您展示如何格式化Settings程式包的​

​Root.plist​

​檔案,這些步驟同樣适用于您建立的其它結構檔案。

  1. 顯示Settings程式包中

    Root.plist

    檔案的内容。
  1. 在Groups & Files清單中,展開

    Settings.bundle

    ,檢視程式包的内容。
  2. 選擇

    Root.plist

    檔案,其内容就會顯示在Detail視圖中.
  1. 在Detail視圖中,選擇

    Root.plist

    檔案的Root鍵。
  2. 選擇View > Property List Type > iPhone Settings plist.

    這個指令會将Detail視圖中的屬性清單内容進行格式化。Xcode不是直接顯示屬性清單的鍵和值,而是将它們顯示為可讀的字元串(如圖9-2所示),使我們更加易于了解和編輯檔案的内容。

    圖9-2  格式化過的

    Root.plist

    檔案内容

配置一個Settings頁面:一個教程

這個部分包含一個教程,目的是向您展示如果配置一個Settings頁面,使它顯示您需要的内容。教程的目标是建立一個像圖9-2這樣的頁面,如果您之前還沒有為自己的工程建立Settings程式包,則在執行下面這些步驟之前,應該按照​​“為Settings頁面的編輯做好準備”​​部分的描述進行準備。

圖9-3  一個根Settings頁面

  1. 将Settings Page Title 鍵的值改為您的應用程式名稱。

    輕按兩下

    YOUR_PROJECT_NAME

    文本并将它改為

    MyApp

  2. 展開Preference Items鍵,顯示模闆包含的預設項目。
  3. Item 1

    的标題改為

    Sound

  • 展開

    Preference Items

    Item 1

  • Title

    鍵的值由

    Group

    改為

    Sound

  • 保持

    Type

    鍵的值不變,仍然為

    Group

  1. 為新命名的Sound組建立第一個撥動開關。
  • 選中

    Preference Items

    Item 3

    項,并選擇Edit > Cut指令。
  • Item 1

    ,并選擇Edit > Paste指令(這會将撥動開關項移到文本框項的前面)。
  • 展開撥動開關項,顯示其配置鍵。
  • Title

     鍵的值改為

    Play Sounds

  • Identifier

    鍵的值改為

    play_sounds_preference

    。現在,這個項目的配置應該如下圖所示:
  1. 為Sound 組建立第二個撥動開關。
  • Item 2

    (即Play Sounds撥動開關)。
  • 選擇Edit > Copy指令。
  • 選擇Edit >Paste指令,将撥動開關的拷貝放到第一個的下面。
  • 展開新的撥動開關項,顯示其配置鍵。
  • 将其

    Title

    3D Sound

  • Identifier

    3D_sound_preference

  1. 現在,您已經完成了第一組設定,可以開始建立User Info組了。
  2. Item 4

    改為Group類型的元素,并命名為

    User Info

  • Preferences Items

    中點選

    Item 4

    ,顯示一個項目類型清單的下拉菜單。
  • 從下拉菜單中,選擇

    Group

    元素類型。
  • Item 4

    的内容。
  • Title

    鍵的值設定為

    User Info

  1. 建立Name域。
  • 選擇Preferences Item中的

    Item 5

  • 使用下拉菜單,将其類型改為

    Text Field

  • Title

    User Info

  • Identifier

    user_name

  • 合上展開按鍵,隐藏這個項目的内容。
  1. 建立Experience Level設定。
  • Item 5

    并點選加号(+)鍵(或者按下Enter鍵),建立一個新的項目。
  • 點選這個新建立的項目,将其類型設定為

    Multi Value

  • 展開項目的内容,将其标題設定為

    Experience Level

    ,辨別設定為

    experience_preference

    ,預設值設定為
  • 選中Default Value鍵,點選加号鍵加入一個

    Titles

    數組。
  • 通過展開鍵打開

    Titles

    數組,點選表格右側的項目按鍵。點選這個鍵可以為

    Titles

    添加一個新的子項目。
  • 選中新添加的子項目,點選兩次加号鍵,建立總共三個子項目。
  • 将子項目的值設定為

    Beginner

    Expert

    、和

    Master

  • 再次選擇

    Titles

    鍵,點選其展開鍵,将子項目隐藏起來。
  • 點選加号鍵,建立

    Values

  • Values

    數組中加入三個子項目,将它們的值分别設定為

    1

    2

  • 點選

    Item 6

    的展開按鍵,隐藏其内容。
  1. 添加設定頁面的最好一組。
  • 建立一個新項目,将其類型設定為

    Group

    ,标題設定為

    Gravity

  • 再次建立一個新項目,将其類型設定為​

    ​Slider​

    ​,辨別設定為​

    ​gravity_preference​

    ​,預設值設定為​

    ​1​

    ​,最大值設定為​

    ​2​

建立額外的Settings頁面檔案

Settings程式包模闆包含一個​

​Root.plist​

​檔案,用于定義應用程式的頂級Settings頁面。您如果要定義額外的Settings頁面,必須在Settings程式包中加入額外的屬性清單檔案,您可以在Finder或Xcode中進行添加。

在Xcode中為Settings程式包添加屬性清單的步驟如下:

  1. 在Groups & Files面闆中,打開Settings程式包,選中

    Root.plist

    檔案。
  2. 選擇File > New指令。
  3. 選擇Other > Property List指令。
  4. 選中新生成的檔案,并選擇View > Property List Type > iPhone Settings plist指令,将它配置為一個設定檔案。

往Settings程式包加入新的Settings頁面之後,就可以按照​​“配置一個Settings頁面:一個教程”​​部分描述的那樣,在頁面中顯示設定。您必須通過一個子面闆元素對其進行引用,詳情請參見​​“多層次的偏好設定”​​部分的描述。

通路您的偏好設定

iPhone應用程式可以通過Foundation或者Core Foundation​​架構​​來讀寫偏好設定的值。在Foundation架構中,您可以通過​

​NSUserDefaults​

​類來讀寫偏好設定的值;而在Core Foundation架構中,您則可以使用幾個與偏好設定相關的函數。

程式清單9-1展示一個如何在應用程式中讀取偏好設定的簡單執行個體,例子中通過​

​NSUserDefaults​

​類取得一個在​​“配置一個Settings頁面:一個教程”​​部分中建立的偏好設定值,并将它指派給應用程式的一個執行個體變量。

程式清單9-1  通路應用程式偏好設定的值

- (void)applicationDidFinishLaunching:(UIApplication *)application      
{      
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];      
[self setShouldPlaySounds:[defaults boolForKey:play_sounds_preference]];      
// Finish app initialization...      
}      

有關​

​NSUserDefaults​

​類中用于讀寫偏好設定值的方法的更多資訊,請參見​​NSUserDefaults類參考​​;有關讀寫偏好設定的Core Foundation函數,請參見​​偏好設定工具參考​​。

在仿真器中調試應用程式的偏好設定

在運作您的應用程式時,iPhone Simulator會将所有偏好設定的值儲存在​

​~/Library/Application Support/iPhone Simulator/User/Applications/​

​<APP_ID>​

​/Library/Preferences​

​目錄下,這裡的<APP_ID>是一個由程式生成的目錄名,iPhone OS用它來辨別您的應用程式。

每次重新安裝應用程式時,iPhone OS都會執行一次幹淨的安裝,将之前所有的偏好設定删除。換句話說,在Xcode中連編或運作應用程式會導緻老版本的所有内容被新版本所代替。如果您要測試應用程式在兩次運作之間偏好設定發生的變化,則必須直接從仿真器界面上運作,而不應該通過Xcode運作。

繼續閱讀