[英]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.