Aracılığıyla paylaş


iOS Uygulama Mimarisi

Xamarin.iOS uygulamaları Mono yürütme ortamında çalışır ve C# kodunu ARM derleme diline derlemek için Tam Zamanından Önce (AOT) derlemesini kullanır. Bu, Çalışma Zamanı ile Objective-C yan yana çalışır. Her iki çalışma zamanı ortamı da UNIX benzeri bir çekirdek üzerinde( özellikle XNU) çalışır ve geliştiricilerin temel alınan yerel veya yönetilen sisteme erişmesine olanak sağlayan kullanıcı kodunda çeşitli API'leri kullanıma sunar.

Aşağıdaki diyagramda bu mimariye temel bir genel bakış gösterilmektedir:

This diagram shows a basic overview of the Ahead of Time (AOT) compilation architecture

Yerel ve Yönetilen kod: Açıklama

Xamarin için geliştirme yaparken genellikle yerel ve yönetilen kod terimleri kullanılır. Yönetilen kod, yürütmesinin .NET Framework Ortak Dil Çalışma Zamanı tarafından veya Xamarin örneğinde mono çalışma zamanı tarafından yönetilen koddur. Ara dil dediğimiz budur.

Yerel kod, belirli bir platformda yerel olarak çalışacak koddur (örneğin, Objective-C ARM yongasında AOT derlenmiş kod). Bu kılavuzda, AOT'nin yönetilen kodunuzu yerel koda nasıl derlediği ve bir Xamarin.iOS uygulamasının nasıl çalıştığı açıklanır ve bağlamaların kullanımı aracılığıyla Apple'ın iOS API'lerinden tam olarak yararlanırken erişimi olur. NET'in BCL'si ve C# gibi gelişmiş bir dil.

AOT

Herhangi bir Xamarin platform uygulamasını derlediğinizde, Mono C# (veya F#) derleyicisi çalışır ve C# ve F# kodunuzu Microsoft Ara Dili'ne (MSIL) derler. Simülatörde Xamarin.Android, Xamarin.Mac uygulaması, hatta Xamarin.iOS uygulaması çalıştırıyorsanız, .NET Ortak Dil Çalışma Zamanı (CLR) MSIL'i Tam Zamanında (JIT) derleyicisi kullanarak derler. Çalışma zamanında bu, uygulamanız için doğru mimari üzerinde çalışabilen yerel bir kodda derlenmiştir.

Ancak iOS'ta Apple tarafından ayarlanan ve bir cihazda dinamik olarak oluşturulan kodun yürütülmesine izinmeyen bir güvenlik kısıtlaması vardır. Bu güvenlik protokollerine uyacağımızdan emin olmak için, Xamarin.iOS bunun yerine yönetilen kodu derlemek için bir Önceden Zaman (AOT) derleyicisi kullanır. Bu, Apple'ın ARM tabanlı işlemcisinde dağıtılabilen, isteğe bağlı olarak cihazlar için LLVM ile iyileştirilmiş yerel bir iOS ikili dosyası oluşturur. Bunun birbirine nasıl uyduğunu gösteren kaba bir diyagram aşağıda gösterilmiştir:

A rough diagram of how this fits together

AOT kullanımı, Sınırlamalar kılavuzunda ayrıntılı olarak verilen bir dizi sınırlamaya sahiptir . Ayrıca başlangıç süresinde bir azalma ve çeşitli performans iyileştirmeleri aracılığıyla JIT üzerinde bir dizi iyileştirme sağlar

Kodun kaynaktan yerel koda nasıl derlendiğini incelediğimize göre, Xamarin.iOS'un tamamen yerel iOS uygulamaları yazmamıza nasıl olanak sağladığını görmek için arka planda bir göz atalım

Seçiciler

Xamarin ile, son hedefin sorunsuz bir kullanıcı deneyimi olduğundan emin olmak için mümkün olduğunca rahat görünmesi için bir araya getirmemiz gereken .NET ve Apple adlı iki ayrı ekosistemimiz vardır. Yukarıdaki bölümde iki çalışma zamanının nasıl iletişim kurdığını gördük ve yerel iOS API'lerinin Xamarin'de kullanılmasını sağlayan 'bağlamalar' terimini çok iyi duymuş olabilirsiniz. Bağlamalar bağlama belgelerimizde Objective-C ayrıntılı olarak açıklanmıştır, bu nedenle şimdilik iOS'un arka planda nasıl çalıştığını inceleyelim.

İlk olarak, Seçiciler aracılığıyla gerçekleştirilen C# ile kullanıma sunmanın Objective-C bir yolu olmalıdır. Seçici, bir nesneye veya sınıfa gönderilen bir iletidir. Bu Objective-C işlem, objc_msgSend işlevleri aracılığıyla yapılır. Seçicileri kullanma hakkında daha fazla bilgi için Seçiciler kılavuzuna Objective-C bakın. Yönetilen kod hakkında hiçbir şey bilmemesi nedeniyle Objective-C daha karmaşık olan yönetilen kodu Objective-Ciçin kullanıma sunmanın bir yolu da olmalıdır. Bu sorunu çözmek için kullanırız Registrars. Bunlar sonraki bölümde daha ayrıntılı olarak açıklanmıştır.

Registrars

Yukarıda belirtildiği gibi, registrar yönetilen kodu için Objective-Ckullanıma sunan koddur. Bunu, NSObject'ten türetilen her yönetilen sınıfın listesini oluşturarak yapar:

  • Mevcut Objective-C bir sınıfı sarmalamayan tüm sınıflar için, [Export] özniteliğine sahip tüm yönetilen üyeleri yansıtan üyeler ile Objective-C yeni Objective-C bir sınıf oluşturur.

  • Her Objective–C üyesinin uygulamalarına, yansıtılmış yönetilen üyeyi çağırmak için kod otomatik olarak eklenir.

Aşağıdaki sahte kod, bunun nasıl yapıldığını gösteren bir örnek gösterir:

C# (Yönetilen Kod)

 class MyViewController : UIViewController{
     [Export ("myFunc")]
     public void MyFunc ()
     {
     }
 }

Objective-C:

@interface MyViewController : UIViewController { }

    -(void)myFunc;
@end

@implementation MyViewController {}

    -(void) myFunc
    {
        /* code to call the managed MyViewController.MyFunc method */
    }
@end

Yönetilen kod, [Register] nesnesinin 'e açık olması gerektiğini bilmek için kullandığı ve [Export]registrar özniteliklerini Objective-Ciçerebilir. [Register] özniteliği, varsayılan oluşturulan adın uygun olmaması durumunda oluşturulan Objective-C sınıfın adını belirtmek için kullanılır. NSObject'ten türetilen tüm sınıflar ile Objective-Cotomatik olarak kaydedilir. Gerekli [Export] öznitelik, oluşturulan Objective-C sınıfta kullanılan seçici olan bir dize içerir.

Xamarin.iOS'ta kullanılan iki tür vardır registrars : dinamik ve statik:

  • Dinamik registrars : Dinamik registrar , derlemenizdeki tüm türlerin kaydını çalışma zamanında yapar. Bunu, 'nin çalışma zamanı API'si tarafından Objective-Csağlanan işlevleri kullanarak yapar. Bu nedenle dinamik registrar , daha yavaş bir başlangıç, ancak daha hızlı bir derleme süresine sahiptir. Bu, iOS Simülatörü için varsayılandır. Yerel işlevler (genellikle C dilindedir), trambolinler olarak adlandırılır, dinamik registrarskullanılırken yöntem uygulamaları olarak kullanılır. Bunlar farklı mimariler arasında farklılık gösterir.

  • Static registrars : Statik registrar , derleme sırasında kod oluşturur Objective-C ve bu kod daha sonra statik bir kitaplıkta derlenip yürütülebilir dosyaya bağlanır. Bu, daha hızlı bir başlangıç sağlar, ancak derleme süresi boyunca daha uzun sürer. Bu, cihaz derlemeleri için varsayılan olarak kullanılır. Statikregistrar, aşağıda gösterildiği gibi projenizin derleme seçeneklerinde öznitelik mtouch olarak geçirilerek --registrar:static iOS simülatörüyle de kullanılabilir:

    Setting Additional mtouch arguments

Xamarin.iOS tarafından kullanılan iOS Tür Kayıt sisteminin özellikleri hakkında daha fazla bilgi için Tür Registrar kılavuzuna bakın.

Uygulama Başlatma

Tüm Xamarin.iOS yürütülebilir dosyalarındaki giriş noktası, mono'nun başlatıldığı adlı xamarin_mainbir işlev tarafından sağlanır.

Proje türüne bağlı olarak aşağıdakiler yapılır:

  • Normal iOS ve tvOS uygulamaları için, Xamarin uygulaması tarafından sağlanan yönetilen Main yöntemi çağrılır. Bu yönetilen Main yöntemi daha sonra için Objective-Cgiriş noktası olan öğesini çağırırUIApplication.Main. UIApplication.Main, 'nin UIApplicationMain yöntemi için Objective-Cbağlamadır.
  • Uzantılar için, Apple kitaplıkları tarafından sağlanan yerel işlev ( NSExtensionMain veya (NSExtensionmain WatchOS uzantıları için) çağrılır. Bu projeler yürütülebilir projeler değil sınıf kitaplıkları olduğundan yürütülecek yönetilen Ana yöntem yoktur.

Bu başlatma dizisinin tümü statik bir kitaplıkta derlendiğinden, uygulamanızın yerden nasıl kalkacaklarını bilmesi için son yürütülebilir dosyanıza bağlanır.

Bu noktada uygulamamız çalışmaya başladı, Mono çalışıyor, yönetilen kod içindeyiz ve yerel kodu çağırmayı ve geri çağrılmayı biliyoruz. Yapmamız gereken bir sonraki şey, denetimleri eklemeye başlamak ve uygulamayı etkileşimli hale getirmektir.

Oluşturucu

Xamarin.iOS, her bir iOS API'si için tanımlar içerir. MaciOS github deposunda bunlardan herhangi birine göz atabilirsiniz. Bu tanımlar, öznitelikleri olan arabirimlerin yanı sıra gerekli yöntem ve özellikleri içerir. Örneğin, UIKit ad alanında bir UIToolbar tanımlamak için aşağıdaki kod kullanılır. Bunun bir dizi yöntem ve özelliğe sahip bir arabirim olduğuna dikkat edin:

[BaseType (typeof (UIView))]
public interface UIToolbar : UIBarPositioning {
    [Export ("initWithFrame:")]
    IntPtr Constructor (CGRect frame);

    [Export ("barStyle")]
    UIBarStyle BarStyle { get; set; }

    [Export ("items", ArgumentSemantic.Copy)][NullAllowed]
    UIBarButtonItem [] Items { get; set; }

    [Export ("translucent", ArgumentSemantic.Assign)]
    bool Translucent { [Bind ("isTranslucent")] get; set; }

    // done manually so we can keep this "in sync" with 'Items' property
    //[Export ("setItems:animated:")][PostGet ("Items")]
    //void SetItems (UIBarButtonItem [] items, bool animated);

    [Since (5,0)]
    [Export ("setBackgroundImage:forToolbarPosition:barMetrics:")]
    [Appearance]
    void SetBackgroundImage ([NullAllowed] UIImage backgroundImage, UIToolbarPosition position, UIBarMetrics barMetrics);

    [Since (5,0)]
    [Export ("backgroundImageForToolbarPosition:barMetrics:")]
    [Appearance]
    UIImage GetBackgroundImage (UIToolbarPosition position, UIBarMetrics barMetrics);

    ...
}

Xamarin.iOS'ta adı verilen btouch Oluşturucu, bu tanım dosyalarını alır ve bunları geçici bir derlemede derlemek için .NET araçlarını kullanır. Ancak, bu geçici derleme kod çağırmak Objective-C için kullanılamaz. Oluşturucu daha sonra geçici derlemeyi okur ve çalışma zamanında kullanılabilecek C# kodu oluşturur. Bu nedenle, örneğin, tanım .cs dosyanıza rastgele bir öznitelik eklerseniz, çıkış kodunda gösterilmez. Oluşturucu bunu bilmez ve bu nedenle btouch bunu çıkış yapmak için geçici derlemede aramasını bilmez.

Xamarin.iOS.dll oluşturulduktan sonra, mtouch tüm bileşenleri bir araya toplayacak.

Yüksek düzeyde, aşağıdaki görevleri yürüterek bunu başarıyor:

  • Bir uygulama paketi yapısı oluşturun.
  • Yönetilen derlemelerinizde kopyalayın.
  • Bağlama etkinleştirildiyse, kullanılmayan parçaları kopyalayarak derlemelerinizi iyileştirmek için yönetilen bağlayıcıyı çalıştırın.
  • AOT derlemesi.
  • Yerel yürütülebilir dosyanın başlatıcı kodundan, koddan registrar (statikse) ve AOT derleyicisinden gelen tüm çıkışlardan oluşması için yerel yürütülebilir dosyaya bağlı bir dizi statik kitaplık (her derleme için bir tane) çıkartan yerel bir yürütülebilir dosya oluşturun

Bağlayıcı ve nasıl kullanıldığı hakkında daha ayrıntılı bilgi için Bağlayıcı kılavuzuna bakın.

Özet

Bu kılavuzda Xamarin.iOS uygulamalarının AOT derlemesi incelenmiş ve Xamarin.iOS ile ilişkisi Objective-C ayrıntılı olarak incelenmiş.