Напишите код платформы платформы устройства в 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();
}
}
}
Я хотел бы написать конкретный код платформы в методе MyPage
LogIn
, чтобы сохранить токен доступа на основе того, на какой ОС устройства они используют мое приложение.
Как я могу использовать только код устройства, когда пользователь использует мое приложение на своем устройстве?
Ответы
Ответ 1
Это сценарий, который легко разрешается с помощью инъекции зависимостей.
У вас есть интерфейс с нужными методами на вашем общем или 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)
{
(...)
}
}
Android:
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);
}
}
}
Ответ 2
Существует несколько ответов, в зависимости от того, чего вы хотите достичь, и вида проекта, который у вас есть:
Выполнить другой код Xamarin.Forms
на разных платформах.
Используйте это, например. если вам нужны разные размеры шрифтов на разных платформах:
label.Font = Device.OnPlatform<int> (12, 14, 14);
Выполнить конкретный код платформы в проекте общего доступа (PCL)
Общая схема заключается в использовании DI (инъекции зависимостей) для этого. Xamarin.Forms
предоставляет простой DependencyService
для этого, но используйте все, что вы хотите.
Выполнить конкретный код платформы в проекте совместного проекта (Проект совместного использования активов)
Когда код компилируется на платформу, вы можете обернуть свой код на платформе в #if __PLATFORM__
#endif
и иметь весь код в том же файле. Проект платформы должен определять __IOS__
, __ANDROID__
и __WINDOWS_PHONE__
. Обратите внимание, что проект совместного использования, содержащий Xaml
и код, не будет работать хорошо для iOS на Xamarin.Studio
, и что наличие директив-компиляторов делает ваш код более трудным для чтения и тестирования.
Ответ 3
Это меньше похоже на Xamarin.Forms
и больше об использовании значений по умолчанию в PCL. Проверьте James Montemagno github repo для выполнения межплатформенных значений по умолчанию.
Затем просто вызовите его статические методы для установки/извлечения. Пакет nuget Xam.Plugins.Settings
.
Его можно использовать следующим образом:
using Refractored.Xam.Settings;
...
CrossSettings.Current.AddOrUpdateValue("AccessToken", accessToken);
var value = CrossSettings.Current.GetValueOrDefault<string>("AccessToken");
Ответ 4
Xamarin.Forms имеет встроенный инжектор зависимости, если вы посмотрите на их руководство в области разработчиков своего веб-сайта (http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/)
Там также замечательная библиотека, которую вы можете вытащить из NuGet/Github (https://github.com/aritchie/acr-xamarin-forms), которая будет обрабатывать требуемое хранилище, которое вы ищете... посмотрите на службу настроек там, он даже справится с сериализацией более сложных объектов.