2010-07-14 72 views
0

我正在使用NSUserDefaults'api -registerDefaults api來註冊我的應用程序的出廠默認設置。對於該應用程序的第一個版本,這一切都很好。但是當我爲iPhone應用程序提供更新時,我有3個標準來確保:NSUserDefaults版本更新的靈活性

  1. 舊版本應用程序的用戶首選項應該是完整的。
  2. 應添加特定於新版本的出廠默認值。
  3. 爲設計提供未來版本更新的靈活性,以便用戶根據新版本默認修改自身。

api -registerDefaults未在新版本更新中註冊出廠默認值,因爲包含用戶首選項的plist文件已存在於沙箱的/ Library/Preferences中。如果我們用新的出廠默認設置重新設置首選項,則以前版本的用戶首選項將會丟失。

我認爲應該有一個設計模式來處理這種情況,所以一般情況下我們該如何迎合這種情況?蘋果公司是否提供任何固有支持?或者我錯過了一些鏈接,我試着用google搜索沒有任何成功。

感謝, 拉吉

回答

1

如果你正在談論的這個項目列表是一個在單個鍵下注冊的數組,那麼是的,傳遞給-registerDefaults:的較大數組將被忽略,以支持存儲在持久化plist中的較小數組。 NSUserDefaults在每個鍵的基礎上跟蹤內容,並且不會對你在那裏存儲的內容做任何解釋,所以它不會嘗試自動將先前的數組值與新的數組值或任何類似的東西混合。

如果您希望在用戶升級時默認添加新項目到該陣列中,我建議您通過獲取現有陣列,添加新項目,然後保存較大陣列再次回到用戶默認值。您可以使用單獨的布爾標誌來指示升級已完成,以確保添加不會多次執行。

+0

這正是我面臨的問題。我已經想到了你的方法,通過明確地維護一個bool來表明升級已經完成,而我試圖維持用戶默認的應用程序版本。現在又有一個障礙 - 在我的基本版本的應用程序中,有10個項目,如果我在v1.1中添加2個項目,在v1.2中添加2個項目,並且用戶嘗試直接更新到v1.2而不通過v1.1 ,他錯過了v1.1的項目,所以我會在內部更新到v1.1,然後在這種情況下更新到v1.2。但這是每個人都遵循的標準嗎?其他應用程序如何解決這個問題? Thanx – 2010-07-15 06:31:05

+0

我不知道你會怎樣「標準」,但我至少使用過這種模式。另一種稍微簡單的方法就是將任何自定義的重新排序用戶完成,並在升級時設置整個數組,而不是試圖只是零碎地添加新對象。雖然用戶不太友好。 – 2010-07-15 15:45:22

+0

是的,第二種方法不太方便用戶使用,除此之外它還會炸掉所有其他設置。它更好,我會選擇第一種方法。感謝您的建議。 – 2010-07-16 05:47:02

0

問題是什麼?如果用戶永遠不會更改(或更確切地說:設置)一個首選項,則會使用出廠默認設置。如果您的應用更新改變了出廠默認設置,那麼將使用這些更改。如果用戶設置了他自己的偏好,那將繼續使用。

新的出廠默認值不會(也不應該)覆蓋用戶設置首選項。 NSUserDefaults完全符合你以後的樣子。

+0

我有一個要顯示的項目列表,我保持在用戶默認情況下,第一個版本中有10個項目。我主要將它們保持在首選項中,以便在所有用戶更改它們的情況下,這些項目的順序應該在下次發佈時更新。現在在新版本中,假設我已經添加了2個項目。總數是12。如果我現在使用12個項目的-registerDefaults,則不會添加2個項目,因爲首選項plist已經存在!這將是災難性的,因爲在新版本中沒有更新項目的數量。此外,項目只是其中的一個方面。 – 2010-07-14 09:42:54

0

我同意Johan Kool。用戶默認按照他們應該的方式工作。如果您希望在更新的應用版本中更改(無論出於何種原因),只需稍微重命名首選項即可。例如,如果someValue是版本1中的首選項,則在版本2中將其命名爲someValue_v2,並且新的出廠默認值將生效。