11

我想知道什麼是以跨平臺方式操縱應用程序設置的最佳解決方案。Xamarin Forms Sharedpreferences cross

在iOS中,我們可以在設置屏幕中更改應用程序外的設置,但是我們在windows phone和android中沒有這些設置。

所以,我的想法是在應用程序內部創建一個正常的頁面/屏幕,顯示我所有的應用程序設置,並具有一個可以使用DependencyServices按特定設備實現的Save()和Get()方法的接口。

這是正確的做法嗎?

回答

16
  1. 應用程序子類有一個靜態屬性字典,可用於存儲數據。這可以使用Application.Current.Properties從Xamarin.Forms代碼中的任何位置訪問。
Application.Current.Properties ["id"] = someClass.ID; 

if (Application.Current.Properties.ContainsKey("id")) 
{ 
    var id = Application.Current.Properties ["id"] as int; 
    // do something with id 
} 

性質字典被自動保存到設備。當應用程序從後臺返回或重新啓動後,添加到字典中的數據將可用。 Xamarin.Forms 1.4在應用程序類中引入了一個附加方法 - SavePropertiesAsync() - 可調用它來主動保留屬性字典。這是爲了讓您在重要更新之後保存屬性,而不會冒着由於崩潰或被操作系統殺死而無法序列化的風險。

https://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/app-lifecycle/

使用所述原生設置管理
  • Xamarin.Forms插件。

    • 安卓SharedPreferences
    • 的iOS:
    • NSUserDefaults的
    • 的Windows Phone:IsolatedStorageSettings
    • Windows應用商店/ Windows Phone的RT:ApplicationDataContainer
  • https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Settings

    +0

    感謝您的幫助。只有一件事,如果我想在iOS應用程序之外以及應用程序中的其他應用程序中設置應用程序的設置?那麼我需要做我之前說的話嗎?因爲更具體,所以如果Device.OS!= iOS – user1845593

    +1

    ,我可以在應用程序中注入或不註冊設置屏幕是的,您需要檢查Device.OS並啓用/禁用設置頁面。要在app(設置菜單)之外進行設置,您需要使用第二種原生方法,並且不要忘記添加Settings.Bundle(http://useyourloaf.com/blog/adding-a-settings-bundle-to- an-iphone-app.html) –

    +1

    對於諸如字符串,整型或任何其他簡單數據結構的設置,我真的推薦我的設置插件。我已經在我的所有應用程序中使用了4年以上,並且像Daniel說的那樣保存到本地管理系統。此外,它適用於使用Xamarin.Forms或傳統構建的每種類型的應用程序。我今天早上剛剛做了一個關於它的現場錄音:https://www.youtube.com/watch?v=VNPLxeq9ZII&feature=youtu.be – JamesMontemagno

    0

    餘噸使用Application.Current.Properties Dictionary來執行並遇到實現問題。

    詹姆斯蒙特馬格諾的Xam.Plugin.Settings NuGet是一個很少工作的解決方案。 GitHub安裝NuGet會自動創建一個帶Settings.cs的Helpers文件夾。要創建一個持久化設置你這樣做:

    private const string QuestionTableSizeKey = "QuestionTableSizeKey"; 
        private static readonly long QuestionTableSizeDefault = 0; 
    

    public static long QuestionTableSize 
        { 
         get 
         { 
          return AppSettings.GetValueOrDefault<long>(QuestionTableSizeKey, QuestionTableSizeDefault); 
         } 
         set 
         { 
          AppSettings.AddOrUpdateValue<long>(QuestionTableSizeKey, value); 
         } 
        } 
    

    訪問和應用程序的設置,然後看起來像:

    namespace XXX 
    { 
        class XXX 
        { 
         public XXX() 
         { 
           long myLong = 495; 
           ... 
           Helpers.Settings.QuestionTableSize = myLong; 
           ... 
           long oldsz = Helpers.Settings.QuestionTableSize;     
         } 
        } 
    
    }