正如 Shawn 所指出的,使用 IoC(控制反转)是一种方法,但要了解 IoC 是从平台无关的库项目(如 .NET Standard 项目)调用平台特定代码的一种方法的名称.您必须决定使用哪个 IoC 库,或者是否使用内置于某些跨平台框架(如 MvvmCross 甚至 Xamarin.Forms Dependency Service)中的 IoC 功能(这不是真正的 IoC 容器,而更像是一个服务定位器,但它确实可以让您从 .NET Standard 或 PCL 库项目中调用特定于平台的代码,这最终是您想要做的)。
也就是说,您的核心 Xamarin.Forms 代码还有另一种选择,那就是使用 Shared Library project 类型。 .NET Standard 是迄今为止更为常见的选项,当您遵循 Xamarin.Forms 的入门文档(和 Xamarin.Forms != Xamarin 请参阅下面的 (1))时建议的选项您可以在创建 Xamarin 时选择此选项。表单解决方案:
使用核心 Xamarin.Forms 代码的共享库项目类型,您将可以访问在您的平台特定项目中引用的所有内容,因此您可以访问在 Xamarin.iOS 和 Xamarin 中可以访问的所有内容。 Android 项目直接。不需要 IoC 或依赖项服务。
关于使用共享库项目还是 .NET 标准项目是最好的选择,一直存在很多争论。各有利弊。简而言之,使用 .NET Standard 项目会迫使您使用 IoC 从库项目中调用特定于平台的代码,并使用自定义渲染器来访问 UI 控件的特定于平台的属性,而共享库项目使您可以完全访问所有类以及可用于平台特定项目的库,因此不需要依赖注入......但是当使用共享项目时,因为您可以在同一个共享项目中同时拥有 Xamarin.Android 特定和 Xamarin.iOS 特定代码,您需要使用编译器指令(#if 和 #endif),以便仅在构建 iOS 项目时编译 iOS 特定代码,而仅在编译 Android 项目时编译 Android 特定代码。不这样做会导致编译和/或运行时问题。这是一段简单的代码,向您展示如何使用编译器指令来隔离 iOS 和 Android 特定代码。这个简单的示例将创建一个按钮,点击该按钮将显示警报。如何在 iOS 和 Android 之间呈现警报是不同的,因此我们需要在按钮单击事件处理程序中隔离这些代码位,以便正确的代码在正确的平台上运行。
首先在项目选项中定义编译器符号。右键单击Android项目并选择Project Options,然后选择左侧的Compiler。然后在 Define Symbols 字段中,添加 ANDROID;,例如:
然后对iOS项目做同样的事情(但显然是输入IOS):
值得注意的是,这是一个依赖于配置的设置,因此您需要为将用于构建项目的所有配置添加这些符号。
接下来在 MainPage.xaml 中创建按钮:
<Button Text="Show me an alert!"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
Clicked="Handle_Clicked" />
然后在 MainPage.xaml.cs 代码后面的文件中:
void Handle_Clicked(object sender, System.EventArgs e)
{
#if ANDROID
Toast.MakeText(MainActivity.Context, "I'm an Android Toast!", ToastLength.Long).Show();
#endif
#if IOS
var alert = new UIAlertView("I'm an iOS Alert!", "I'm deprecated. but using here because I do not have easy access to my view controller at this time", null, "OK", null);
alert.Show();
#endif
}
您还需要围绕 using 语句的编译器指令:
#if ANDROID
using Android.Widget;
using SharedSample.Droid;
#endif
#if IOS
using UIKit;
#endif
希望您现在能更好地了解如何制作跨平台应用程序以及共享代码和使用平台特定代码所面临的一些挑战。尽管如此,您仍然无法将原生 iOS 页面(或原生 Android 页面)添加到 Xamarin.Forms MainPage 属性,因为 iOS 页面不是 Xamarin.Form 页面(MainPage 只能接受 Xamarin 的子类.Forms Page),但这应该向您展示如何从您的共享代码中调用特定于平台的代码。
哦,现在我在您的屏幕截图中看到您已将 Xamarin.Forms XAML 页面添加到 iOS 项目中????不,这不是解决您问题的方法。我会认真建议您注册Xamarin University。您需要的不仅仅是代码 sn-ps,您还需要更好地理解跨平台开发,而我在这里不那么简短的入门知识不足以让您从我所看到的情况中走出来。
但你知道吗,我认为有一个OAuth library for Xamarin Forms,所以也许你可以让它工作,因为它应该为你做所有平台特定的东西。
Nuget 页面:https://www.nuget.org/packages/Xamarin.Auth/
Github页面:https://github.com/xamarin/Xamarin.Auth
文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/authentication/oauth
祝你好运!
(1) Xamarin 是一家被 Microsoft 收购的公司。 Xamarin 制作的 SDK 允许使用 C# 和 .NET 框架为 iOS、Mac 和 Android 制作应用程序。 Xamarin.iOS SDK 用于制作 iOS 应用程序,Xamarin.Mac 用于 Mac 应用程序,Xamarin.Android 用于 Android 应用程序。所有人都使用Mono,这是.NET 的一个开源端口(因为.NET 当时只在Windows 和其他Microsoft 平台上运行......虽然现在有跨平台的.NET Core......但那是另一个话题)。
后来 Xamarin 引入了Xamarin.Forms,这是一个跨平台 UI(用户界面)库,允许在通用代码和/或 XAML 中创建 UI。在 Xamarin.Forms 之前,每个平台的 UI 必须在平台特定项目中创建,即 iOS 的 UI 将在 Xamarin.iOS 项目中,Android 的 UI 将在 Xamarin.Android 项目中,等等,但所有可以调用驻留在一个共享库项目中的后端代码(即 Web 请求、模型等),从而允许在不同平台应用程序项目之间共享大约 80% 的总代码。使用 Xamarin.Forms,对于一个简单的应用程序,100% 的代码共享是可能的。 Xamarin.Forms 仍然使用 Xamarin.iOS 和 Xamarin.Android 项目以及 Windows 上的 UWP 项目来启动 UI,但 Xamarin.Forms 使用渲染器将 Xamarin.Forms UI 控件呈现为特定于平台的控件,即Xam.Forms 中的 Button 在 iOS 上呈现为 UIButton,在 Android 上呈现为 Android Button。但是 Xamarin.Forms 只允许您访问本机控件的核心公共属性,因此如果您需要访问特定的本机属性或功能,则必须使用自定义渲染器(在本机平台上修改 UI 控件并访问本机控件的属性)和/或依赖服务(从核心 Xam.Forms 库项目运行特定于平台的代码)。