web-dev-qa-db-ja.com

Xamarin.Formsでデバイスプラットフォーム固有のコードを書く

次のXamarin.Forms.ContentPageクラス構造

public class MyPage : ContentPage
{
    public MyPage()
    {
        //do work to initialize MyPage 
    }

    public void LogIn(object sender, EventArgs eventArgs)
    {
        bool isAuthenticated = false;
        string accessToken = string.Empty;

        //do work to use authentication API to validate users

        if(isAuthenticated)
        {
            //I would to write device specific code to write to the access token to the device
            //Example of saving the access token to iOS device
            NSUserDefaults.StandardUserDefaults.SetString(accessToken, "AccessToken");

            //Example of saving the access token to Android device
            var prefs = Application.Context.GetSharedPreferences("MySharedPrefs", FileCreationMode.Private);
            var prefsEditor = prefs.Edit();

            prefEditor.PutString("AccessToken", accessToken);
            prefEditor.Commit();
        }
    }
}

MyPageLogInメソッドでプラットフォーム固有のコードを記述して、アプリケーションを使用しているデバイスOSに基づいてアクセストークンを保存したいと思います。

ユーザーがデバイスでアプリケーションを使用するときにのみデバイス固有のコードを実行するにはどうすればよいですか?

22

これは、依存性注入によって簡単に解決されるシナリオです。

共有コードまたはPCLコードで、次のような目的のメソッドを備えたインターフェイスを用意します。

_public interface IUserPreferences 
{
    void SetString(string key, string value);
    string GetString(string key);
}
_

そのインターフェイスのAppクラスにプロパティを設定します。

_public class App 
{
    public static IUserPreferences UserPreferences { get; private set; }

    public static void Init(IUserPreferences userPreferencesImpl) 
    {
        App.UserPreferences = userPreferencesImpl;
    }

    (...)
}
_

ターゲットプロジェクトでプラットフォーム固有の実装を作成します。

iOS:

_public class iOSUserPreferences : IUserPreferences 
{
    public void SetString(string key, string value)
    {
        NSUserDefaults.StandardUserDefaults.SetString(key, value);
    }

    public string GetString(string key)
    {
        (...)
    }
}
_

アンドロイド:

_public class AndroidUserPreferences : IUserPreferences
{
    public void SetString(string key, string value)
    {
        var prefs = Application.Context.GetSharedPreferences("MySharedPrefs", FileCreationMode.Private);
        var prefsEditor = prefs.Edit();

        prefEditor.PutString(key, value);
        prefEditor.Commit();
    }

    public string GetString(string key)
    {
        (...)
    }
}
_

次に、各プラットフォーム固有のプロジェクトでIUserPreferencesの実装を作成し、App.Init(new iOSUserPrefernces())メソッドとApp.Init(new AndroidUserPrefernces())メソッドのいずれかを使用して設定します。

最後に、コードを次のように変更できます。

_public class MyPage : ContentPage
{
    public MyPage()
    {
        //do work to initialize MyPage 
    }

    public void LogIn(object sender, EventArgs eventArgs)
    {
        bool isAuthenticated = false;
        string accessToken = string.Empty;

        //do work to use authentication API to validate users

        if(isAuthenticated)
        {
            App.UserPreferences.SetString("AccessToken", accessToken);
        }
    }
}
_
47
Pedro

あなたが達成したいものとあなたが持っているプロジェクトの種類に応じて、複数の答えがあります:

異なるプラットフォームで異なるXamarin.Formsコードを実行します。
これを使用します。異なるプラットフォームで異なるフォントサイズが必要な場合:

label.Font = Device.OnPlatform<int> (12, 14, 14);

共有(PCL)プロジェクトでプラットフォーム固有のコードを実行します一般的なパターンは、このためにDI(依存性注入)を使用することです。 Xamarin.Formsは、このための簡単なDependencyServiceを提供しますが、好きなものを使用します。

共有(Shared Asset Project)プロジェクトでプラットフォーム固有のコードを実行しますコードはプラットフォームごとにコンパイルされるため、プラットフォーム固有のコードを#if __PLATFORM__#endifでラップして、同じファイル内のすべてのコード。プラットフォームプロジェクトでは、__IOS____Android____WINDOWS_PHONE__を定義する必要があります。 Xamlとコードを含む共有アセットプロジェクトは、Xamarin.Studio上のiOSではうまく機能しないことに注意してください。コンパイラディレクティブがあると、コードの読み取りとテストが難しくなります。

9

これは、Xamarin.Formsその他、PCLでのデフォルトの使用について。 James Montemagno's github repo クロスプラットフォームのデフォルト設定を確認してください。

次に、設定/取得のために静的メソッドを呼び出します。 nugetパッケージはXam.Plugins.Settings

次のように使用できます。

using Refractored.Xam.Settings;

...

CrossSettings.Current.AddOrUpdateValue("AccessToken", accessToken);
var value = CrossSettings.Current.GetValueOrDefault<string>("AccessToken");
2
valdetero

Xamarin.Formsには、Webサイトの開発者エリアでガイドを見ると、組み込みの依存関係インジェクターがあります( http://developer.xamarin.com/guides/cross-platform/xamarin-forms/依存サービス/

NuGet/Githubからプルできるすばらしいライブラリもあります( https://github.com/aritchie/acr-xamarin-forms )。探しているストレージ要件を処理します。そこにある設定サービスを見て、さらに複雑なオブジェクトのシリアル化を処理します。

1
J Geary