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 :
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.
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.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 ContentPage
des 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 :
Ouvrez Visual Studio pour Mac, créez un projet Xamarin.Forms à l’aide du modèle d’application Forms vide et nommez-le FormsShareExtension :
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>
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.
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 :
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.
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
ouNSExtensionPrincipalClass
. Une fois le point d’entrée activé, dans ce cas il s’agit de laActionViewController.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 laViewDidLoad
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 natifUIViewController
à l’aide de la méthode d’extensionCreateViewController
.Créez et exécutez l’application :
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 :
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.
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’appelPresentModalViewController
:newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
Générez et exécutez dans le simulateur iOS ou un appareil :
Important
Pour la build de l’appareil, veillez à utiliser les paramètres de build appropriés et la configuration release comme décrit ici.