Поделиться через


Повторное использование страниц Xamarin.Forms в расширении iOS

Расширения iOS позволяют настраивать существующее системное поведение, добавляя дополнительные функции в предопределенные точки расширения iOS и macOS, такие как пользовательские действия контекста, автоматическое заполнение пароля, фильтры входящих вызовов, модификаторы содержимого уведомлений и многое другое. Xamarin.iOS поддерживает расширения, и это руководство поможет вам создать расширение iOS с помощью средств Xamarin.

Расширения распределяются как часть приложения контейнера и активируются из определенной точки расширения в приложении узла. Приложение-контейнер обычно является простым приложением iOS, которое предоставляет пользователю сведения о расширении, активации и использовании. Существует три основных подхода к совместному использованию кода между расширением и приложением-контейнером:

  1. Общий проект iOS.

    Вы можете поместить весь общий код между контейнером и расширением в общую библиотеку iOS и ссылаться на библиотеку из обоих проектов. Обычно общая библиотека содержит собственные uiViewControllers и должна быть библиотекой Xamarin.iOS.

  2. Ссылки на файлы.

    В некоторых случаях приложение-контейнер предоставляет большую часть функциональных возможностей, а расширение должно отобразить один.UIViewController При использовании нескольких файлов для совместного использования обычно добавляется ссылка на файл в приложение расширения из файла, расположенного в приложении контейнера.

  3. Общий проект 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 и повторно используете общий код в проекте расширения:

  1. Откройте Visual Studio для Mac, создайте проект Xamarin.Forms с помощью шаблона приложения Blank Forms и назовите его FormsShareExtension:

    Создать проект

  2. В 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>
    
  3. Добавьте новый класс с именем 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.

  4. На панели решения щелкните правой кнопкой мыши решение, выберите "Добавить > расширение расширения расширения >Project > iOS>", назовите его MyAction и нажмите клавишу Create:

    Снимок экрана: выбор шаблона с выбранным расширением действия.

  5. Чтобы использовать Xamarin.Forms в расширении iOS и общем коде, необходимо добавить необходимые ссылки:

    • Щелкните правой кнопкой мыши расширение iOS, выберите "Добавить ссылочные > > проекты > FormsShareExtension" и нажмите кнопку "ОК".

    • Щелкните правой кнопкой мыши расширение iOS, выберите " Управление пакетами > NuGet" ... > Xamarin.Forms и нажмите кнопку "Добавить пакет".

  6. Разверните проект расширения и измените точку входа, чтобы инициализировать 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 метода расширения.

    Выполните сборку и запуск приложения:

    Снимок экрана: сообщение Hello из Xamarin dot Forms на мобильном устройстве.

    Чтобы активировать расширение, перейдите в браузер Safari, введите любой веб-адрес, например microsoft.com, нажмите кнопку навигации и нажмите значок "Общий доступ " в нижней части страницы, чтобы просмотреть доступные расширения действий. В списке доступных расширений выберите расширение MyAction , нажав на него:

    Снимок экрана: страница Снимок экрана: официальная домашняя страница с выделенным MyAction на мобильном устройстве. Снимок экрана: страница приветствия на X F, созданная из сообщения расширения I O S на мобильном устройстве.

    Расширение активируется, а страница Xamarin.Forms отображается пользователю. Все привязки и команды работают как в приложении-контейнере.

  7. Исходный контроллер представления точки входа отображается, так как он создается и активируется iOS. Чтобы устранить эту проблему, измените модальный стиль UIModalPresentationStyle.FullScreen презентации на новый контроллер, добавив следующий код прямо перед вызовом PresentModalViewController :

    newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
    

    Выполните сборку и запуск в симуляторе iOS или на устройстве:

    Xamarin.Forms в расширении iOS

    Внимание

    Для сборки устройства обязательно используйте правильные параметры сборки и конфигурацию выпуска , как описано здесь.