記事一覧

アプリの設定を保存する方法 | Xamarin.Forms



今回は Xamarin.Forms でアプリの設定情報を保存する方法をご紹介いたします。
アプリを終了しても、再度起動時には保存した設定情報を復元したいことがあると思います。
Asp.net では Web.Config に保存していましたし、.net では app.config に保存していましたように、スマホアプリでは iOS と Android それぞれ独自の保存方法があるようです。


前提条件
・Windows10
・Visual Studio 2015 Community Update3
・Xamarin 4.2.0.719 (NuGet Xamarin.Forms 2.3.2.127)
・macOS Sierra 10.12.1 / Xcode8.1 / Xamarin.iOS 10.2.0.4


1.保存するModelクラスを作成します。

Settingsinfo.cs

public class SettingsInfo
{
    public string StringValue { get; set; }
    public int IntegerValue { get; set; }
    public bool BooleanValue { get; set; }
    public string[] StringArray { get; set; }

    #region "コンストラクタ"
    public SettingsInfo(string stringValue, int integerValue, bool booleanValue, string[] stringArray)
    {
        this.StringValue = stringValue;
        this.IntegerValue = integerValue;
        this.BooleanValue = booleanValue;
        this.StringArray = stringArray;
    }   
    #endregion
}


2.DependencyServiceにて記述します

PCL ISettingService.cs

//DependencyServiceから利用する
public interface ISettingService
{
    void Save(SettingsInfo setInfo);

    SettingsInfo GetSettings();
}


Android にて SettingService.cs

using Android.Content;
[assembly: Dependency(typeof(SettingService))]
public class SettingService : ISettingService
{
    public void Save(SettingsInfo setInfo)
    {
        var prefs = Forms.Context.GetSharedPreferences("pref", FileCreationMode.Private);
        var editor = prefs.Edit();

//文字列型の場合
        editor.PutString("StringValue", setInfo.StringValue);
//integer型の場合
        editor.PutInt("IntegerValue", setInfo.IntegerValue);
//Boolean型の場合
        editor.PutBoolean("BooleanValue", setInfo.BooleanValue);
//文字列配列の場合
        editor.PutStringSet("StringArray", setInfo.StringArray.ToList());
       
        editor.Commit();
    }

    public SettingsInfo GetSettings()
    {
        var prefs = Forms.Context.GetSharedPreferences("pref", FileCreationMode.Private);

//文字列型の場合
        string stringValue = prefs.GetString("StringValue", "");
//integer型の場合
        int integerValue = prefs.GetInt("IntegerValue", 0);
//Boolean型の場合
        bool booleanValue = prefs.GetBoolean("BooleanValue", false);
        //文字列配列の場合
        ICollection<string> stringArray = prefs.GetStringSet("StringArray", null);
        string[] array = null;
        if (array != null)
        {
            array = stringArray.ToArray();
            //Array.Sort(array);
        }

        SettingsInfo setInfo = new SettingsInfo(stringValue, integerValue, booleanValue, array);
       
        return setInfo;
    }
}


iOSにて SettingService.cs

[assembly: Dependency(typeof(SettingService))]
public class SettingService : ISettingService
{
    public void Save(SettingsInfo setInfo)
    {
        var prefs = NSUserDefaults.StandardUserDefaults;

        //文字列型の場合
        prefs.SetString(setInfo.StringValue + "", "StringValue");
        //integer型の場合
        prefs.SetInt(setInfo.IntegerValue, "IntegerValue");
        //Boolean型の場合
        prefs.SetString(setInfo.BooleanValue.ToString(), "BooleanValue");
        //文字列配列の場合
        var array1 = new NSMutableArray();
        if (setInfo.StringArray != null)
        {
            foreach (string s in setInfo.StringArray)
            {
                array1.Add(new NSString(s));
            }
        }
        prefs.SetValueForKey(array1, new NSString("StringArray"));

        prefs.Synchronize();
    }

    public SettingsInfo GetSettings()
    {
        var prefs = NSUserDefaults.StandardUserDefaults;

        //文字列型の場合
        string stringValue = prefs.StringForKey("StringValue");
        if (stringValue == null)
        {
            stringValue = String.Empty;
        }
        //integer型の場合
        int integerValue = (int)prefs.IntForKey("IntegerValue");
        //Boolean型の場合
        string booleanString = prefs.StringForKey("BooleanValue");
        if (String.IsNullOrEmpty(booleanValue))
        {
            //初期値
            booleanString = "false";
        }
        bool booleanValue = false;
        if (booleanString.ToLower().Equals("true"))
        {
            booleanValue = true;
        }
        //文字列配列の場合
        NSObject[] stringCollection = prefs.ArrayForKey("StringArray");
        string[] stringArray = null;
        List<string> stringList = new List<string>();
        if (stringCollection != null)
        {
            foreach (NSString s in stringCollection)
            {
                stringList.Add(s);
            }
            stringArray = stringList.ToArray();
        }
       
        //インスタンス作成
        SettingsInfo setInfo = new SettingsInfo(stringValue, intValue, booleanValue, stringArray);

        return setInfo;
    }
}


3.起動時に保存された設定を取得します。

App.cs

public class App : Application
{
    private static SettingsInfo _settings = null;
    public static SettingsInfo Settings
    {
        get
        {
            if (_settings == null)
            {
                _settings = DependencyService.Get<ISettingService>().GetSettings();
            }
            return _settings;
        }
    }

    public App()
    {
        _settings = DependencyService.Get<ISettingService>().GetSettings();
        MainPage = new NavigationPage(new StartPage());
    }
}


4.保存する際のコード

任意のPageに記述します。

App.Settings.StringValue = "test";
DependencyService.Get<ISettingService>().Save(App.Settings);


尚、保存した情報は、アプリのデータを削除したり、アプリ自体を削除すると消えてしまいます。(アプリ更新時は消えません。)

settings_01.png


以上で、保存した設定の読み込み及び、保存ができます。
また、今回ご紹介したコードはNameSpaceと基本的なusing区を割愛してありますのでお気を付けくださいませ。



当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿
非公開コメント

アルバム

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。