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;     
         } 
        } 
    
    }