Повторное использование страниц Xamarin.Forms в расширении iOS
Расширения iOS позволяют настраивать существующее системное поведение, добавляя дополнительные функции в предопределенные точки расширения iOS и macOS, такие как пользовательские действия контекста, автоматическое заполнение пароля, фильтры входящих вызовов, модификаторы содержимого уведомлений и многое другое. Xamarin.iOS поддерживает расширения, и это руководство поможет вам создать расширение iOS с помощью средств Xamarin.
Расширения распределяются как часть приложения контейнера и активируются из определенной точки расширения в приложении узла. Приложение-контейнер обычно является простым приложением iOS, которое предоставляет пользователю сведения о расширении, активации и использовании. Существует три основных подхода к совместному использованию кода между расширением и приложением-контейнером:
Общий проект iOS.
Вы можете поместить весь общий код между контейнером и расширением в общую библиотеку iOS и ссылаться на библиотеку из обоих проектов. Обычно общая библиотека содержит собственные uiViewControllers и должна быть библиотекой Xamarin.iOS.
Ссылки на файлы.
В некоторых случаях приложение-контейнер предоставляет большую часть функциональных возможностей, а расширение должно отобразить один.
UIViewController
При использовании нескольких файлов для совместного использования обычно добавляется ссылка на файл в приложение расширения из файла, расположенного в приложении контейнера.Общий проект Xamarin.Forms.
Если страницы приложений уже совместно используют другую платформу, например Android, используя платформу Xamarin.Forms, распространенный подход заключается в повторном использовании необходимых страниц в проекте расширения, так как расширение iOS работает с собственными uiViewControllers, а не страницами Xamarin.Forms. Для использования Xamarin.Forms в расширении iOS необходимо выполнить дополнительные действия, описанные ниже.
Xamarin.Forms в проекте расширения iOS
Возможность использования Xamarin.Forms в собственном проекте предоставляется через Native Forms. Он позволяет ContentPage
добавлять производные страницы непосредственно в собственные проекты Xamarin.iOS. Метод CreateViewController
расширения преобразует экземпляр страницы Xamarin.Forms в собственный UIViewController
, который можно использовать или изменять как обычный контроллер. Так как расширение iOS — это особый вид собственного проекта iOS, здесь можно использовать собственные формы .
Внимание
Существует множество известных ограничений для расширений iOS. Хотя вы можете использовать Xamarin.Forms в расширении iOS, это необходимо сделать очень тщательно, мониторинг использования памяти и времени запуска. В противном случае расширение может быть завершено iOS без каких-либо способов обрабатывать это корректно.
Пошаговое руководство
В этом пошаговом руководстве вы создадите приложение Xamarin.Forms, расширение Xamarin.iOS и повторно используете общий код в проекте расширения:
Откройте Visual Studio для Mac, создайте проект Xamarin.Forms с помощью шаблона приложения Blank Forms и назовите его FormsShareExtension:
В FormsShareExtension/MainPage.xaml замените содержимое следующим макетом:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="FormsShareExtension.MainPage" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:local="clr-namespace:FormsShareExtension" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:DataType="local:MainPageViewModel" BackgroundColor="Orange" mc:Ignorable="d"> <ContentPage.BindingContext> <local:MainPageViewModel Message="Hello from Xamarin.Forms!" /> </ContentPage.BindingContext> <StackLayout HorizontalOptions="Center" VerticalOptions="Center"> <Label Margin="20" Text="{Binding Message}" VerticalOptions="CenterAndExpand" /> <Button Command="{Binding DoCommand}" Text="Do the job!" /> </StackLayout> </ContentPage>
Добавьте новый класс с именем MainPageViewMode в проект FormsShareExtension и замените содержимое класса следующим кодом:
using System; using System.ComponentModel; using System.Windows.Input; using Xamarin.Forms; namespace FormsShareExtension { public class MainPageViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _message; public string Message { get { return _message; } set { if (_message != value) { _message = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Message))); } } } private ICommand _doCommand; public ICommand DoCommand { get { return _doCommand; } set { if(_doCommand != value) { _doCommand = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DoCommand))); } } } public MainPageViewModel() { DoCommand = new Command(OnDoCommandExecuted); } private void OnDoCommandExecuted(object state) { Message = $"Job {Environment.TickCount} has been completed!"; } } }
Код предоставляется всем платформам и также будет использоваться расширением iOS.
На панели решения щелкните правой кнопкой мыши решение, выберите "Добавить > расширение расширения расширения >Project > iOS>", назовите его MyAction и нажмите клавишу Create:
Чтобы использовать Xamarin.Forms в расширении iOS и общем коде, необходимо добавить необходимые ссылки:
Щелкните правой кнопкой мыши расширение iOS, выберите "Добавить ссылочные > > проекты > FormsShareExtension" и нажмите кнопку "ОК".
Щелкните правой кнопкой мыши расширение iOS, выберите " Управление пакетами > NuGet" ... > Xamarin.Forms и нажмите кнопку "Добавить пакет".
Разверните проект расширения и измените точку входа, чтобы инициализировать Xamarin.Forms и создать страницы. Для требований iOS расширение должно определить точку входа в Info.plist как
NSExtensionMainStoryboard
илиNSExtensionPrincipalClass
. После активации точки входа в этом случае этоActionViewController.ViewDidLoad
метод, можно создать экземпляр страницы Xamarin.Forms и показать его пользователю. Поэтому откройте точку входа и заменитеViewDidLoad
метод следующей реализацией:public override void ViewDidLoad() { base.ViewDidLoad(); // Initialize Xamarin.Forms framework global::Xamarin.Forms.Forms.Init(); // Create an instance of XF page with associated View Model var xfPage = new MainPage(); var viewModel = (MainPageViewModel)xfPage.BindingContext; viewModel.Message = "Welcome to XF Page created from an iOS Extension"; // Override the behavior to complete the execution of the Extension when a user press the button viewModel.DoCommand = new Command(() => DoneClicked(this)); // Convert XF page to a native UIViewController which can be consumed by the iOS Extension var newController = xfPage.CreateViewController(); // Present new view controller as a regular view controller this.PresentModalViewController(newController, false); }
Экземпляр
MainPage
создается с помощью стандартного конструктора и прежде чем использовать его в расширении, преобразуйте его в собственныйUIViewController
код с помощьюCreateViewController
метода расширения.Выполните сборку и запуск приложения:
Чтобы активировать расширение, перейдите в браузер Safari, введите любой веб-адрес, например microsoft.com, нажмите кнопку навигации и нажмите значок "Общий доступ " в нижней части страницы, чтобы просмотреть доступные расширения действий. В списке доступных расширений выберите расширение MyAction , нажав на него:
Расширение активируется, а страница Xamarin.Forms отображается пользователю. Все привязки и команды работают как в приложении-контейнере.
Исходный контроллер представления точки входа отображается, так как он создается и активируется iOS. Чтобы устранить эту проблему, измените модальный стиль
UIModalPresentationStyle.FullScreen
презентации на новый контроллер, добавив следующий код прямо перед вызовомPresentModalViewController
:newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
Выполните сборку и запуск в симуляторе iOS или на устройстве:
Внимание
Для сборки устройства обязательно используйте правильные параметры сборки и конфигурацию выпуска , как описано здесь.