Wiederverwendung von Xamarin.Forms-Seiten in einer iOS-Erweiterung

Mit iOS-Erweiterungen können Sie vorhandenes Systemverhalten anpassen, indem Sie zusätzliche Funktionen hinzufügen, die von iOS- und macOS-Erweiterungspunkten vordefinierten Funktionen hinzugefügt werden, z. B. benutzerdefinierte Kontextaktionen, automatisches Ausfüllen von Kennwörtern, Filter für eingehende Anrufe, Modifizierer für Benachrichtigungsinhalte und vieles mehr. Xamarin.iOS unterstützt Erweiterungen, und dieser Leitfaden führt Sie durch das Erstellen einer iOS-Erweiterung mithilfe von Xamarin-Tools.

Erweiterungen werden als Teil einer Container-App verteilt und von einem bestimmten Erweiterungspunkt in einer Host-App aktiviert. Bei der Container-App handelt es sich in der Regel um eine einfache iOS-Anwendung, die einem Benutzer Informationen über die Erweiterung, ihre Aktivierung und Verwendung bereitstellt. Es gibt drei Standard Ansätze zum Freigeben von Code zwischen einer Erweiterung und einer Container-App:

  1. Allgemeines iOS-Projekt.

    Sie können den gesamten freigegebenen Code zwischen dem Container und der Erweiterung in eine freigegebene iOS-Bibliothek einfügen und in beiden Projekten auf die Bibliothek verweisen. In der Regel enthält die freigegebene Bibliothek native UIViewControllers und muss eine Xamarin.iOS-Bibliothek sein.

  2. Dateilinks.

    In einigen Fällen bietet die Container-App die meisten Funktionen, während die Erweiterung eine einzelne rendern UIViewControllermuss. Da nur wenige Dateien freigegeben werden müssen, ist es üblich, aus der Datei in der Container-App einen Dateilink zur Erweiterungs-App hinzuzufügen.

  3. Allgemeines Xamarin.Forms-Projekt.

    Wenn App-Seiten unter Verwendung des Xamarin.Forms-Frameworks bereits für eine andere Plattform wie Android freigegeben werden, besteht der allgemeine Ansatz darin, erforderliche Seiten nativ im Erweiterungsprojekt neu zu implementieren, da die iOS-Erweiterung mit nativen UIViewControllers und nicht mit Xamarin.Forms-Seiten funktioniert. Sie müssen zusätzliche Schritte ausführen, um Xamarin.Forms in der iOS-Erweiterung zu verwenden, die unten erläutert werden.

Xamarin.Forms in einem iOS-Erweiterungsprojekt

Die Möglichkeit, Xamarin.Forms in einem nativen Projekt zu verwenden, wird über Native Forms bereitgestellt. Es ermöglicht das ContentPagedirekte Hinzufügen von von -abgeleiteten Seiten zu nativen Xamarin.iOS-Projekten. Die CreateViewController Erweiterungsmethode konvertiert eine instance einer Xamarin.Forms-Seite in eine native UIViewController, die als regulärer Controller verwendet oder geändert werden kann. Da eine iOS-Erweiterung eine besondere Art eines nativen iOS-Projekts ist, können Sie auch hier Native Forms verwenden.

Wichtig

Es gibt viele bekannte Einschränkungen für iOS-Erweiterungen. Obwohl Sie Xamarin.Forms in einer iOS-Erweiterung verwenden können, sollten Sie dies sehr sorgfältig tun, um die Speicherauslastung und die Startzeit zu überwachen. Andernfalls könnte die Erweiterung von iOS beendet werden, ohne dass dies ordnungsgemäß behandelt werden kann.

Exemplarische Vorgehensweise

In dieser exemplarischen Vorgehensweise erstellen Sie eine Xamarin.Forms-Anwendung, eine Xamarin.iOS-Erweiterung und verwenden freigegebenen Code im Erweiterungsprojekt:

  1. Öffnen Sie Visual Studio für Mac, erstellen Sie ein neues Xamarin.Forms-Projekt mithilfe der Vorlage Leere Forms-App, und nennen Sie es FormsShareExtension:

    Erstellen des Projekts

  2. Ersetzen Sie in FormsShareExtension/MainPage.xaml den Inhalt durch das folgende Layout:

    <?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. Fügen Sie dem FormsShareExtension-Projekt eine neue Klasse mit dem Namen MainPageViewMode hinzu, und ersetzen Sie den Inhalt der Klasse durch den folgenden Code:

    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!";
            }
        }
    }
    

    Der Code wird plattformübergreifend freigegeben und auch von einer iOS-Erweiterung verwendet.

  4. Klicken Sie im Projektmappenpad mit der rechten Maustaste auf die Projektmappe, wählen Sie Neues Projekt > hinzufügen > iOS-Erweiterungsaktionserweiterung >> hinzufügen aus, nennen Sie sie MyAction, und drücken Sie Erstellen:

    Screenshot: Wählen Sie eine Vorlage mit ausgewählter Aktionserweiterung aus.

  5. Um Xamarin.Forms in der iOS-Erweiterung und dem freigegebenen Code zu verwenden, müssen Sie erforderliche Verweise hinzufügen:

    • Klicken Sie mit der rechten Maustaste auf die iOS-Erweiterung, wählen Sie Verweise > Verweisprojekte >> hinzufügen FormulareShareExtension aus, und drücken Sie OK.

    • Klicken Sie mit der rechten Maustaste auf die iOS-Erweiterung, und wählen Sie Pakete > NuGet-Pakete verwalten aus. > Xamarin.Forms , und drücken Sie Paket hinzufügen.

  6. Erweitern Sie das Erweiterungsprojekt, und ändern Sie einen Einstiegspunkt, um Xamarin.Forms zu initialisieren und Seiten zu erstellen. Gemäß iOS-Anforderungen muss eine Erweiterung den Einstiegspunkt in Info.plist als NSExtensionMainStoryboard oder NSExtensionPrincipalClassdefinieren. Sobald der Einstiegspunkt aktiviert wurde, in diesem Fall die ActionViewController.ViewDidLoad -Methode, können Sie eine instance einer Xamarin.Forms-Seite erstellen und sie einem Benutzer anzeigen. Öffnen Sie daher den Einstiegspunkt, und ersetzen Sie die ViewDidLoad -Methode durch die folgende Implementierung:

    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);
    }
    

    Der MainPage wird mithilfe eines Standardkonstruktors instanziiert. Bevor Sie ihn in der Erweiterung verwenden können, konvertieren Sie es mithilfe der Erweiterungsmethode in ein natives UIViewControllerCreateViewController System.

    Erstellen Sie die Anwendung, und führen Sie sie aus:

    Screenshot: Nachricht

    Um die Erweiterung zu aktivieren, navigieren Sie zum Safari-Browser, geben Sie eine beliebige Webadresse ein, z. B. microsoft.com, drücken Sie die Navigation, und drücken Sie dann unten auf der Seite das Symbol Freigeben , um die verfügbaren Aktionserweiterungen anzuzeigen. Wählen Sie in der Liste der verfügbaren Erweiterungen die MyAction-Erweiterung aus, indem Sie darauf tippen:

    Screenshot: Microsoft Teams-Seite Screenshot: Offizielle Startseite mit hervorgehobener MyAction auf einem mobilen GerätScreenshot: Willkommen bei X F-Seite, die aus einer i O S-Erweiterungsnachricht auf einem mobilen Gerät erstellt wurde.

    Die Erweiterung wird aktiviert, und dem Benutzer wird die Seite Xamarin.Forms angezeigt. Alle Bindungen und Befehle funktionieren wie in der Container-App.

  7. Der ursprüngliche Einstiegspunktansichtscontroller ist sichtbar, da er von iOS erstellt und aktiviert wird. Um dies zu beheben, ändern Sie die modale Darstellungsart UIModalPresentationStyle.FullScreen für den neuen Controller in, indem Sie direkt vor dem Aufruf den PresentModalViewController folgenden Code hinzufügen:

    newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
    

    Erstellen und Ausführen im iOS-Simulator oder auf einem Gerät:

    Xamarin.Forms in iOS-Erweiterung

    Wichtig

    Verwenden Sie für den Gerätebuild unbedingt die richtigen Buildeinstellungen und die Releasekonfiguration , wie hier beschrieben.