Udostępnij za pośrednictwem


Ponowne używanie stron platformy Xamarin.Forms w rozszerzeniu systemu iOS

Rozszerzenia systemu iOS umożliwiają dostosowanie istniejącego zachowania systemu przez dodanie dodatkowych funkcji do wstępnie zdefiniowanych przez punkty rozszerzeń systemów iOS i macOS, takie jak niestandardowe akcje kontekstu, automatyczne wypełnianie haseł, filtry wywołań przychodzących, modyfikatory zawartości powiadomień i inne. Rozszerzenie Xamarin.iOS obsługuje rozszerzenia, a ten przewodnik przeprowadzi Cię przez proces tworzenia rozszerzenia systemu iOS przy użyciu narzędzi platformy Xamarin.

Rozszerzenia są dystrybuowane w ramach aplikacji kontenera i aktywowane z określonego punktu rozszerzenia w aplikacji hosta. Aplikacja kontenera jest zazwyczaj prostą aplikacją systemu iOS, która udostępnia użytkownikowi informacje o rozszerzeniu, sposobie aktywowania i używania go. Istnieją trzy główne podejścia do udostępniania kodu między rozszerzeniem i aplikacją kontenera:

  1. Typowy projekt systemu iOS.

    Możesz umieścić cały udostępniony kod między kontenerem a rozszerzeniem w udostępnionej bibliotece systemu iOS i odwołać się do biblioteki z obu projektów. Zwykle biblioteka udostępniona zawiera natywną bibliotekę UIViewControllers i musi być biblioteką platformy Xamarin.iOS.

  2. Linki do plików.

    W niektórych przypadkach aplikacja Kontener udostępnia większość funkcji, podczas gdy rozszerzenie musi renderować pojedynczy UIViewControllerelement . W przypadku kilku plików do udostępnienia często dodaje się link do pliku Extension z pliku znajdującego się w aplikacji Kontener.

  3. Typowy projekt platformy Xamarin.Forms.

    Jeśli strony aplikacji są już udostępniane innej platformie, takiej jak Android, przy użyciu platformy Xamarin.Forms, typowym podejściem jest ponowne wdrożenie wymaganych stron natywnie w projekcie Extension, ponieważ rozszerzenie systemu iOS współpracuje z natywnymi kontrolkami UIViewControllers, a nie stronami platformy Xamarin.Forms. Musisz wykonać dodatkowe kroki, aby użyć zestawu narzędzi Xamarin.Forms w rozszerzeniu systemu iOS, które zostało wyjaśnione poniżej.

Zestaw narzędzi Xamarin.Forms w projekcie rozszerzenia systemu iOS

Możliwość korzystania z zestawu narzędzi Xamarin.Forms w projekcie natywnym jest udostępniana za pośrednictwem formularzy natywnych. Umożliwia ContentPagedodawanie stron pochodnych bezpośrednio do natywnych projektów platformy Xamarin.iOS. Metoda CreateViewController rozszerzenia konwertuje wystąpienie strony platformy Xamarin.Forms na natywną UIViewController, która może być używana lub modyfikowana jako zwykły kontroler. Ponieważ rozszerzenie systemu iOS jest specjalnym rodzajem natywnego projektu systemu iOS, możesz również użyć natywnych formularzy tutaj.

Ważne

Istnieje wiele znanych ograniczeń dotyczących rozszerzeń systemu iOS. Mimo że można używać zestawu narzędzi Xamarin.Forms w rozszerzeniu systemu iOS, należy to zrobić bardzo ostrożnie, monitorując użycie pamięci i czas uruchamiania. W przeciwnym razie rozszerzenie może zostać zakończone przez system iOS bez konieczności bezproblemowego obsługi tego rozszerzenia.

Przewodnik

W tym przewodniku utworzysz aplikację platformy Xamarin.Forms, rozszerzenie platformy Xamarin.iOS i użyjesz ponownie kodu udostępnionego w projekcie Rozszerzenia:

  1. Otwórz Visual Studio dla komputerów Mac, utwórz nowy projekt platformy Xamarin.Forms przy użyciu szablonu Aplikacji pustych formularzy i nadaj mu nazwę FormsShareExtension:

    Create Project

  2. W pliku FormsShareExtension/MainPage.xaml zastąp zawartość następującym układem:

    <?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. Dodaj nową klasę o nazwie MainPageViewMode do projektu FormsShareExtension i zastąp zawartość klasy następującym kodem:

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

    Kod jest współużytkowany na wszystkich platformach i będzie również używany przez rozszerzenie systemu iOS.

  4. W okienku rozwiązania kliknij prawym przyciskiem myszy rozwiązanie, wybierz pozycję Dodaj > nowe rozszerzenie akcji rozszerzenia> systemu iOS > projektu>, nadaj mu nazwę MyAction i naciśnij przycisk Utwórz:

    Screenshot shows the Choose a template with Action Extension selected.

  5. Aby użyć zestawu narzędzi Xamarin.Forms w rozszerzeniu systemu iOS i udostępnionym kodzie, należy dodać wymagane odwołania:

    • Kliknij prawym przyciskiem myszy rozszerzenie systemu iOS, wybierz pozycję Odwołania Dodaj projekty > referencyjne > FormularzeShareExtension > i naciśnij przycisk OK.

    • Kliknij prawym przyciskiem myszy rozszerzenie systemu iOS, wybierz pozycję Pakiety Zarządzaj pakietami > NuGet... > Xamarin.Forms i naciśnij przycisk Dodaj pakiet.

  6. Rozwiń projekt Extension i zmodyfikuj punkt wejścia, aby zainicjować zestaw narzędzi Xamarin.Forms i utworzyć strony. Zgodnie z wymaganiami systemu iOS rozszerzenie musi zdefiniować punkt wejścia w pliku Info.plist jako NSExtensionMainStoryboard lub NSExtensionPrincipalClass. Po aktywowaniu punktu wejścia w tym przypadku jest ActionViewController.ViewDidLoad to metoda , można utworzyć wystąpienie strony platformy Xamarin.Forms i wyświetlić je użytkownikowi. W związku z tym otwórz punkt wejścia i zastąp metodę ViewDidLoad następującą implementacją:

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

    Wystąpienie MainPage klasy jest tworzone przy użyciu standardowego konstruktora, a zanim będzie można go użyć w rozszerzeniu, przekonwertuj go na natywną UIViewController przy użyciu CreateViewController metody rozszerzenia.

    Skompiluj i uruchom aplikację:

    Screenshot shows a Hello from Xamarin dot Forms message on a mobile device.

    Aby aktywować rozszerzenie, przejdź do przeglądarki Safari, wpisz dowolny adres internetowy, np. microsoft.com, naciśnij klawisz Navigate, a następnie naciśnij ikonę Udostępnij w dolnej części strony, aby wyświetlić dostępne rozszerzenia akcji. Z listy dostępnych rozszerzeń wybierz rozszerzenie MyAction , naciskając je:

    Screenshot shows a Microsoft Teams Learn more page with the Share icon highlighted on a mobile device.Screenshot shows an Official Home Page with MyAction highlighted on a mobile device.Screenshot shows a Welcome to X F Page created from an i O S extension message on a mobile device.

    Rozszerzenie jest aktywowane, a strona platformy Xamarin.Forms jest wyświetlana użytkownikowi. Wszystkie powiązania i polecenia działają tak jak w aplikacji Kontener.

  7. Oryginalny kontroler widoku punktu wejścia jest widoczny, ponieważ jest tworzony i aktywowany przez system iOS. Aby rozwiązać ten problem, zmień styl UIModalPresentationStyle.FullScreen prezentacji modalnej na dla nowego kontrolera, dodając następujący kod bezpośrednio przed PresentModalViewController wywołaniem:

    newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
    

    Skompiluj i uruchom polecenie w symulatorze systemu iOS lub urządzeniu:

    Xamarin.Forms in iOS Extension

    Ważne

    W przypadku kompilacji urządzenia upewnij się, że używasz odpowiednich ustawień kompilacji i konfiguracji wydania zgodnie z opisem w tym miejscu.