Aracılığıyla paylaş


Xamarin.iOS'ta İleti Uygulaması UzantısıNın Temelleri

Bu makalede, İletiler uygulamasıyla tümleşen ve kullanıcıya yeni işlevler sunan bir Xamarin.iOS çözümüne İleti Uygulaması Uzantısının nasıl dahil olduğu gösterilir.

iOS 10'da yeni olan İleti Uygulaması Uzantısı, İletiler uygulamasıyla tümleşir ve kullanıcıya yeni işlevler sunar. Uzantı metin, çıkartma, medya dosyaları ve etkileşimli iletiler gönderebilir.

İleti Uygulaması Uzantıları Hakkında

Yukarıda belirtildiği gibi, İleti Uygulaması Uzantısı İletiler uygulamasıyla tümleşir ve kullanıcıya yeni işlevler sunar. Uzantı metin, çıkartma, medya dosyaları ve etkileşimli iletiler gönderebilir. İki tür İleti Uygulaması Uzantısı kullanılabilir:

  • Çıkartma Paketleri - Kullanıcının iletiye ekleyebileceği bir çıkartma koleksiyonu içerir. Çıkartma Paketleri herhangi bir kod yazmadan oluşturulabilir.
  • iMessage Uygulaması - Etiketler seçmek, medya dosyaları (isteğe bağlı tür dönüştürmeleri ile) dahil olmak üzere metin girmek ve etkileşim iletileri oluşturmak, düzenlemek ve göndermek için İletiler uygulamasında özel bir Kullanıcı Arabirimi sunabilir.

İleti Uygulamaları Uzantıları üç ana içerik türü sağlar:

  • Etkileşimli İletiler - Bir uygulamanın oluşturduğu özel ileti içeriği türüdür; kullanıcı iletiye dokunduğunda uygulama ön planda başlatılır.
  • Çıkartmalar - Uygulama tarafından oluşturulan ve kullanıcılar arasında gönderilen iletilere dahil edilebilen görüntülerdir.
  • Diğer Desteklenen İçerik - Uygulama fotoğraflar, videolar, metinler veya mesajlar uygulaması tarafından her zaman desteklenen diğer içerik türlerine bağlantılar gibi içerik sağlayabilir.

iOS 10'da yeni olan İleti uygulaması artık kendi ayrılmış, yerleşik App Store'unu içeriyor. Message Apps Uzantılarını içeren tüm uygulamalar bu mağazada görüntülenir ve yükseltilir. Yeni İletiler Uygulama Çekmecesi, kullanıcılara hızlı erişim sağlamak için İletiler Uygulama Mağazası'ndan indirilmiş tüm uygulamaları görüntüler.

iOS 10'da da yeni olan Apple, kullanıcının bir uygulamayı kolayca keşfetmesini sağlayan Satır içi Uygulama İlişkilendirmesi'ni ekledi. Örneğin, bir kullanıcı 2. kullanıcının yüklemediği bir uygulamadan diğerine içerik gönderirse (örneğin bir etiket gibi), gönderen uygulamanın adı ileti geçmişindeki içeriğin altında listelenir. Kullanıcı uygulamanın adına, İleti Uygulaması Mağazası'na dokunursa açılırız ve uygulama mağazada seçilir.

İleti Uygulamaları Uzantıları, geliştiricinin oluşturmaya aşina olduğu mevcut iOS uygulamalarına benzer ve standart bir iOS uygulamasının tüm standart çerçevelerine ve özelliklerine erişebilir. Örneğin:

  • Uygulama İçi Satın Alma'ya erişebilirler.
  • Apple Pay'e erişimleri vardır.
  • Kamera gibi cihaz donanımına erişebilirler.

İleti Uygulamaları Uzantıları yalnızca iOS 10'da desteklenir, ancak bu Uzantıların gönderdiği içerik watchOS ve macOS cihazlarında görüntülenebilir. watchOS 3'e eklenen yeni Son Kullanılanlar Sayfası , Message Apps Uzantıları'ndan gelenler de dahil olmak üzere telefondan gönderilen son çıkartmaları görüntüleyecek ve kullanıcının bu çıkartmaları saatten göndermesine izin verecek.

İletiler Çerçevesi hakkında

iOS 10'da yeni olan İletiler çerçevesi, kullanıcının iOS cihazında İleti Uygulamaları Uzantısı ile İleti uygulaması arasındaki arabirimi sağlar. Kullanıcı İletiler uygulamasının içinden bir Uygulama başlattığında, bu çerçeve uygulamanın bulunmasına izin verir ve kullanıcı arabirimini ayarlamak için gereken verileri ve bağlamı sağlar.

Uygulama başlatıldıktan sonra kullanıcı, ileti aracılığıyla paylaşmak üzere yeni içerik oluşturmak için uygulamayla etkileşim kurar. Daha sonra uygulama, yeni oluşturulan içeriği işlemek üzere İletiler uygulamasına aktarmak için İletiler çerçevesini kullanır.

İletiler çerçevesi ve İleti Uygulamaları Uzantıları, önceden var olan iOS Uygulama Uzantıları teknolojilerinin üzerine kurulmuştur. Uygulama Uzantıları hakkında daha fazla bilgi için lütfen Apple'ın Uygulama Uzantısı Programlama Kılavuzu'na bakın.

Apple'ın sistem genelinde sağladığı diğer Uzantı Noktalarından farklı olarak, İleti uygulamasının kendisi kapsayıcı olarak görev yaptığı için geliştiricinin Message Apps Uzantıları için bir konak uygulaması sağlaması gerekmez. Ancak geliştirici, message apps uzantısını yeni veya mevcut bir iOS uygulamasının içine ekleme ve paketle birlikte gönderme seçeneğine sahiptir.

İleti Uygulamaları Uzantıları bir iOS uygulamasının paketine eklenmişse, uygulamanın simgesi hem cihazın giriş ekranında hem de İletiler uygulamasının içinden İleti Uygulaması Çekmecesi'nde görüntülenir. Bir uygulama paketine dahil değilse, İleti Uygulamaları Uzantısı yalnızca İleti Uygulaması Çekmecesi'nde görüntülenir.

İleti Uygulamaları Uzantıları bir konak uygulama paketine dahil edilmese bile, uzantı için İleti Uygulaması Çekmecesi veya Ayarlar gibi sistemin diğer bölümlerinde görüntülenecek simge olduğundan geliştiricinin İleti Uygulamaları Uzantısı'nın paketinde bir uygulama simgesi sağlaması gerekir.

Çıkartmalar Hakkında

Apple çıkartmaları, iMessage kullanıcılarının diğer herhangi bir ileti içeriği olarak satır içi olarak gönderilmesine izin vererek iletişim kurması için yeni bir yol olarak tasarladı veya konuşmanın içindeki önceki ileti kabarcıklarına iliştirilebilir.

Çıkartmalar nedir?

  • Bunlar, İleti Uygulamaları Uzantısı'nın sağladığı görüntülerdir.
  • Bunlar animasyonlu veya statik görüntüler olabilir.
  • Bir uygulamanın içinden görüntü içeriği paylaşmak için yeni bir yol sağlar.

Çıkartma oluşturmanın iki yolu vardır:

  1. Etiket Paketi İleti Uygulamaları Uzantıları, herhangi bir kod eklemeden Xcode'un içinden oluşturulabilir. Gerekli olan tek şey çıkartmalar ve uygulama simgelerinin varlıklarıdır.
  2. İletiler çerçevesi aracılığıyla koddan çıkartmalar sağlayan standart bir Message Apps Uzantısı oluşturarak.

Çıkartma Paketleri Oluşturma

Çıkartma Paketleri, Xcode'un içindeki özel bir şablondan oluşturulur ve yalnızca çıkartma olarak kullanılabilecek statik bir görüntü varlıkları kümesi sağlar. Yukarıda belirtildiği gibi, herhangi bir kod gerektirmez, geliştirici yalnızca resim dosyalarını Çıkartmalar Varlık Kataloğu'nun içindeki Çıkartma Paketi klasörüne sürükler.

Bir resmin Çıkartma Paketi'ne dahil edilmesi için aşağıdaki gereksinimleri karşılaması gerekir:

  • Resimler PNG, APNG, GIF veya JPEG biçiminde olmalıdır. Apple, Çıkartma varlıkları sağlarken yalnızca PNG ve APNG biçimlerini kullanmanızı önerir.
  • Animasyonlu Çıkartmalar yalnızca APNG ve GIF biçimlerini destekler.
  • Etiket görüntüleri, kullanıcı tarafından konuşmadaki ileti balonlarının üzerine yerleştirilebildiği için saydam bir arka plan sağlamalıdır.
  • Tek tek görüntü dosyaları 500 kb'tan az olmalıdır.
  • Görüntüler 100x100 puntadan küçük veya 206 x 206 puntadan büyük olamaz.

Önemli

Çıkartma görüntüleri her zaman 300 x 300 ila 618 x 618 piksel aralığında çözünürlükte sağlanmalıdır @3x . Sistem, ve @1x sürümlerini gerektiği gibi çalışma zamanında otomatik olarak oluşturur@2x.

Apple, olası tüm durumlarda en iyi şekilde görünmelerini sağlamak için Çıkartma Görüntüsü Varlıklarını çeşitli farklı renkli arka planlarda (beyaz, siyah, kırmızı, sarı ve çok renkli gibi) ve fotoğraflar üzerinde test etmenizi önerir.

Çıkartma Paketleri, mevcut üç boyuttan birinde çıkartma sağlayabilir:

  • Küçük - 100 x 100 puan.
  • Orta - 136 x 136 puan. Varsayılan boyut budur.
  • Büyük - 206 x 206 puan.

Xcode'un Öznitelik denetçisini kullanarak Etiket Paketinin tamamının boyutunu ayarlayın ve İletiler uygulamasının içindeki Sticker Browser'da en iyi sonuçları elde etmek için yalnızca istenen boyutla eşleşen görüntü varlıklarını sağlayın.

Daha fazla bilgi için bkz. Apple'ın İleti Başvurusu.

Özel Çıkartma Deneyimi Oluşturma

Uygulama, Etiket Paketi tarafından sağlanandan daha fazla denetim veya esneklik gerektiriyorsa, bir İleti Uygulaması Uzantısı içerebilir ve Özel Çıkartma Deneyimi için mesajlar çerçevesi aracılığıyla Çıkartmalar sağlayabilir.

Özel Çıkartma Deneyimi oluşturmanın avantajları nelerdir?

  1. Uygulamanın, Çıkartmaların uygulama kullanıcılarına nasıl görüntüleneceğini özelleştirmesine izin verir. Örneğin, Çıkartmaları standart kılavuz düzeni dışında bir biçimde veya farklı renkli bir arka planda sunmak için.
  2. Çıkartmaların statik görüntü varlıkları olarak dahil edilmesi yerine koddan dinamik olarak oluşturulmasını sağlar.
  3. Çıkartma görüntüsü varlıklarının App Store'a yeni bir sürüm yayınlamak zorunda kalmadan geliştiricinin web sunucusundan dinamik olarak indirilmesine izin verir.
  4. Anında Çıkartmalar oluşturmak için cihazın kamerasına erişim sağlar.
  5. Kullanıcının uygulamanın içinden daha fazla Çıkartma satın alabilmesi için Uygulama İçi Satın Alma işlemlerine izin verir.

Özel Çıkartma Deneyimi oluşturmak için aşağıdakileri yapın:

  1. Mac için Visual Studio'ı başlatın.

  2. İleti Uygulaması Uzantısı eklemek için çözümü açın.

  3. iOS>Uzantıları>iMessage Uzantısı'nıseçin ve İleri düğmesine tıklayın:

    iMessage Uzantısını Seçin

  4. Bir Uzantı Adı girin ve İleri düğmesine tıklayın:

    Uzantı Adı Girin

  5. Uzantıyı oluşturmak için Oluştur düğmesine tıklayın:

    Oluştur düğmesine tıklayın

Varsayılan olarak, MessagesViewController.cs dosya çözüme eklenir. Bu, Uzantı'nın ana giriş noktasıdır ve sınıfından MSMessageAppViewController devralır.

İletiler çerçevesi, kullanıcıya kullanılabilir Çıkartmalar sunmak için sınıflar sağlar:

  • MSStickerBrowserViewController - Çıkartmaların sunulacağı görünümü denetler. Ayrıca, belirli bir tarayıcı dizini için IMSStickerBrowserViewDataSource Çıkartma Sayısını ve Çıkartmayı döndürmek için arayüze de uygundur.
  • MSStickerBrowserView - Bu, mevcut Çıkartmaların görüntüleneceği görünümdür.
  • MSStickerSize - Tarayıcı görünümünde sunulan Çıkartmalar kılavuzu için ayrı hücre boyutlarına karar verir.

Özel Çıkartma Tarayıcısı Oluşturma

Geliştirici, İleti Uygulaması Uzantısı'nda bir Özel Çıkartma Tarayıcısı (MSMessageAppBrowserViewController) sağlayarak kullanıcının çıkartma deneyimini daha da özelleştirebilir. Özel Çıkartma Tarayıcısı, ileti akışına eklenecek bir çıkartmayı seçerken kullanıcıya çıkartmaların nasıl sunulduğunu değiştirir.

Aşağıdakileri yapın:

  1. Çözüm Bölmesi'nde Uzantının proje adına sağ tıklayın ve Yeni Dosya Ekle>... öğesini seçin.>iOS | Apple Watch>Arabirim Denetleyicisi.

  2. Ad için girin StickerBrowserViewController ve Yeni düğmesine tıklayın:

    Ad olarak StickerBrowserViewController girin

  3. StickerBrowserViewController.cs Dosyayı düzenlemek üzere açın.

StickerBrowserViewController.cs Aşağıdaki gibi görünmesini sağlayın:

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

Yukarıdaki koda ayrıntılı olarak göz atın. Uzantının sağladığı Çıkartmalar için depolama alanı oluşturur:

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

Ve bu veri deposundan MSStickerBrowserViewController tarayıcıya veri sağlamak için sınıfının iki yöntemini geçersiz kılar:

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

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

yöntemi, CreateSticker Uzantı'nın paketinden bir görüntü varlığının yolunu alır ve bu varlıktan koleksiyona eklediği yeni bir MSSticker örneğini oluşturmak için bunu kullanır:

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

LoadSticker yöntemi, adlandırılmış görüntü varlığından (uygulamanın paketine dahil) bir etiket oluşturmak ve çıkartma koleksiyonuna eklemek için 'den ViewDidLoad çağrılır.

Özel Çıkartma Tarayıcısı'nı uygulamak için dosyayı düzenleyin MessagesViewController.cs ve aşağıdaki gibi görünmesini sağlayın:

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

Bu koda ayrıntılı bir şekilde göz atarak özel tarayıcı için depolama alanı oluşturur:

public StickerBrowserViewController BrowserViewController { get; set;}

Yönteminde ViewDidLoad yeni bir tarayıcı örneği oluşturup yapılandırıyor:

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

Ardından, görüntülemek için tarayıcıyı görünüme ekler:

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

Daha Fazla Etiket Özelleştirmesi

İleti Uygulaması Uzantısına yalnızca iki sınıf ekleyerek daha fazla Etiket özelleştirmesi yapılabilir:

  • MSStickerView
  • MSSticker

Uzantı, yukarıdaki yöntemleri kullanarak standart Sticker Browser yöntemine bağlı olmayan çıkartma seçimini destekleyebilir. Buna ek olarak, çıkartma ekranı iki farklı görünüm modu arasında değiştirilebilir:

  • Kompakt - Bu, Etiket Görünümünün İleti Görünümünün %25'ini kapladığı varsayılan moddur.
  • Genişletilmiş - Etiket Görünümü, İleti Görünümünün tamamını doldurur.

Bu Çıkartma Görünümü, bu modlar arasında program aracılığıyla veya kullanıcı tarafından el ile değiştirilebilir.

İki farklı görünüm modu arasındaki anahtarı işlemeye ilişkin aşağıdaki örneğe göz atın. Her durum için iki farklı Görünüm Denetleyicisi gerekir. Sıkıştırılmış StickerBrowserViewController görünümü işler ve aşağıdaki gibi görünür:

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

Genişletilmiş AddStickerViewController Çıkartma Görünümü'nü işler ve aşağıdaki gibi görünür:

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 istenen durumu yönlendirmek için şu Görünüm Denetleyicilerini uygular:

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

Kullanıcı kullanılabilir koleksiyonuna yeni bir Çıkartma eklemek istediğinde, görünür denetleyiciye yeni AddStickerViewController bir etiket eklenir ve Çıkartma Görünümü Genişletilmiş görünüme girer:

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

Kullanıcı eklemek için bir etiket seçtiğinde, bu etiket kullanılabilir koleksiyonuna eklenir ve Sıkıştırılmış görünüm istenir:

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

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

DidTransition yöntemi iki mod arasında geçiş yapmak için geçersiz kılınmış:

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

Özet

Bu makalede, İletiler uygulamasıyla tümleşen ve kullanıcıya yeni işlevler sunan bir Xamarin.iOS çözümünde İleti Uygulaması Uzantısı yer alır. Metin, çıkartma, medya dosyaları ve etkileşimli iletiler göndermek için uzantı kullanılarak ele alınmıştır.