iOS Uygulama Mimarisi
Xamarin.iOS uygulamaları Mono yürütme ortamında çalıştırıldı ve C# kodunu ARM derleme diline derlemek için tam Zamanında (AOT) derlemeyi kullanır. Bu, ile yan yana Objective-C Runtime çalışır. Her iki çalışma zamanı ortamları da özellikle XNUUNIX çekirdek üzerinde çalışır ve çeşitli API'leri kullanıcı koduna sunar ve geliştiricilerin temel alınan yerel veya yönetilen sisteme erişmesini sağlar.
Aşağıdaki diyagramda bu mimariye ilişkin temel bir genel bakış gösterilmiştir:
Yerel ve Yönetilen kod: Açıklama
Xamarin için geliştirmede genellikle yerel ve yönetilen kod terimleri kullanılır. Yönetilen kod, yürütmesi .NET Framework Ortak Dil Çalışma Zamanıtarafından veya Xamarin'in örneğinde yönetilen koddur: Mono Çalışma Zamanı. Bu, ara dil olarak da andiğimiz şeydir.
Yerel kod, belirli bir platformda (örneğin, arm yongasında AOT derlenmiş kodu) Objective-C yerel olarak çalıştıracak koddur. 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ığını inceler ve bağlamalar aracılığıyla Apple'ın iOS API'lerini tam olarak kullanmanın yanı sıra erişimi de vardır. NET'in BCL'si ve C# gibi gelişmiş bir dil.
AOT
Herhangi bir Xamarin platform uygulamasını derlerken Mono C# (veya F#) derleyicisi çalıştırarak C# ve F# kodunuzu Microsoft Ara Dili'ne (MSIL) derler. Simülatörde bir Xamarin.Android, Xamarin.Mac uygulaması veya hatta bir 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 yerel bir koda derlenmiş ve bu kod, uygulamanıza uygun mimari üzerinde çalışır.
Ancak Apple tarafından ayarlanmış olan ve cihazda dinamik olarak oluşturulan kodun yürütülmesine izin etmeyen iOS için bir güvenlik kısıtlaması vardır. Xamarin.iOS, bu güvenlik protokollerine bağlı kalmamız için yönetilen kodu derlemek için bir Zaman Önce (AOT) derleyicisi kullanır. Bu, Apple'ın ARM tabanlı işlemcisi üzerinde dağıtılabilir, isteğe bağlı olarak cihazlar için LLVM ile iyileştirilmiş yerel bir iOS ikilisi üretir. Bunun bir araya nasıl uyduğunu gösteren kabaca bir diyagram aşağıda gösterilmiştir:
AOT kullanımı, Sınırlamalar kılavuzunda ayrıntılı olarak yer alan bir dizi sınırlamaya sahiptir. Ayrıca başlangıç süresinin azaltılmasıyla JIT üzerinde bir dizi geliştirme ve çeşitli performans iyileştirmeleri sağlar
Artık kodun kaynaktan yerel koda nasıl derlenmiş olduğunu incelediğimize göre, Xamarin.iOS'un tam olarak yerel iOS uygulamaları yazmamıza nasıl olanak sağlar?
Seçiciler
Xamarin ile iki ayrı ekosistemimiz vardır: .NET ve Apple; son hedefin sorunsuz bir kullanıcı deneyimi olmasını sağlamak için mümkün olduğunca kolaylaştırılmış bir şekilde bir araya getirmemiz gerekiyor. Yukarıdaki bölümde iki çalışma zamanının nasıl iletişim kuranı gördük ve yerel iOS API'lerinin Xamarin'de kullanılmaktadır. Bağlamalar belgelerimizde ayrıntılı bir şekilde açıklanmıştır, bu nedenle şimdilik Objective-C binding iOS'un nasıl çalıştığını derinlemesine incele bakalım.
İlk olarak, C# ile ortaya çıkarmanın bir yolu olması Objective-C gerekir ve bu, Seçiciler aracılığıyla yapılır. Seçici, bir nesneye veya sınıfa gönderilen bir iletidir. Bu, Objective-C yeni işlevler aracılığıyla Objective-C yapılır. Seçicileri kullanma hakkında daha fazla bilgi için kılavuza Objective-C Selectors bakın. Ayrıca, yönetilen kod hakkında hiçbir şey bilmiyor olması nedeniyle daha karmaşık olan yönetilen kodu 'a ifşa etmek için bir Objective-CObjective-C yol olması gerekir. Bu durumla ilgili bir şeyler yapmak için Registrars kullanıriz. Bunlar sonraki bölümde daha ayrıntılı olarak açıklanmıştır.
Registrars
Yukarıda belirtildiği gibi, registrar yönetilen kodu 'de ortaya çıkaran koddur. Objective-C Bunu, NSObject nesnesinden türeten her yönetilen sınıfın listesini oluşturarak yapar:
Mevcut bir sınıfı sarmalamadan tüm sınıflar için, [ ] özniteliğine sahip tüm yönetilen üyeleri yansıtan üyelerle Objective-CObjective-C yeni bir sınıf Objective-C
Exportoluşturur.Her Objective-C üyesinin uygulamalarına yansıtılmış yönetilen üyeyi çağıran kod otomatik olarak eklenir.
Aşağıdaki sahte kodda bunun nasıl yapılıra bir örnek gösterilmiştir:
C# (Yönetilen Kod)
class MyViewController : UIViewController{
[Export ("myFunc")]
public void MyFunc ()
{
}
}
:
@interface MyViewController : UIViewController { }
-(void)myFunc;
@end
@implementation MyViewController {}
-(void) myFunc
{
/* code to call the managed MyViewController.MyFunc method */
}
@end
Yönetilen kod, nesnesinin kullanımına açık olması gerektiğini [Register] bilmek için kullandığı ve [Export]registrar özniteliklerini Objective-C içerebilir.
Varsayılan oluşturulan adın uygun olması durumunda oluşturulan sınıfın [Register] adını belirtmek için özniteliği Objective-C kullanılır. NSObject'den türetilen tüm sınıflar ile otomatik olarak Objective-C kaydedilir.
Gerekli [Export] öznitelik, oluşturulan sınıfta kullanılan seçici olan bir dize Objective-C içerir.
registrarsXamarin.iOS'ta iki tür kullanılır: dinamik ve statik:
Dinamik – Dinamik, registrar çalışma zamanında derlemenizin tüm türlerinin kaydını yapar. Bunu, tarafından sağlanan işlevleri kullanarak Objective-C’s runtime API yapar. Bu nedenle registrar dinamik, daha yavaş bir başlatmaya ancak daha hızlı derleme süresine sahip olur. Bu, iOS Simülatörü için varsayılandır. Yerel işlevler (genellikle C'de), dinamik kullanılırken yöntem uygulamaları olarak registrars kullanılır. Farklı mimariler arasında farklılık gösterir.
Statik – Statik, derleme sırasında kod üretir ve bu kod daha sonra registrarObjective-C statik bir kitaplıkta derlenmiş ve yürütülebilir dosyayla bağlantılıdır. Bu, daha hızlı bir başlatmaya olanak sağlar, ancak derleme süresi boyunca daha uzun sürer. Bu, cihaz derlemeleri için varsayılan olarak kullanılır. Statik, aşağıda gösterildiği gibi projenizin derleme seçeneklerine öznitelik olarak geçerek iOS simülatörü registrar
--registrar:staticile demtouchkullanılabilir:
Xamarin.iOS tarafından kullanılan iOS Tür Kaydı sisteminin özellikleri hakkında daha fazla bilgi için kayıt şirketi " data-linktype="relative-path">Tür Registrar kılavuzuna bakın.
Uygulama Başlatma
Tüm Xamarin.iOS yürütülebilir dosyaları için giriş noktası, mono başlatan xamarin_main adlı bir 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
UIApplication.Mainiçin giriş noktası olan çağrısında Objective-C bulundu. UIApplication.Main, Objective-C yöntemininUIApplicationMainbağlamasıdır. - Uzantılar için Apple kitaplıkları tarafından sağlanan yerel işlev
NSExtensionMain(veyaNSExtensionmainWatchOS uzantıları için) çağrılır. Bu projeler yürütülebilir projeler değil sınıf kitaplıkları olduğu için yürütülecek yönetilen Ana yöntemler yoktur.
Bu başlatma dizisinin hepsi statik bir kitaplıkta derlenmiş ve bu kitaplık daha sonra son yürütülebilir dosyanıza bağlanarak uygulamanın nasıl temelden çıkarılabını bilir.
Bu noktada uygulamamız başlatıldı, Mono çalışıyor, yönetilen kodda ve yerel kodu çağırmayı ve geri çağırmayı biliyoruz. Bir sonraki adım denetim eklemeye başlamak ve uygulamayı etkileşimli hale eklemektir.
Oluşturucu
Xamarin.iOS, her bir iOS API'si için tanımlar içerir. Bunların herhangi birini MaciOS github depos sayfasından bulabilirsiniz. Bu tanımlar, özniteliklere sahip arabirimlerin yanı sıra gerekli yöntemleri ve özellikleri içerir. Örneğin, aşağıdaki kod UIKit ad alanı içinde bir UIToolbar tanımlamak için kullanılır. Bunun bir dizi yöntem ve özelliği olan bir arabirim olduğunu fark vardır:
[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 çağrılır Oluşturucu, bu tanım dosyalarını alır ve bunları geçici bir derlemede derlemek btouch için .NET btouch Ancak, bu geçici derleme kod çağrısı yapmak için Objective-C kullanılamaz. Oluşturucu daha sonra geçici derlemeyi okur ve çalışma zamanında kullanılan C# kodu üretir.
Bu nedenle, örneğin tanım .cs dosyanıza rastgele bir öznitelik eklersiniz, bu öznitelik çıkış kodunda göster olmayacaktır. Oluşturucu bunu bilmiyor ve bu nedenle çıkışını geçici derlemede btouch aray bilmiyor.
Uygulama Xamarin.iOS.dll mtouch tüm bileşenleri birlikte paketler.
Yüksek düzeyde, aşağıdaki görevleri yürüterek bunu başarıyor:
- Uygulama paket yapısı oluşturun.
- Yönetilen derlemelerinize kopyalayın.
- Bağlama etkinse, kullanılmayan parçaları atarak derlemelerinizi iyileştirmek için yönetilen bağlantıleştiriciyi çalıştırın.
- AOT derlemesi.
- Yerel yürütülebilir dosyanın başlatıcı kodundan, koddan (statik ise) ve AOT derleyicisine ait tüm çıkışlardan oluşan bir dizi statik kitaplık (her derleme için bir tane) çıkışı olan yerel yürütülebilir dosya registrar oluşturma
Bağlantıcı ve nasıl kullanıldıkları hakkında daha ayrıntılı bilgi için Linker kılavuzuna bakın.
Özet
Bu kılavuzda Xamarin.iOS uygulamalarının AOT derlemesi ince edildi ve Xamarin.iOS ile arasındaki ilişki ayrıntılı Objective-C olarak incelandı.


