繁体   English   中英

在 Xamarin.Forms 中编写特定于设备平台的代码

[英]Write device platform specific code in 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方法中编写特定于平台的代码,以根据他们使用我的应用程序的设备操作系统保存访问令牌。

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

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

在您的共享或 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 2.3.4 为此引入了一种新方法:

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
}

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

有多种答案,具体取决于您想要实现的目标以及您拥有的项目类型:

在不同平台上执行不同的Xamarin.Forms代码。
例如,如果您希望在不同平台上使用不同的字体大小,请使用此命令:

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

在共享 (PCL) 项目中执行平台特定代码常见模式是为此使用 DI(依赖注入)。 Xamarin.Forms提供了一个简单的DependencyService ,但可以使用任何你想要的。

在共享(共享资产项目)项目中执行平台特定代码由于代码是按平台编译的,您可以将平台特定代码包装在#if __PLATFORM__ #endif并将所有代码放在同一个文件中。 平台项目应定义__IOS____ANDROID____WINDOWS_PHONE__ 请注意,包含Xaml和代码的共享资产项目不适用于Xamarin.Studio iOS,并且具有编译器指令会使您的代码更难阅读和测试。

这似乎与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");

Xamarin.Forms 有一个内置的依赖注入器,如果你在他们的网站 ( http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/ )

还有一个很棒的库,您可以从 NuGet/Github ( https://github.com/aritchie/acr-xamarin-forms ) 中提取,它将处理您正在寻找的存储要求......查看设置服务在那里,它甚至可以处理更复杂对象的序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM