在 iOS 擴充功能中重複使用 Xamarin.Forms 頁面
iOS 擴充功能可讓您藉由將額外的功能新增至 iOS 和 macOS 擴充點預先定義的現有系統行為,例如自定義內容動作、密碼自動填入、來電篩選、通知內容修飾詞等等。 Xamarin.iOS 支援擴充功能, 本指南 將逐步引導您使用 Xamarin 工具建立 iOS 擴充功能。
擴充功能會散發為容器應用程式的一部分,並從主機應用程式中的特定擴充點啟動。 容器應用程式通常是簡單的 iOS 應用程式,為使用者提供擴充功能的相關信息、如何啟用及使用它。 在擴充功能和容器應用程式之間共用程式代碼有三種主要方法:
常見的 iOS 專案。
您可以將容器和延伸模組之間的所有共享程式代碼放入共用 iOS 連結庫,並從這兩個專案參考連結庫。 共用連結庫通常包含原生 UIViewControllers,而且必須是 Xamarin.iOS 連結庫。
檔案連結。
在某些情況下,容器應用程式會提供大部分的功能,而擴充功能則需要轉譯單
UIViewController
一 。 共用的檔案很少,通常會從容器應用程式中的檔案,將檔案連結新增至延伸模塊應用程式。常見的 Xamarin.Forms 專案。
如果應用程式頁面已經與其他平台共用,例如 Android,使用 Xamarin.Forms 架構,常見的方法是在 Extension 專案中原生重新實作必要的頁面,因為 iOS 擴充功能適用於原生 UIViewControllers,而不是 Xamarin.Forms 頁面。 您必須執行其他步驟,才能在iOS擴充功能中使用 Xamarin.Forms,如下所述。
iOS 擴充功能專案中的 Xamarin.Forms
原生專案中使用 Xamarin.Forms 的能力是透過 Native Forms 提供。 它可讓 ContentPage
衍生頁面直接新增至原生 Xamarin.iOS 專案。 擴充方法會將 CreateViewController
Xamarin.Forms 頁面的實例轉換成原生 UIViewController
,以做為一般控制器使用或修改。 因為 iOS 擴充功能是原生 iOS 專案的特殊類型,您也可以在這裡使用 原生表單 。
重要
iOS 擴充功能有許多 已知的限制 。 雖然您可以在 iOS 擴充功能中使用 Xamarin.Forms,但您應該非常小心地監視記憶體使用量和啟動時間。 否則,擴充功能可能會由iOS終止,而不需要任何方式以正常方式處理此作業。
逐步解說
在本逐步解說中,您將建立 Xamarin.Forms 應用程式、Xamarin.iOS 擴充功能,並在 Extension 專案中重複使用共用程式代碼:
開啟 Visual Studio for Mac、使用 空白表單應用程式 範本建立新的 Xamarin.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擴充功能使用。
在 solution pad 中,以滑鼠右鍵按兩下方案,選取 [新增>專案 > iOS > 擴充功能]>,將它命名為 MyAction,然後按 [建立]:
若要在 iOS 延伸模組和共享程式碼中使用 Xamarin.Forms,您需要新增必要的參考:
以滑鼠右鍵按兩下 iOS 延伸模組,選取 [參考 > 新增參考 > 項目 > 表單][共用][ 擴充功能],然後按 [ 確定]。
以滑鼠右鍵按下 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
會使用標準建構函式具現化 ,而且在擴充功能中使用之前,請先使用CreateViewController
擴充方法將它轉換成原生UIViewController
。建置並執行應用程式:
若要啟用擴充功能,請流覽至 Safari 瀏覽器,輸入任何網址,例如 microsoft.com、按 navigate,然後按 頁面底部的 [共用 ] 圖示以查看可用的動作延伸模組。 從可用的擴充功能清單中,點選 [MyAction 擴充功能] 來選取它:
[擴充功能] 會啟動,並向用戶顯示 [Xamarin.Forms] 頁面。 所有系結和命令都會在容器應用程式中運作。
原始進入點檢視控制器是可見的,因為它是由 iOS 建立和啟動。 若要修正此問題,請將新控制器的強制響應簡報樣式變更為
UIModalPresentationStyle.FullScreen
,方法是在呼叫之前PresentModalViewController
新增下列程式代碼:newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
在 iOS 模擬器或裝置中建置並執行:
重要
針對裝置組建,請務必使用適當的組建設定和 發行 組態,如 這裡所述。