Mic*_*ern 22 c# xamarin.ios xamarin.android xamarin 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想在MyPage LogIn方法中编写特定于平台的代码,以根据他们使用我的应用程序的设备操作系统来保存访问令牌.
当用户在其设备上使用我的应用程序时,如何仅运行特定于设备的代码?
Ped*_*dro 48
这是一个可以通过依赖注入轻松解决的场景.
在共享或PCL代码上具有所需方法的界面,例如:
public interface IUserPreferences
{
void SetString(string key, string value);
string GetString(string key);
}
Run Code Online (Sandbox Code Playgroud)
在您App的接口类上有一个属性:
public class App
{
public static IUserPreferences UserPreferences { get; private set; }
public static void Init(IUserPreferences userPreferencesImpl)
{
App.UserPreferences = userPreferencesImpl;
}
(...)
}
Run Code Online (Sandbox Code Playgroud)
在目标项目上创建特定于平台的实现:
iOS版:
public class iOSUserPreferences : IUserPreferences
{
public void SetString(string key, string value)
{
NSUserDefaults.StandardUserDefaults.SetString(key, value);
}
public string GetString(string key)
{
(...)
}
}
Run Code Online (Sandbox Code Playgroud)
安卓:
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)
{
(...)
}
}
Run Code Online (Sandbox Code Playgroud)
然后在每个特定于平台的项目上创建一个实现,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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
tec*_*n23 13
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
}
Run Code Online (Sandbox Code Playgroud)
还有其他平台可供选择,您可以Device.在 Visual Studio 中输入,它会显示选项。
根据您想要实现的目标以及您拥有的项目类型,有多个答案:
Xamarin.Forms在不同平台上执行不同的代码.
如果您想在不同平台上使用不同的字体,请使用此选项:
label.Font = Device.OnPlatform<int> (12, 14, 14);
Run Code Online (Sandbox Code Playgroud)
在共享(PCL)项目中执行特定于平台的代码
常见的模式是使用DI(依赖注入).Xamarin.Forms提供了一个简单DependencyService的,但使用你想要的任何东西.
在共享(共享资产项目)项目中执行特定于平台的代码
由于代码是按平台编译的,因此您可以将特定于平台的代码包装在一起#if __PLATFORM__ #endif并将所有代码放在同一个文件中.平台项目应该定义__IOS__,__ANDROID__和__WINDOWS_PHONE__.请注意,包含Xaml和代码的共享资产项目不适用于iOS Xamarin.Studio,并且具有编译器指令会使您的代码更难以阅读和测试.
| 归档时间: |
|
| 查看次数: |
25472 次 |
| 最近记录: |