次の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();
}
}
}
MyPage
LogIn
メソッドでプラットフォーム固有のコードを記述して、アプリケーションを使用しているデバイスOSに基づいてアクセストークンを保存したいと思います。
ユーザーがデバイスでアプリケーションを使用するときにのみデバイス固有のコードを実行するにはどうすればよいですか?
これは、依存性注入によって簡単に解決されるシナリオです。
共有コードまたは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);
}
}
}
_
あなたが達成したいものとあなたが持っているプロジェクトの種類に応じて、複数の答えがあります:
異なるプラットフォームで異なる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ではうまく機能しないことに注意してください。コンパイラディレクティブがあると、コードの読み取りとテストが難しくなります。
これは、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");
Xamarin.Formsには、Webサイトの開発者エリアでガイドを見ると、組み込みの依存関係インジェクターがあります( http://developer.xamarin.com/guides/cross-platform/xamarin-forms/依存サービス/ )
NuGet/Githubからプルできるすばらしいライブラリもあります( https://github.com/aritchie/acr-xamarin-forms )。探しているストレージ要件を処理します。そこにある設定サービスを見て、さらに複雑なオブジェクトのシリアル化を処理します。