Использование IoC (Inversion of Control) - это один из способов, как указал Шон, но следует понимать, что IoC - это имя для одного метода вызова специфичного для платформы кода из проекта библиотеки, независимой от платформы, такого как проект .NET Standard.,Вы должны решить, какую библиотеку IoC использовать, или использовать функциональность IoC, встроенную в некоторые кроссплатформенные инфраструктуры, такие как MvvmCross или даже Xamarin.Forms Dependency Service (которая не является истинным контейнером IoC, ноэто скорее локатор сервисов, но он действительно позволяет вам вызывать специфичный для платформы код из проекта библиотеки .NET Standard или PCL, что в конечном итоге и нужно).
Тем не менее, есть еще одинвариант для вашего основного кода Xamarin.Forms, то есть использовать тип общей библиотеки проекта ..NET Standard - гораздо более распространенный вариант, который предлагается, когда вы следуете документам по началу работы для Xamarin.Forms (и Xamarin.Forms! = Xamarin, см. (1) ниже). Вы можете выбрать это при создании Xamarin.Решение для форм:
![enter image description here](https://i.stack.imgur.com/IAezK.png)
С типом проекта общей библиотеки для вашего основного кода Xamarin.Forms у вас будет доступ ко всему, на что ссылается ваша платформаконкретные проекты, так что вы получите доступ ко всему, что у вас есть доступ непосредственно в проектах Xamarin.iOS и Xamarin.Android.Услуги IoC или Dependency не требуются.
Всегда было много споров о том, является ли лучшим вариантом использование проекта общей библиотеки или проекта .NET Standard.У каждого есть свои плюсы и минусы.В двух словах, использование проекта .NET Standard заставляет вас использовать IoC для вызова кода конкретной платформы из проекта библиотеки и использовать пользовательские средства визуализации для доступа к свойствам элементов управления пользовательского интерфейса, зависящих от платформы, тогда как проект общей библиотеки предоставляет вам полный доступ ко всем классам.и библиотеки, доступные для конкретного проекта платформы, что делает ненужным внедрение зависимостей ... НО при использовании общего проекта, поскольку в одном и том же общем проекте вы можете использовать как специальный код Xamarin.Android, так и специальный код Xamarin.iOS, вам необходимо использоватьдирективы компилятора (#if
и #endif
), так что специфичный для iOS код компилируется только при сборке проекта iOS, а специфичный для Android код компилируется только при компиляции проекта Android.Невыполнение этого требования может вызвать проблемы компиляции и / или времени выполнения.Вот простой фрагмент кода, который покажет вам, как использовать директивы компилятора для изоляции специфичного для iOS и Android кода.Этот простой пример создаст кнопку, которая при нажатии представит предупреждение.Способ представления оповещения в iOS и Android различен, поэтому нам нужно выделить эти фрагменты кода в обработчике событий нажатия кнопки, чтобы на правильной платформе работал правильный код.
Сначала определите символы компилятора в опциях проекта.Щелкните правой кнопкой мыши проект Android и выберите Параметры проекта и выберите Компилятор слева.Затем в поле Определить символы добавьте ANDROID; , например:
![enter image description here](https://i.stack.imgur.com/N02X0.png)
Затем сделайте то же самоедля проекта iOS (но, очевидно, ввод IOS ):
![enter image description here](https://i.stack.imgur.com/BGNSw.png)
Стоит отметить, что это параметр, зависящий от конфигурации,поэтому вам нужно добавить эти символы для всех конфигураций, которые вы будете использовать для создания своих проектов.
Затем создайте кнопку в 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) к свойству MainPage Xamarin.Forms, поскольку страница iOS НЕ является страницей Xamarin.Form (MainPage может принимать только подкласс Xamarin..Forms Page), но это должно показать вам, как вызывать специфический для платформы код из вашего общего кода.
О, теперь я вижу на ваших скриншотах, что вы добавили свою страницу Xamarin.Forms XAML в проект iOS ????Нет, это не способ обойти вашу проблему.Я бы серьезно предложил вам зарегистрироваться в Xamarin University .Вам нужно больше, чем просто фрагменты кода, вам нужно лучше понимать кроссплатформенную разработку, и моего не столь краткого учебника здесь недостаточно, чтобы вы могли понять, что я вижу.
Но вы знаете, что, я думаю, есть библиотека OAuth для 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, которые позволяли создавать приложения для iOS, Mac и Android, используя C # и .NET Framework. Xamarin.iOS SDK используется для создания приложений для iOS, Xamarin.Mac для приложений Mac и Xamarin.Android для приложений Android.Все они используют Mono , который является портом с открытым исходным кодом .NET (поскольку в то время .NET работал только на Windows и других платформах Microsoft ... хотя сейчас есть .NET Core, который является кроссплатформенным ..но это уже другая тема).Позже Xamarin представила Xamarin.Forms , которая представляет собой библиотеку кроссплатформенного пользовательского интерфейса (пользовательского интерфейса), которая позволяет создавать пользовательский интерфейс в общем коде и / или XAML.До появления Xamarin.Forms пользовательский интерфейс для каждой платформы должен был создаваться в проектах, специфичных для этой платформы, то есть пользовательский интерфейс для iOS был бы в проекте Xamarin.iOS, пользовательский интерфейс для Android был бы в проекте Xamarin.Android и т. Д., Но всеможет вызывать внутренний код (т. е. веб-запросы, модели и т. д.), который находится в одном проекте совместно используемой библиотеки, что позволяет разделять около 80% всего кода между проектами различных приложений платформы.С Xamarin.Forms для простого приложения возможен 100% обмен кодами.Xamarin.Forms по-прежнему использует проекты Xamarin.iOS и Xamarin.Android, а также проекты UWP в Windows для запуска пользовательского интерфейса, но Xamarin.Forms использует средства визуализации для визуализации элементов управления пользовательского интерфейса Xamarin.Forms в элементы, специфичные для платформы, т.е.Кнопка в Xam.Forms отображает UIButton на iOS и кнопку Android на Android.Однако Xamarin.Forms предоставляет вам доступ только к основным общим свойствам собственных элементов управления, поэтому, если вам нужен доступ к определенным собственным свойствам или функциям, вы должны использовать настраиваемое средство визуализации (для изменения элементов управления пользовательского интерфейса на собственной платформе и доступа к собственным).свойства элемента управления) и / или служба зависимостей (для запуска специфичного для платформы кода из основного проекта библиотеки Xam.Forms).