Подтвердить что ты не робот

Напишите код платформы платформы устройства в 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, чтобы сохранить токен доступа на основе того, на какой ОС устройства они используют мое приложение.

Как я могу использовать только код устройства, когда пользователь использует мое приложение на своем устройстве?

4b9b3361

Ответ 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), которая будет обрабатывать требуемое хранилище, которое вы ищете... посмотрите на службу настроек там, он даже справится с сериализацией более сложных объектов.