Partager via


Réutiliser des pages Xamarin.Forms dans une extension iOS

Les extensions iOS vous permettent de personnaliser le comportement du système existant en ajoutant des fonctionnalités supplémentaires aux points d’extension prédéfinis par iOS et macOS, telles que les actions de contexte personnalisées, le remplissage automatique de mot de passe, les filtres d’appels entrants, les modificateurs de contenu de notification, etc. Xamarin.iOS prend en charge les extensions et ce guide vous guide tout au long de la création d’une extension iOS à l’aide des outils Xamarin.

Les extensions sont distribuées dans le cadre d’une application conteneur et activées à partir d’un point d’extension spécifique dans une application hôte. L’application conteneur est généralement une application iOS simple, qui fournit à un utilisateur des informations sur l’extension, comment l’activer et l’utiliser. Il existe trois approches main pour partager du code entre une extension et une application conteneur :

  1. Projet iOS courant.

    Vous pouvez placer tout le code partagé entre le conteneur et l’extension dans une bibliothèque iOS partagée et référencer la bibliothèque des deux projets. Généralement, la bibliothèque partagée contient des UIViewController natifs et il doit s’agir d’une bibliothèque Xamarin.iOS.

  2. Liens de fichiers.

    Dans certains cas, l’application conteneur fournit la plupart des fonctionnalités tandis que l’extension doit afficher un seul UIViewController. Avec peu de fichiers à partager, il est courant d’ajouter un lien de fichier à l’application Extension à partir du fichier situé dans l’application conteneur.

  3. Projet Xamarin.Forms courant.

    Si les pages d’application sont déjà partagées avec une autre plateforme, telle qu’Android, à l’aide de l’infrastructure Xamarin.Forms, l’approche courante consiste à ré-implémenter les pages requises en mode natif dans le projet d’extension, car l’extension iOS fonctionne avec UIViewControllers natifs et non avec les pages Xamarin.Forms. Vous devez effectuer des étapes supplémentaires pour utiliser Xamarin.Forms dans l’extension iOS, qui sont expliquées ci-dessous.

Xamarin.Forms dans un projet d’extension iOS

La possibilité d’utiliser Xamarin.Forms dans un projet natif est fournie via Native Forms. Il permet d’ajouter ContentPagedes pages dérivées directement aux projets Xamarin.iOS natifs. La CreateViewController méthode d’extension convertit un instance d’une page Xamarin.Forms en un natif UIViewController, qui peut être utilisé ou modifié en tant que contrôleur standard. Étant donné qu’une extension iOS est un type spécial d’un projet iOS natif, vous pouvez également utiliser des formulaires natifs ici.

Important

Il existe de nombreuses limitations connues pour les extensions iOS. Bien que vous puissiez utiliser Xamarin.Forms dans une extension iOS, vous devez le faire très soigneusement, en surveillant l’utilisation de la mémoire et le temps de démarrage. Sinon, l’extension peut être arrêtée par iOS sans aucun moyen de gérer cela correctement.

Procédure pas à pas

Dans cette procédure pas à pas, vous allez créer une application Xamarin.Forms, une extension Xamarin.iOS et réutiliser le code partagé dans le projet d’extension :

  1. Ouvrez Visual Studio pour Mac, créez un projet Xamarin.Forms à l’aide du modèle d’application Forms vide et nommez-le FormsShareExtension :

    Créer un projet

  2. Dans FormsShareExtension/MainPage.xaml, remplacez le contenu par la disposition suivante :

    <?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. Ajoutez une nouvelle classe nommée MainPageViewMode au projet FormsShareExtension et remplacez le contenu de la classe par le code suivant :

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

    Le code est partagé sur toutes les plateformes et sera également utilisé par une extension iOS.

  4. Dans le volet solution, cliquez avec le bouton droit sur la solution, sélectionnez Ajouter une > extension d’action d’extension > iOS > de projet>, nommez-la MyAction, puis appuyez sur Créer :

    Capture d’écran montrant choisir un modèle avec l’extension d’action sélectionnée.

  5. Pour utiliser Xamarin.Forms dans l’extension iOS et le code partagé, vous devez ajouter les références requises :

    • Cliquez avec le bouton droit sur l’extension iOS, sélectionnez Références > Ajouter des projets > de référence > FormulairesShareExtension, puis appuyez sur OK.

    • Cliquez avec le bouton droit sur l’extension iOS, sélectionnez Packages > Gérer les packages NuGet... > Xamarin.Forms et appuyez sur Ajouter un package.

  6. Développez le projet d’extension et modifiez un point d’entrée pour initialiser Xamarin.Forms et créer des pages. En fonction des exigences iOS, une extension doit définir le point d’entrée dans Info.plist comme NSExtensionMainStoryboard ou NSExtensionPrincipalClass. Une fois le point d’entrée activé, dans ce cas il s’agit de la ActionViewController.ViewDidLoad méthode, vous pouvez créer un instance d’une page Xamarin.Forms et l’afficher à un utilisateur. Par conséquent, ouvrez le point d’entrée et remplacez la ViewDidLoad méthode par l’implémentation suivante :

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

    Le MainPage est instancié à l’aide d’un constructeur standard et avant de pouvoir l’utiliser dans l’extension, convertissez-le en natif UIViewController à l’aide de la méthode d’extension CreateViewController .

    Créez et exécutez l’application :

    Capture d’écran montrant un message Hello à partir de Xamarin dot Forms sur un appareil mobile.

    Pour activer l’extension, accédez au navigateur Safari, tapez n’importe quelle adresse web, par exemple microsoft.com, appuyez sur naviguer, puis appuyez sur l’icône Partager en bas de la page pour afficher les extensions d’action disponibles. Dans la liste des extensions disponibles, sélectionnez l’extension MyAction en appuyant dessus :

    Capture d’écran montrant une page En savoir plus Microsoft Teams avec l’icône Partager mise en évidence sur un appareil mobile.Capture d’écran montrant une page d’accueil officielle avec MyAction mis en évidence sur un appareil mobile.Capture d’écran montrant une page Bienvenue dans X F créée à partir d’un message d’extension i O S sur un appareil mobile.

    L’extension est activée et la page Xamarin.Forms s’affiche pour l’utilisateur. Toutes les liaisons et commandes fonctionnent comme dans l’application conteneur.

  7. Le contrôleur de vue de point d’entrée d’origine est visible, car il est créé et activé par iOS. Pour résoudre ce problème, remplacez le style UIModalPresentationStyle.FullScreen de présentation modal par pour le nouveau contrôleur en ajoutant le code suivant juste avant l’appel PresentModalViewController :

    newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
    

    Générez et exécutez dans le simulateur iOS ou un appareil :

    Xamarin.Forms dans l’extension iOS

    Important

    Pour la build de l’appareil, veillez à utiliser les paramètres de build appropriés et la configuration release comme décrit ici.