Conceptos básicos de la extensión de aplicación de mensajes en Xamarin.iOS

En este artículo se muestra cómo incluir una extensión de aplicación de mensajes en una solución de Xamarin.iOS que se integra con la aplicación Mensajes, y se presenta nueva funcionalidad al usuario.

Novedad de iOS 10, una extensión de aplicación de mensajes se integra con la aplicación Messages y presenta nuevas funcionalidades al usuario. La extensión puede enviar texto, pegatinas, archivos multimedia y mensajes interactivos.

Extensiones avanzadas de la aplicación Messages

Como se indicó anteriormente, una extensión de la aplicación Messages se integra con la aplicación Messages y presenta nuevas funcionalidades al usuario. La extensión puede enviar texto, pegatinas, archivos multimedia y mensajes interactivos. Hay dos tipos de extensión de la aplicación Messages disponibles:

  • Paquetes de pegatinas: contiene una colección de pegatinas que el usuario puede agregar a un mensaje. Los paquetes de pegatinas se pueden crear sin escribir ningún código.
  • Aplicación iMessage: puede presentar una interfaz de usuario personalizada dentro de la aplicación Messages para seleccionar pegatinas, escribir texto, incluidos archivos multimedia (con conversiones de tipos opcionales) y crear, editar y enviar mensajes de interacción.

Las extensiones de aplicaciones de mensajes proporcionan tres tipos de contenido principales:

  • Mensajes interactivos: son un tipo de contenido de mensaje personalizado que genera una aplicación, cuando el usuario pulsa el mensaje, la aplicación se iniciará en primer plano.
  • Pegatinas: son imágenes generadas por la aplicación que se pueden incluir en los mensajes enviados entre los usuarios.
  • Otro contenido compatible: la aplicación puede proporcionar contenido, como fotos, vídeos, texto o vínculos a cualquier otro tipo de contenido que siempre haya sido compatible con la aplicación Messages.

Como novedad de iOS 10, la aplicación Messages ahora incluye su propia tienda de aplicaciones integrada dedicada. Las aplicaciones que incluyan extensiones de aplicaciones de mensajes se mostrarán y promocionarán en esta tienda. El nuevo cajón de aplicaciones de mensajes mostrará todas las aplicaciones que se hayan descargado desde el almacén de aplicaciones de mensajes para proporcionar acceso rápido a los usuarios.

También como novedad de iOS 10, Apple ha agregado atribución de aplicaciones insertadas, lo que permite al usuario detectar fácilmente una aplicación. Por ejemplo, si un usuario envía contenido a otro desde una aplicación que el segundo usuario no tiene instalado (como, por ejemplo, una pegatina), el nombre de la aplicación de envío aparece en el contenido del historial de mensajes. Si el usuario pulsa el nombre de la aplicación, se abrirá el almacén de aplicaciones de mensajes y la aplicación seleccionada en la tienda.

Las extensiones de aplicaciones de mensajes son similares a las aplicaciones iOS existentes con cuya creación ya está familiarizado el desarrollador, el cual tendrá acceso a todos los marcos y características estándar de una aplicación iOS estándar. Por ejemplo:

  • Tienen acceso a la compra desde la aplicación.
  • Tienen acceso a Apple Pay.
  • Tienen acceso al hardware del dispositivo, como la cámara.

Las extensiones de aplicaciones de mensajes solo se admiten en iOS 10, pero el contenido que estas extensiones envían son visibles en dispositivos watchOS y macOS. La nueva Página de recientes agregada a watchOS 3, mostrará pegatinas recientes que se han enviado desde el teléfono, incluidas las de extensiones de aplicaciones de mensajes, y permitirá al usuario enviar esas pegatinas desde el reloj.

Acerca del marco Messages

El marco Messages, nuevo en iOS 10, proporciona la interfaz entre la extensión de aplicación de mensajes y la aplicación Message del dispositivo iOS del usuario. Cuando el usuario inicia una aplicación desde la aplicación Messages, este marco permite que la aplicación se detecte y proporciona los datos y el contexto necesarios para diseñar su interfaz de usuario.

Una vez iniciada la aplicación, el usuario interactúa con ella para crear contenido nuevo que se compartirá a través de un mensaje. A continuación, la aplicación usa el marco Messages para transferir el contenido recién creado a la aplicación Messages y procesarlo.

El marco Messages y las extensiones de aplicaciones de mensajes se basan en las tecnologías de extensiones de aplicaciones de iOS ya existentes. Para más información sobre las extensiones de aplicación, consulte la Guía de programación de extensiones de aplicaciones de Apple.

A diferencia de otros puntos de extensión que Apple ha proporcionado en todo el sistema, el desarrollador no necesita proporcionar una aplicación host para sus extensiones de aplicaciones de mensajes, ya que la propia aplicación Messages actúa como contenedor. Sin embargo, el desarrollador tiene la opción de incluir la extensión de aplicaciones de mensajes dentro de una aplicación iOS nueva o existente y enviarla junto con el lote de aplicaciones.

Si las extensiones de aplicaciones de mensajes se incluyen en el lote de una aplicación de iOS, el icono de la aplicación se mostrará en la pantalla principal del dispositivo y en el cajón de aplicaciones de mensajes desde la aplicación Messages. Si no se incluye en un lote de aplicaciones, la extensión de aplicaciones de mensajes solo se mostrará en el cajón de aplicaciones de mensajes.

Incluso si las extensiones de aplicaciones de mensajes no se incluyen en un lote de aplicaciones host, el desarrollador deberá proporcionar un icono de aplicación en el lote de la extensión de aplicaciones de mensajes, ya que este es el icono que se mostrará en otras partes del sistema, como el cajón de aplicaciones de mensajes o la configuración, para la extensión.

Acerca de las pegatinas

Apple diseñó las pegatinas como una nueva forma de comunicación para los usuarios de iMessage, al permitir que se envíen insertadas como cualquier otro contenido de mensaje o se puedan adjuntar a burbujas de mensajes anteriores dentro de la conversación.

¿Qué son las pegatinas?

  • Son imágenes que proporciona la extensión de aplicaciones de mensajes.
  • Pueden ser imágenes animadas o estáticas.
  • Proporcionan una nueva manera de compartir contenido de imágenes dentro de una aplicación.

Hay dos maneras de crear pegatinas:

  1. Se puede crear una extensión de aplicaciones de mensajes con un paquete de pegatinas desde dentro de Xcode sin incluir código alguno. Todo lo que hace falta son los recursos de las pegatinas y los iconos de la aplicación.
  2. Mediante la creación de una extensión de aplicaciones de mensajes estándar que proporciona pegatinas por medio de código a través del marco Messages.

Creación de paquetes de pegatinas

Los paquetes de pegatinas se crean a partir de una plantilla especial dentro de Xcode y simplemente proporcionan un conjunto estático de recursos de imagen que se pueden usar como pegatinas. Como se indicó anteriormente, no requieren ningún código; el desarrollador simplemente arrastra archivos de imagen a la carpeta Sticker Pack dentro de Stickers Asset Catalog.

Para que una imagen se incluya en un paquete de pegatinas, debe cumplir los siguientes requisitos:

  • Debe estar en formato PNG, APNG, GIF o JPEG. Apple sugiere usar solo los formatos PNG y APNG al proporcionar recursos de pegatinas.
  • Las pegatinas animadas solo admiten los formatos APNG y GIF.
  • Las imágenes de pegatinas deben proporcionar un fondo transparente, de modo que se puedan colocar sobre las burbujas de mensajes de la conversación.
  • Cada archivo de imagen debe tener menos de 500 KB.
  • Las imágenes no pueden tener menos de 100x100 puntos ni más de 206x206 puntos.

Importante

Las imágenes de pegatinas siempre deben proporcionarse con una resolución de @3x en el intervalo de 300x300 a 618x618 píxeles. El sistema generará automáticamente las versiones @2x y @1x en tiempo de ejecución según sea necesario.

Apple sugiere probar los recursos de imágenes de pegatinas sobre varios fondos de distintos colores (como blanco, negro, rojo, amarillo y multicolor) y sobre fotos, para tener la seguridad de que se ven lo mejor posible en todas las situaciones.

Los paquetes de pegatinas pueden proporcionar pegatinas en uno de tres tamaños disponibles:

  • Pequeño: 100x100 puntos.
  • Medio: 136x136 puntos. Este es el tamaño predeterminado.
  • Grande: 206x206 puntos.

Para obtener los mejores resultados en el Explorador de pegatinas dentro de la aplicación Messages, use el Inspector de atributos de Xcode para establecer el tamaño de todo el paquete de pegatinas y proporcionar solo recursos de imagen que coincidan con el tamaño solicitado.

Para más información, consulte la referencia de mensajes de Apple.

Creación de una experiencia de pegatinas personalizada

Si la aplicación requiere un control o una flexibilidad mayores que los que proporciona un paquete de pegatinas, puede incluir una extensión de aplicación de mensajes y proporcionar las pegatinas a través del marco Messages para una experiencia de pegatinas personalizada.

¿Cuáles son las ventajas de crear una experiencia de pegatinas personalizada?

  1. Permite a la aplicación personalizar cómo se muestran las pegatinas a los usuarios de la aplicación. Por ejemplo, para presentar las pegatinas en un formato distinto al diseño de cuadrícula estándar o sobre otro color de fondo.
  2. Permite que las pegatinas se creen dinámicamente mediante código en lugar de incluirse como recursos de imágenes estáticas.
  3. Permite descargar dinámicamente los recursos de imágenes de pegatinas desde el servidor web del desarrollador sin tener que publicar una nueva versión en App Store.
  4. Permite el acceso de la cámara del dispositivo para crear pegatinas sobre la marcha.
  5. Permite compras dentro de la aplicación para que el usuario pueda comprar más pegatinas dentro de la aplicación.

Para crear una experiencia de pegatinas personalizada, haga lo siguiente:

  1. Inicie Visual Studio para Mac:

  2. Abra la solución a la que desea agregar una extensión de aplicación de mensajes.

  3. Seleccione iOS>Extensiones>Extensión de iMessage y haga clic en el botón Siguiente:

    Seleccionar extensión de iMessage

  4. Escriba un nombre de extensión y haga clic en el botón Siguiente:

    Escriba un nombre de extensión

  5. Haga clic en el botón Crear para compilar la extensión:

    Haga clic en el botón Crear.

De forma predeterminada, el archivo MessagesViewController.cs se agregará a la solución. Este es el punto de entrada principal a la extensión y hereda de la clase MSMessageAppViewController.

El marco Messages proporciona clases para presentar al usuario las pegatinas disponibles:

  • MSStickerBrowserViewController: controla la vista en la que se presentarán las pegatinas. Además, se ajusta a la interfaz IMSStickerBrowserViewDataSource para devolver el recuento de pegatinas y la pegatina para un índice de explorador determinado.
  • MSStickerBrowserView: esta es la vista en la que se mostrarán las pegatinas disponibles.
  • MSStickerSize: decide los tamaños de celda individuales para la cuadrícula de pegatinas presentadas en la vista del explorador.

Creación de un explorador de pegatinas personalizado

El desarrollador puede personalizar aún más la experiencia de pegatinas para el usuario proporcionando un explorador de pegatinas personalizado (MSMessageAppBrowserViewController) en la extensión de la aplicación de mensajes. El explorador de pegatinas personalizado cambia el modo en que se presentan las pegatinas al usuario al seleccionar una pegatina para incluirla en la secuencia de mensajes.

Haga lo siguiente:

  1. En el Panel de solución, haga clic con el botón derecho en el nombre del proyecto de la extensión y seleccione Agregar>Nuevo archivo...>iOS | Apple Watch>Controlador de la interfaz.

  2. Escriba StickerBrowserViewController en Nombre y haga clic en el botón Nuevo:

    Escriba StickerBrowserViewController para el Nombre

  3. Abra el archivo StickerBrowserViewController.cs para edición.

Edite el elemento StickerBrowserViewController.cs para que quede de la siguiente manera:

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

Mire detenidamente el código anterior. Se crea almacenamiento para las pegatinas que proporciona la extensión:

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

Y se invalidan dos métodos de la clase MSStickerBrowserViewController para proporcionar datos al explorador desde este almacén de datos:

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

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

El método CreateSticker obtiene la ruta de acceso de un recurso de imagen del lote de la extensión y la usa para crear una nueva instancia de MSSticker a partir de este recurso, que agrega a la colección:

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

Para crear una pegatina a partir del recurso de imagen con nombre (incluido en el lote de la aplicación) y agregarla a la colección de pegatinas, se llama al método LoadSticker desde ViewDidLoad.

Para implementar el explorador de pegatinas personalizado, edite el archivo MessagesViewController.cs para que quede de la siguiente manera:

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

Al mirar detenidamente este código, vemos que se ha creado almacenamiento para el explorador personalizado:

public StickerBrowserViewController BrowserViewController { get; set;}

Y en el método ViewDidLoad, se crea una instancia de un nuevo explorador y se configura este:

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

A continuación, se agrega el explorador a la vista para mostrarlo:

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

Personalización adicional de pegatinas

Se pueden personalizar más las pegatinas incluyendo solo dos clases en la extensión de la aplicación de mensajes:

  • MSStickerView
  • MSSticker

Con los métodos anteriores, la extensión puede admitir la selección de pegatinas que no se basa en el método estándar Sticker Browser. Además, la pantalla de pegatinas se puede cambiar entre dos modos de vista diferentes:

  • Compacta: es el modo predeterminado en el que la vista de pegatinas ocupa el 25 % inferior de la vista de mensajes.
  • Expandida: la vista de pegatinas llena toda la vista de mensajes.

Esta vista de pegatinas se puede cambiar entre estos modos mediante programación o el usuario puede hacerlo manualmente.

Eche un vistazo al siguiente ejemplo de control del cambio entre los dos modos de vista diferentes. Se requerirán dos controladores de vista diferentes para cada estado. StickerBrowserViewController controla la vista Compacta y tiene el siguiente aspecto:

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

AddStickerViewController controla la vista de pegatinas Expandida y tiene el siguiente aspecto:

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

MessageViewController implementa estos controladores de vista para controlar el estado solicitado:

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

Cuando el usuario solicita agregar una nueva pegatina a su colección disponible, un nuevo controlador AddStickerViewController se convierte en el controlador visible y la vista de pegatinas entra en la vista Expandida:

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

Cuando el usuario elige una pegatina para agregar, se agrega a su colección disponible y se solicita la vista Compacta:

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

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

El método DidTransition se invalida para controlar el cambio entre los dos modos:

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

Resumen

En este artículo se ha mostrado cómo incluir una extensión de aplicación de mensajes en una solución de Xamarin.iOS que se integra con la aplicación Messages, y se ha presentado nueva funcionalidad al usuario. Se ha visto cómo usar la extensión para enviar texto, pegatinas, archivos multimedia y mensajes interactivos.