Udostępnij za pośrednictwem


Podstawy rozszerzenia aplikacji komunikatów na platformie Xamarin.iOS

W tym artykule pokazano, jak uwzględnić rozszerzenie aplikacji komunikatów w rozwiązaniu Xamarin.iOS, które integruje się z aplikacją Messages i prezentuje nowe funkcje użytkownikowi.

Nowe w systemie iOS 10 rozszerzenie aplikacji komunikatów integruje się z aplikacją Messages i prezentuje nowe funkcje dla użytkownika. Rozszerzenie może wysyłać tekst, naklejki, pliki multimedialne i interaktywne wiadomości.

Informacje o rozszerzeniach aplikacji komunikatów

Jak wspomniano powyżej, rozszerzenie aplikacji komunikatów integruje się z aplikacją Messages i prezentuje nowe funkcje użytkownikowi. Rozszerzenie może wysyłać tekst, naklejki, pliki multimedialne i interaktywne wiadomości. Dostępne są dwa typy rozszerzenia aplikacji komunikatów:

  • Pakiety naklejek — zawiera kolekcję naklejek, które użytkownik może dodać do wiadomości. Pakiety naklejek można tworzyć bez pisania kodu.
  • Aplikacja iMessage — może prezentować niestandardowy interfejs użytkownika w aplikacji Wiadomości do wybierania naklejek, wprowadzania tekstu, w tym plików multimedialnych (z opcjonalną konwersją typu) oraz tworzenia, edytowania i wysyłania komunikatów interakcji.

Rozszerzenia aplikacji komunikatów udostępniają trzy główne typy zawartości:

  • Komunikaty interakcyjne — to typ niestandardowej zawartości wiadomości generowanej przez aplikację, gdy użytkownik naciągnie komunikat, aplikacja zostanie uruchomiona na pierwszym planie.
  • Naklejki — czy obrazy są generowane przez aplikację, które można uwzględnić w wiadomościach wysyłanych między użytkownikami.
  • Inna obsługiwana zawartość — aplikacja może udostępniać zawartość, taką jak zdjęcia, filmy wideo, tekst lub linki do innych typów zawartości, które zawsze były obsługiwane przez aplikację Wiadomości.

Nowa wersja dla systemu iOS 10— aplikacja Message zawiera teraz własną dedykowaną, wbudowaną aplikację App Store. Wszystkie aplikacje, które zawierają rozszerzenia usługi Message Apps, będą wyświetlane i promowane w tym sklepie. Nowa szuflada aplikacji wiadomości będzie wyświetlać wszystkie aplikacje, które zostały pobrane ze sklepu App Store wiadomości, aby zapewnić szybki dostęp do użytkowników.

Ponadto w systemie iOS 10 firma Apple dodała wbudowane przypisanie aplikacji, co umożliwia użytkownikowi łatwe odnajdywanie aplikacji. Jeśli na przykład jeden użytkownik wysyła zawartość do innej z aplikacji, której drugi użytkownik nie zainstalował (na przykład naklejkę), nazwa aplikacji wysyłającej jest wyświetlana w obszarze zawartości w historii komunikatów. Jeśli użytkownik naciągnie nazwę aplikacji, zostanie otwarty sklep Message App Store i aplikacja wybrana w sklepie.

Rozszerzenia aplikacji komunikatów są podobne do istniejących aplikacji systemu iOS, które deweloper zna tworzenie i będą miały dostęp do wszystkich standardowych struktur i funkcji standardowej aplikacji systemu iOS. Na przykład:

  • Mają dostęp do zakupu w aplikacji.
  • Mają dostęp do usługi Apple Pay.
  • Mają dostęp do sprzętu urządzenia, takiego jak Aparat.

Rozszerzenia aplikacji komunikatów są obsługiwane tylko w systemie iOS 10, jednak zawartość wysyłana przez te rozszerzenia jest widoczna na urządzeniach z systemem watchOS i macOS. Nowa strona Ostatnie dodane do systemu watchOS 3 będzie wyświetlać najnowsze naklejki, które zostały wysłane z telefonu, w tym z rozszerzeń aplikacji wiadomości i umożliwiają użytkownikowi wysyłanie tych naklejek z zegarka.

Informacje o strukturze komunikatów

Nowe w systemie iOS 10 platforma Messages udostępnia interfejs między rozszerzeniem aplikacji komunikatów i aplikacją Message na urządzeniu z systemem iOS użytkownika. Gdy użytkownik uruchamia aplikację z poziomu aplikacji Komunikaty, ta struktura umożliwia odnajdywanie aplikacji i udostępnia dane i kontekst wymagany do określenia interfejsu użytkownika.

Po uruchomieniu aplikacji użytkownik wchodzi z nią w interakcję, aby utworzyć nową zawartość do udostępnienia za pośrednictwem komunikatu. Następnie aplikacja używa platformy Messages do transferu nowo utworzonej zawartości do aplikacji Messages na potrzeby przetwarzania.

Struktura komunikatów i rozszerzenia aplikacji komunikatów są oparte na istniejących już technologiach rozszerzeń aplikacji systemu iOS. Aby uzyskać więcej informacji na temat rozszerzeń aplikacji, zobacz Przewodnik programowania rozszerzeń aplikacji firmy Apple.

W przeciwieństwie do innych punktów rozszerzenia udostępnianych przez firmę Apple w całym systemie deweloper nie musi udostępniać aplikacji hosta dla swoich rozszerzeń aplikacji komunikatów, ponieważ sama aplikacja Message działa jako kontener. Deweloper ma jednak możliwość dołączenia rozszerzenia aplikacji komunikatów wewnątrz nowej lub istniejącej aplikacji systemu iOS i wysłania jej wraz z pakietem.

Jeśli rozszerzenia aplikacji komunikatów są uwzględnione w pakiecie aplikacji systemu iOS, ikona aplikacji będzie wyświetlana zarówno na ekranie głównym urządzenia, jak i w szufladzie aplikacji komunikatów z poziomu aplikacji Wiadomości. Jeśli nie jest on uwzględniony w pakiecie aplikacji, rozszerzenie aplikacji komunikatów będzie wyświetlane tylko w szufladzie aplikacji komunikatów.

Nawet jeśli rozszerzenia aplikacji komunikatów nie są uwzględnione w pakiecie aplikacji hosta, deweloper będzie musiał podać ikonę aplikacji w pakiecie rozszerzenia aplikacji komunikatów, ponieważ jest to ikona, która będzie wyświetlana w innych częściach systemu, takich jak szuflada aplikacji komunikatów lub Ustawienia, dla rozszerzenia.

Informacje o naklejkach

Apple zaprojektowało naklejki jako nowy sposób, aby użytkownicy iMessage komunikowali się, umożliwiając wysyłanie naklejek w tekście jako wszelkie inne treści wiadomości lub mogą być dołączone do poprzednich bąbelków wiadomości wewnątrz konwersacji.

Co to są naklejki?

  • Są to obrazy zapewniane przez rozszerzenie aplikacji komunikatów.
  • Mogą być animowane lub statyczne obrazy.
  • Zapewniają one nowy sposób udostępniania zawartości obrazu z poziomu aplikacji.

Istnieją dwa sposoby tworzenia naklejek:

  1. Rozszerzenia aplikacji komunikatów pakietu naklejek można utworzyć z wnętrza programu Xcode bez dołączania kodu. Wszystko, co jest wymagane, to zasoby dla naklejek i ikon aplikacji.
  2. Tworząc standardowe rozszerzenie aplikacji komunikatów, które udostępnia naklejki z kodu za pośrednictwem platformy Messages.

Tworzenie pakietów naklejek

Pakiety naklejek są tworzone na podstawie specjalnego szablonu w środowisku Xcode i po prostu zapewniają statyczny zestaw zasobów obrazów, które mogą być używane jako naklejki. Jak wspomniano powyżej, nie wymagają żadnego kodu, deweloper po prostu przeciąga pliki obrazów do folderu Naklejki Pack wewnątrz katalogu elementów zawartości Naklejki.

Aby obraz został uwzględniony w pakiecie naklejki, musi spełniać następujące wymagania:

  • Obrazy muszą być w formacie PNG, APNG, GIF lub JPEG. Firma Apple sugeruje używanie tylko formatów PNG i APNG podczas dostarczania zasobów naklejki.
  • Animowane naklejki obsługują tylko formaty APNG i GIF.
  • Obrazy naklejek powinny zapewnić przezroczyste tło, ponieważ można je umieścić nad bąbelkami wiadomości w konwersacji przez użytkownika.
  • Pojedyncze pliki obrazów muszą być mniejsze niż 500 kb.
  • Obrazy nie mogą być mniejsze niż 100x100 punktów lub większe niż 206 x 206 punktów.

Ważne

Obrazy naklejki powinny być zawsze podawane w @3x rozdzielczości 300 x 300 do 618 x 618 pikseli. System automatycznie wygeneruje @2x wersje i @1x w czasie wykonywania zgodnie z wymaganiami.

Apple sugeruje testowanie zasobów obrazów naklejki na różnych kolorach tła (takich jak białe, czarne, czerwone, żółte i wielokolorowe) i na zdjęciach, aby zapewnić, że wyglądają najlepiej we wszystkich możliwych sytuacjach.

Pakiety naklejek mogą dostarczać naklejki w jednym z trzech dostępnych rozmiarów:

  • Mały - 100 x 100 punktów.
  • Średni - 136 x 136 punktów. Jest to domyślny rozmiar.
  • Duży — 206 x 206 punktów.

Użyj inspektora atrybutów Xcode, aby ustawić rozmiar całego pakietu naklejek i udostępnić tylko zasoby obrazów zgodne z żądanym rozmiarem, aby uzyskać najlepsze wyniki w przeglądarce naklejki wewnątrz aplikacji Wiadomości.

Aby uzyskać więcej informacji, zobacz Dokumentacja komunikatów firmy Apple.

Tworzenie niestandardowego środowiska naklejek

Jeśli aplikacja wymaga większej kontroli lub elastyczności niż jest dostarczana przez pakiet naklejek, może zawierać rozszerzenie aplikacji wiadomości i udostępnić naklejki za pośrednictwem platformy Wiadomości na potrzeby niestandardowego środowiska naklejek.

Jakie są zalety tworzenia niestandardowego środowiska naklejek?

  1. Umożliwia aplikacji dostosowanie sposobu wyświetlania naklejek użytkownikom aplikacji. Na przykład aby prezentować naklejki w formacie innym niż standardowy układ siatki lub na innym kolorowym tle.
  2. Umożliwia dynamiczne tworzenie naklejek na podstawie kodu zamiast dołączania ich jako zasobów obrazów statycznych.
  3. Umożliwia dynamiczne pobieranie zasobów obrazu naklejki z serwera internetowego dewelopera bez konieczności wydawania nowej wersji do sklepu App Store.
  4. Umożliwia dostęp do aparatu urządzenia w celu utworzenia naklejki na bieżąco.
  5. Umożliwia zakup w aplikacji, dzięki czemu użytkownik może zakupić więcej naklejek w aplikacji.

Aby utworzyć środowisko niestandardowej naklejki, wykonaj następujące czynności:

  1. Uruchom Visual Studio dla komputerów Mac.

  2. Otwórz rozwiązanie, aby dodać rozszerzenie aplikacji komunikatów do.

  3. Wybierz pozycję IOS Extensions iMessage Extensions>(Rozszerzenia systemu iOS>) i kliknij przycisk Next (Dalej):

    Wybierz rozszerzenie iMessage

  4. Wprowadź nazwę rozszerzenia i kliknij przycisk Dalej:

    Wprowadź nazwę rozszerzenia

  5. Kliknij przycisk Utwórz, aby skompilować rozszerzenie:

    Kliknij przycisk Utwórz

Domyślnie MessagesViewController.cs plik zostanie dodany do rozwiązania. Jest to główny punkt wejścia do rozszerzenia i dziedziczy z MSMessageAppViewController klasy .

Platforma Messages udostępnia klasy do prezentowania dostępnych naklejek użytkownikowi:

  • MSStickerBrowserViewController - Steruje widokiem, w który będą wyświetlane naklejki. Jest on również zgodny z interfejsem IMSStickerBrowserViewDataSource , aby zwrócić liczbę naklejek i naklejkę dla danego indeksu przeglądarki.
  • MSStickerBrowserView - Jest to widok, w który będą wyświetlane dostępne naklejki.
  • MSStickerSize - Decyduje o rozmiarach poszczególnych komórek siatki naklejki przedstawionych w widoku przeglądarki.

Tworzenie niestandardowej przeglądarki naklejek

Deweloper może dodatkowo dostosować środowisko naklejek dla użytkownika, udostępniając niestandardową przeglądarkę naklejek (MSMessageAppBrowserViewController) w rozszerzeniu aplikacji wiadomości. Przeglądarka naklejek niestandardowych zmienia sposób prezentowania naklejki użytkownikowi po wybraniu naklejki do uwzględnienia w strumieniu komunikatów.

Należy wykonać następujące czynności:

  1. W okienku rozwiązania kliknij prawym przyciskiem myszy nazwę projektu rozszerzenia i wybierz polecenie Dodaj>nowy plik...>iOS | Kontroler interfejsu zegarka Apple Watch>.

  2. Wprowadź StickerBrowserViewController nazwę i kliknij przycisk Nowy:

    Wprowadź ciąg StickerBrowserViewController jako nazwę

  3. StickerBrowserViewController.cs Otwórz plik do edycji.

Ustaw wygląd StickerBrowserViewController.cs w następujący sposób:

using System;
using System.Collections.Generic;
using UIKit;
using Messages;
using Foundation;

namespace MonkeyStickers
{
    public partial class StickerBrowserViewController : MSStickerBrowserViewController
    {
        #region Computed Properties
        public List<MSSticker> Stickers { get; set; } = new List<MSSticker> ();
        #endregion

        #region Constructors
        public StickerBrowserViewController (MSStickerSize stickerSize) : base (stickerSize)
        {
        }
        #endregion

        #region Private Methods
        private void CreateSticker (string assetName, string localizedDescription)
        {

            // Get path to asset
            var path = NSBundle.MainBundle.PathForResource (assetName, "png");
            if (path == null) {
                Console.WriteLine ("Couldn't create sticker {0}.", assetName);
                return;
            }

            // Build new sticker
            var stickerURL = new NSUrl (path);
            NSError error = null;
            var sticker = new MSSticker (stickerURL, localizedDescription, out error);
            if (error == null) {
                // Add to collection
                Stickers.Add (sticker);
            } else {
                // Report error
                Console.WriteLine ("Error, couldn't create sticker {0}: {1}", assetName, error);
            }
        }

        private void LoadStickers ()
        {

            // Load sticker assets from disk
            CreateSticker ("canada", "Canada Sticker");
            CreateSticker ("clouds", "Clouds Sticker");
            ...
            CreateSticker ("tree", "Tree Sticker");
        }
        #endregion

        #region Public Methods
        public void ChangeBackgroundColor (UIColor color)
        {
            StickerBrowserView.BackgroundColor = color;

        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Initialize
            LoadStickers ();
        }

        public override nint GetNumberOfStickers (MSStickerBrowserView stickerBrowserView)
        {
            return Stickers.Count;
        }

        public override MSSticker GetSticker (MSStickerBrowserView stickerBrowserView, nint index)
        {
            return Stickers[(int)index];
        }
        #endregion
    }
}

Przyjrzyj się szczegółowo powyższej kodzie. Tworzy magazyn dla naklejek zapewnianych przez rozszerzenie:

public List<MSSticker> Stickers { get; set; } = new List<MSSticker> ();

I zastępuje dwie metody MSStickerBrowserViewController klasy w celu udostępnienia danych przeglądarki z tego magazynu danych:

public override nint GetNumberOfStickers (MSStickerBrowserView stickerBrowserView)
{
    return Stickers.Count;
}

public override MSSticker GetSticker (MSStickerBrowserView stickerBrowserView, nint index)
{
    return Stickers[(int)index];
}

Metoda CreateSticker pobiera ścieżkę zasobu obrazu z pakietu rozszerzenia i używa go do utworzenia nowego wystąpienia MSSticker elementu zawartości z tego zasobu, które dodaje do kolekcji:

private void CreateSticker (string assetName, string localizedDescription)
{

    // Get path to asset
    var path = NSBundle.MainBundle.PathForResource (assetName, "png");
    if (path == null) {
        Console.WriteLine ("Couldn't create sticker {0}.", assetName);
        return;
    }

    // Build new sticker
    var stickerURL = new NSUrl (path);
    NSError error = null;
    var sticker = new MSSticker (stickerURL, localizedDescription, out error);
    if (error == null) {
        // Add to collection
        Stickers.Add (sticker);
    } else {
        // Report error
        Console.WriteLine ("Error, couldn't create sticker {0}: {1}", assetName, error);
    }
}

Metoda LoadSticker jest wywoływana z ViewDidLoad , aby utworzyć naklejkę z nazwanego elementu zawartości obrazu (dołączonego do pakietu aplikacji) i dodać ją do kolekcji naklejek.

Aby zaimplementować niestandardową przeglądarkę naklejek, zmodyfikuj MessagesViewController.cs plik i wprowadź go w następujący sposób:

using System;
using UIKit;
using Messages;

namespace MonkeyStickers
{
    public partial class MessagesViewController : MSMessagesAppViewController
    {
        #region Computed Properties
        public StickerBrowserViewController BrowserViewController { get; set;}
        #endregion

        #region Constructors
        protected ViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Create new browser and configure it
            BrowserViewController = new StickerBrowserViewController (MSStickerSize.Regular);
            BrowserViewController.View.Frame = View.Frame;
            BrowserViewController.ChangeBackgroundColor (UIColor.Gray);

            // Add to view
            AddChildViewController (BrowserViewController);
            BrowserViewController.DidMoveToParentViewController (this);
            View.AddSubview (BrowserViewController.View);
        }
        #endregion
    }
}

Przyjrzyjmy się szczegółowo temu kodowi, który tworzy magazyn dla przeglądarki niestandardowej:

public StickerBrowserViewController BrowserViewController { get; set;}

W metodzie ViewDidLoad tworzy wystąpienie i konfiguruje nową przeglądarkę:

// Create new browser and configure it
BrowserViewController = new StickerBrowserViewController (MSStickerSize.Regular);
BrowserViewController.View.Frame = View.Frame;
BrowserViewController.ChangeBackgroundColor (UIColor.Gray);

Następnie dodaje przeglądarkę do widoku, aby go wyświetlić:

// Add to view
AddChildViewController (BrowserViewController);
BrowserViewController.DidMoveToParentViewController (this);
View.AddSubview (BrowserViewController.View);

Dalsze dostosowywanie naklejek

Dalsze dostosowywanie naklejek jest możliwe, włączając tylko dwie klasy w rozszerzeniu aplikacji komunikatów:

  • MSStickerView
  • MSSticker

Za pomocą powyższych metod rozszerzenie może obsługiwać wybór naklejek, który nie opiera się na standardowej metodzie Browser Naklejki. Ponadto wyświetlacz naklejki można przełączać między dwoma różnymi trybami wyświetlania:

  • Kompaktowanie — jest to tryb domyślny, w którym widok naklejek zajmuje dolne 25% widoku komunikatów.
  • Rozwinięte — widok naklejek wypełnia cały widok komunikatów.

Ten widok naklejek można przełączać między tymi trybami programowo lub ręcznie przez użytkownika.

Zapoznaj się z poniższym przykładem obsługi przełącznika między dwoma różnymi trybami wyświetlania. Dla każdego stanu będą wymagane dwa różne kontrolery widoku. Uchwyty StickerBrowserViewController widoku Compact i wyglądają następująco:

using System;
using System.Collections.Generic;
using UIKit;
using Messages;
using Foundation;

namespace MessageExtension
{
    public partial class StickerBrowserViewController : MSStickerBrowserViewController
    {
        #region Computed Properties
        public MessagesViewController MessagesAppViewController { get; set; }
        public List<MSSticker> Stickers { get; set; } = new List<MSSticker> ();
        #endregion

        #region Constructors
        public StickerBrowserViewController (MessagesViewController messagesAppViewController, MSStickerSize stickerSize) : base (stickerSize)
        {
            // Initialize
            this.MessagesAppViewController = messagesAppViewController;
        }
        #endregion

        #region Private Methods
        private void CreateSticker (string assetName, string localizedDescription)
        {

            // Get path to asset
            var path = NSBundle.MainBundle.PathForResource (assetName, "png");
            if (path == null) {
                Console.WriteLine ("Couldn't create sticker {0}.", assetName);
                return;
            }

            // Build new sticker
            var stickerURL = new NSUrl (path);
            NSError error = null;
            var sticker = new MSSticker (stickerURL, localizedDescription, out error);
            if (error == null) {
                // Add to collection
                Stickers.Add (sticker);
            } else {
                // Report error
                Console.WriteLine ("Error, couldn't create sticker {0}: {1}", assetName, error);
            }
        }

        private void LoadStickers ()
        {

            // Load sticker assets from disk
            CreateSticker ("add", "Add New Sticker");
            CreateSticker ("canada", "Canada Sticker");
            CreateSticker ("clouds", "Clouds Sticker");
            CreateSticker ("tree", "Tree Sticker");
        }
        #endregion

        #region Public Methods
        public void ChangeBackgroundColor (UIColor color)
        {
            StickerBrowserView.BackgroundColor = color;

        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Initialize
            LoadStickers ();

        }

        public override nint GetNumberOfStickers (MSStickerBrowserView stickerBrowserView)
        {
            return Stickers.Count;
        }

        public override MSSticker GetSticker (MSStickerBrowserView stickerBrowserView, nint index)
        {
            // Wanting to add a new sticker?
            if (index == 0) {
                // Yes, ask controller to present add sticker interface
                MessagesAppViewController.AddNewSticker ();
                return null;
            } else {
                // No, return existing sticker
                return Stickers [(int)index];
            }
        }
        #endregion
    }
}

Funkcja AddStickerViewController będzie obsługiwać widok rozwiniętej naklejki i wygląda następująco:

using System;
using Foundation;
using UIKit;
using Messages;

namespace MessageExtension
{
    public class AddStickerViewController : UIViewController
    {
        #region Computed Properties
        public MessagesViewController MessagesAppViewController { get; set;}
        public MSSticker NewSticker { get; set;}
        #endregion

        #region Constructors
        public AddStickerViewController (MessagesViewController messagesAppViewController)
        {
            // Initialize
            this.MessagesAppViewController = messagesAppViewController;
        }
        #endregion

        #region Override Method
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Build interface to create new sticker
            var cancelButton = new UIButton (UIButtonType.RoundedRect);
            cancelButton.TouchDown += (sender, e) => {
                // Cancel add new sticker
                MessagesAppViewController.CancelAddNewSticker ();
            };
            View.AddSubview (cancelButton);

            var doneButton = new UIButton (UIButtonType.RoundedRect);
            doneButton.TouchDown += (sender, e) => {
                // Add new sticker to collection
                MessagesAppViewController.AddStickerToCollection (NewSticker);
            };
            View.AddSubview (doneButton);

            ...
        }
        #endregion
    }
}

Implementuje MessageViewController te kontrolery widoku w celu napędzania żądanego stanu:

using System;
using UIKit;
using Messages;

namespace MessageExtension
{
    public partial class MessagesViewController : MSMessagesAppViewController
    {
        #region Computed Properties
        public bool IsAddingSticker { get; set;}
        public StickerBrowserViewController BrowserViewController { get; set; }
        public AddStickerViewController AddStickerController { get; set;}
        #endregion

        #region Constructors
        protected MessagesViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Public Methods
        public void PresentStickerBrowser ()
        {
            // Is the Add sticker view being displayed?
            if (IsAddingSticker) {
                // Yes, remove it from view
                AddStickerController.RemoveFromParentViewController ();
                AddStickerController.View.RemoveFromSuperview ();
            }

            // Add to view
            AddChildViewController (BrowserViewController);
            BrowserViewController.DidMoveToParentViewController (this);
            View.AddSubview (BrowserViewController.View);

            // Save mode
            IsAddingSticker = false;
        }

        public void PresentAddSticker ()
        {
            // Is the sticker browser being displayed?
            if (!IsAddingSticker) {
                // Yes, remove it from view
                BrowserViewController.RemoveFromParentViewController ();
                BrowserViewController.View.RemoveFromSuperview ();
            }

            // Add to view
            AddChildViewController (AddStickerController);
            AddStickerController.DidMoveToParentViewController (this);
            View.AddSubview (AddStickerController.View);

            // Save mode
            IsAddingSticker = true;
        }

        public void AddNewSticker ()
        {
            // Switch to expanded view mode
            Request (MSMessagesAppPresentationStyle.Expanded);
        }

        public void CancelAddNewSticker ()
        {
            // Switch to compact view mode
            Request (MSMessagesAppPresentationStyle.Compact);
        }

        public void AddStickerToCollection (MSSticker sticker)
        {
            // Add sticker to collection
            BrowserViewController.Stickers.Add (sticker);

            // Switch to compact view mode
            Request (MSMessagesAppPresentationStyle.Compact);
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Create new browser and configure it
            BrowserViewController = new StickerBrowserViewController (this, MSStickerSize.Regular);
            BrowserViewController.View.Frame = View.Frame;
            BrowserViewController.ChangeBackgroundColor (UIColor.Gray);

            // Create new Add controller and configure it as well
            AddStickerController = new AddStickerViewController (this);
            AddStickerController.View.Frame = View.Frame;

            // Initially present the sticker browser
            PresentStickerBrowser ();
        }

        public override void DidTransition (MSMessagesAppPresentationStyle presentationStyle)
        {
            base.DidTransition (presentationStyle);

            // Take action based on style
            switch (presentationStyle) {
            case MSMessagesAppPresentationStyle.Compact:
                PresentStickerBrowser ();
                break;
            case MSMessagesAppPresentationStyle.Expanded:
                PresentAddSticker ();
                break;
            }
        }
        #endregion
    }
}

Gdy użytkownik zażąda dodania nowej naklejki do swojej dostępnej kolekcji, zostanie AddStickerViewController wyświetlony kontroler, a widok naklejki wprowadza widok Rozwinięte :

// Switch to expanded view mode
Request (MSMessagesAppPresentationStyle.Expanded);

Gdy użytkownik wybierze naklejkę do dodania, zostanie ona dodana do dostępnej kolekcji, a widok Compact zostanie wyświetlony:

public void AddStickerToCollection (MSSticker sticker)
{
    // Add sticker to collection
    BrowserViewController.Stickers.Add (sticker);

    // Switch to compact view mode
    Request (MSMessagesAppPresentationStyle.Compact);
}

Metoda DidTransition jest zastępowana do obsługi przełączania między dwoma trybami:

public override void DidTransition (MSMessagesAppPresentationStyle presentationStyle)
{
    base.DidTransition (presentationStyle);

    // Take action based on style
    switch (presentationStyle) {
    case MSMessagesAppPresentationStyle.Compact:
        PresentStickerBrowser ();
        break;
    case MSMessagesAppPresentationStyle.Expanded:
        PresentAddSticker ();
        break;
    }
}

Podsumowanie

W tym artykule opisano rozszerzenie aplikacji komunikatów w rozwiązaniu Xamarin.iOS, które integruje się z aplikacją Messages i prezentuje nowe funkcje dla użytkownika. Omówiono go za pomocą rozszerzenia do wysyłania tekstu, naklejek, plików multimedialnych i interaktywnych wiadomości.