首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Xamarin.Forms编写特定于设备平台的代码

用Xamarin.Forms编写特定于设备平台的代码
EN

Stack Overflow用户
提问于 2014-06-17 03:43:10
回答 4查看 34.2K关注 0票数 32

我有以下Xamarin.Forms.ContentPage类结构

代码语言:javascript
复制
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方法中编写特定于平台的代码,以根据他们使用我的应用程序的设备操作系统来保存访问令牌。

当用户在他们的设备上使用我的应用程序时,我如何只运行设备特定的代码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-17 04:42:04

这是一个可以通过依赖注入轻松解决的场景。

在您的共享或PCL代码中具有与所需方法的接口,例如:

代码语言:javascript
复制
public interface IUserPreferences 
{
    void SetString(string key, string value);
    string GetString(string key);
}

在该接口的App类上有一个属性:

代码语言:javascript
复制
public class App 
{
    public static IUserPreferences UserPreferences { get; private set; }

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

    (...)
}

在目标项目上创建特定于平台的实现:

iOS:

代码语言:javascript
复制
public class iOSUserPreferences : IUserPreferences 
{
    public void SetString(string key, string value)
    {
        NSUserDefaults.StandardUserDefaults.SetString(key, value);
    }

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

Android:

代码语言:javascript
复制
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())方法设置它。

最后,您可以将代码更改为:

代码语言:javascript
复制
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);
        }
    }
}
票数 64
EN

Stack Overflow用户

发布于 2020-06-10 08:27:54

Xamarin.Forms 2.3.4为此引入了一种新方法:

代码语言:javascript
复制
if (Device.RuntimePlatform == Device.Android)
{
    // Android specific code
}
else if (Device.RuntimePlatform == Device.iOS)
{
    // iOS specific code
}
else if (Device.RuntimePlatform == Device.UWP)
{
    // UWP specific code
}

也有其他平台可供选择,您可以在Visual Studio中键入Device.,它将向您显示选项。

票数 14
EN

Stack Overflow用户

发布于 2014-06-17 04:33:00

这似乎不是关于Xamarin.Forms的,而是关于在PCL中使用默认值的。查看James Montemagno's github repo来做跨平台的默认设置。

然后只需调用他的静态方法来设置/检索。nuget包是Xam.Plugins.Settings

它可以像这样使用:

代码语言:javascript
复制
using Refractored.Xam.Settings;

..。

代码语言:javascript
复制
CrossSettings.Current.AddOrUpdateValue("AccessToken", accessToken);
var value = CrossSettings.Current.GetValueOrDefault<string>("AccessToken");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24251020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档