Bölüm 4 - Birden Fazla Platformla İlgilenme

Platform Ayrışma ve Özellikleri İşleme

Ayrışma yalnızca 'platformlar arası' bir sorun değildir; 'aynı' platformdaki cihazlar farklı özelliklere sahiptir (özellikle kullanılabilen çok çeşitli Android cihazlar). En belirgin ve temel olan ekran boyutudur, ancak diğer cihaz öznitelikleri farklılık gösterebilir ve bir uygulamanın belirli özellikleri denetlemesini ve bunların varlığına (veya yokluğuna) göre farklı davranmasını gerektirebilir.

Bu, tüm uygulamaların işlevselliğin düzgün bir şekilde düşüşüyle ilgilenmesi gerektiği veya çekici olmayan, en düşük ortak paydalı özellik kümesi sunması gerektiği anlamına gelir. Xamarin'in her platformun yerel SDK'larıyla derin tümleştirmesi, uygulamaların platforma özgü işlevlerden yararlanmasını sağlar, bu nedenle bu özellikleri kullanacak uygulamalar tasarlamak mantıklıdır.

Platformların işlevsellik bakımından nasıl farklılık gösterdiğine genel bir bakış için Platform Özellikleri belgelerine bakın.

Platform Ayrışma Örnekleri

Platformlar arasında var olan temel öğeler

Mobil uygulamaların evrensel olan bazı özellikleri vardır. Bunlar genel olarak tüm cihazlar için geçerli olan ve bu nedenle uygulamanızın tasarımının temelini oluşturabilen üst düzey kavramlardır:

  • Sekmeler veya menüler aracılığıyla özellik seçimi
  • Veri ve kaydırma listeleri
  • Tek veri görünümleri
  • Verilerin tek görünümlerini düzenleme
  • Geriye doğru gezinme

Üst düzey ekran akışınızı tasarlarken ortak bir kullanıcı deneyimini bu kavramlara dayandırabilirsiniz.

Platforma özgü öznitelikler

Tüm platformlarda mevcut olan temel öğelere ek olarak, tasarımınızdaki temel platform farklarını da ele almanız gerekir. Bu farklılıkları göz önünde bulundurmanız (ve özellikle işlemek için kod yazmanız) gerekebilir:

  • Ekran boyutları – Bazı platformlar (iOS ve önceki Windows Telefon sürümleri gibi) hedeflene göre daha basit standartlaştırılmış ekran boyutlarına sahiptir. Android cihazlar, uygulamanızda destek olmak için daha fazla çaba gerektiren çok çeşitli ekran boyutlarına sahiptir.
  • Gezinti metaforları – Farklı platformlar (örneğin donanım 'geri düğmesi, Panorama UI denetimi) ve platformlar içinde (Android 2 ve 4, i Telefon vs iPad).
  • Klavyeler – Bazı Android cihazlarda fiziksel klavyeler varken, diğer cihazlarda yalnızca yazılım klavyesi vardır. Yumuşak klavyenin ekranın bir bölümünü gizlediğini algılayan kodun bu farklılıklara duyarlı olması gerekir.
  • Dokunma ve hareketler – Hareket tanıma için işletim sistemi desteği, özellikle her işletim sisteminin eski sürümlerinde farklılık gösterir. Android'in önceki sürümleri dokunma işlemleri için çok sınırlı desteğe sahiptir; bu da eski cihazların desteklenmesi için ayrı kod gerektirebileceği anlamına gelir
  • Anında iletme bildirimleri – Her platformda farklı özellikler/uygulamalar vardır (örn. Windows'ta Canlı Kutucuklar).

Cihaza özgü özellikler

Uygulama için gereken en düşük özelliklerin ne olması gerektiğini belirleyin; veya her platformda hangi ek özelliklerden yararlanacaklarına karar verin. Özellikleri algılamak ve işlevselliği devre dışı bırakmak veya alternatifler sunmak için kod gerekir (örneğin, coğrafi konumun alternatifi kullanıcının bir konum yazmasına veya harita arasından seçim yapmasına izin vermek olabilir):

  • Kamera – İşlevsellik cihazlar arasında farklılık gösterir: Bazı cihazlarda kamera yoktur, diğerleri hem ön hem de arka kameralara sahiptir. Bazı kameralar video kaydı yapabilir.
  • Coğrafi konum ve haritalar – GPS veya Wi-Fi konumu desteği tüm cihazlarda mevcut değildir. Uygulamaların her yöntem tarafından desteklenen çeşitli doğruluk düzeylerini de karşılanması gerekir.
  • Ivmeölçer, jiroskop ve pusula – Bu özellikler genellikle her platformda yalnızca bir cihaz seçiminde bulunur, bu nedenle donanım desteklenmediğinde uygulamaların neredeyse her zaman bir geri dönüş sağlaması gerekir.
  • Twitter ve Facebook – sırasıyla yalnızca iOS5 ve iOS6'da 'yerleşik'. Önceki sürümlerde ve diğer platformlarda, doğrudan her hizmetin API'siyle kendi kimlik doğrulama işlevlerinizi ve arabiriminizi sağlamanız gerekir.
  • Yakın Alan İletişimleri (NFC) – Yalnızca (bazı) Android telefonlarda (yazma sırasında).

Platform Ayrışma ile ilgilenme

Her biri kendi avantajları ve dezavantajları olan aynı kod tabanından birden çok platformu desteklemeye yönelik iki farklı yaklaşım vardır.

  • Platform Soyutlama – İş Cephesi düzeni, platformlar arasında birleşik erişim sağlar ve belirli platform uygulamalarını tek, birleşik bir API'de soyutlar.
  • Ayrık Uygulama – Arabirimler ve devralma veya koşullu derleme gibi mimari araçlar aracılığıyla farklı uygulamalar aracılığıyla belirli platform özelliklerinin çağrılması.

Platform Soyutlama

Sınıf Soyutlaması

Paylaşılan kodda tanımlanan ve platforma özgü projelerde uygulanan veya genişletilmiş arabirimleri veya temel sınıfları kullanma. Paylaşılan kodu sınıf soyutlamalarıyla yazma ve genişletme özellikle Taşınabilir Sınıf Kitaplıkları için uygundur çünkü çerçevenin sınırlı bir alt kümesi vardır ve platforma özgü kod dallarını desteklemek için derleyici yönergeleri içeremezler.

Arabirimler

Arabirimleri kullanmak, ortak koddan yararlanmak için paylaşılan kitaplıklarınıza geçirilebilen platforma özgü sınıflar uygulamanıza olanak tanır.

Arabirim paylaşılan kodda tanımlanır ve paylaşılan kitaplığa parametre veya özellik olarak geçirilir.

Platforma özgü uygulamalar daha sonra arabirimi uygulayabilir ve yine de 'işlemek' için paylaşılan koddan yararlanabilir.

Avantajlar

Uygulama, platforma özgü kod içerebilir ve hatta platforma özgü dış kitaplıklara başvuruda bulunabilir.

Dezavantajlar

Uygulamaları oluşturmak ve paylaşılan koda geçirmek zorunda. Arabirim, paylaşılan kodun derinlerinde kullanılıyorsa, birden çok yöntem parametresinden geçirilir veya çağrı zinciri aracılığıyla başka bir şekilde aşağı itilir. Paylaşılan kod çok sayıda farklı arabirim kullanıyorsa, bunların tümünün bir yerde oluşturulması ve paylaşılan kodda ayarlanması gerekir.

Devralma

Paylaşılan kod, platforma özgü bir veya daha fazla projede genişletilebilen soyut veya sanal sınıflar uygulayabilir. Bu, arabirimleri kullanmaya benzer, ancak bazı davranışlar zaten uygulanmış durumdadır. Arabirimlerin veya devralmanın daha iyi bir tasarım seçimi olup olmadığına ilişkin farklı bakış açıları vardır: özellikle C# yalnızca tek devralma izni verdiğinden, API'lerinizin daha sonra tasarlanması için gereken yöntemi dikte edebilir. Devralmayı dikkatli kullanın.

Arabirimlerin avantajları ve dezavantajları devralmaya eşit olarak uygulanır ve temel sınıfın bazı uygulama kodları içerebileceği ek avantajla (belki de isteğe bağlı olarak genişletilebilen tüm platform bağımsız uygulaması).

Xamarin.Forms

Xamarin.Forms belgelerine bakın.

Diğer Platformlar Arası Kitaplıklar

Bu kitaplıklar C# geliştiricileri için platformlar arası işlevsellik de sunar:

Koşullu Derleme

Paylaşılan kodunuzun her platformda farklı şekilde çalışması ve muhtemelen farklı davranan sınıflara veya özelliklere erişmesi gereken bazı durumlar vardır. Koşullu derleme, aynı kaynak dosyaya farklı simgeler tanımlanmış birden çok projede başvurulan Paylaşılan Varlık Projeleri ile en iyi şekilde çalışır.

Xamarin projeleri her zaman hem iOS hem de Android uygulama projeleri için hangisinin doğru olduğunu tanımlar __MOBILE__ (bu sembollerde çift alt çizgi ön ve düzeltme sonrası değerlerini not edin).

#if __MOBILE__
// Xamarin iOS or Android-specific code
#endif

iOS

Xamarin.iOS, iOS cihazlarını algılamak için hangilerini kullanabileceğinizi tanımlar __IOS__ .

#if __IOS__
// iOS-specific code
#endif

İzleme ve TV'ye özgü simgeler de vardır:

#if __TVOS__
// tv-specific stuff
#endif

#if __WATCHOS__
// watch-specific stuff
#endif

Android

Yalnızca Xamarin.Android uygulamalarında derlenmesi gereken kod aşağıdakileri kullanabilir

#if __ANDROID__
// Android-specific code
#endif

Her API sürümü de yeni bir derleyici yönergesi tanımlar, bu nedenle bu tür kodlar daha yeni API'ler hedeflenirse özellik eklemenize olanak tanır. Her API düzeyi tüm 'alt' düzey simgelerini içerir. Bu özellik, birden çok platformu desteklemek için gerçekten kullanışlı değildir; __ANDROID__ genellikle simge yeterli olur.

#if __ANDROID_11__
// code that should only run on Android 3.0 Honeycomb or newer
#endif

Mac

Xamarin.Mac, yalnızca macOS için derlemek için hangilerini kullanabileceğinizi tanımlar __MACOS__ :

#if __MACOS__
// macOS-specific code
#endif

Evrensel Windows Platformu (UWP)

WINDOWS_UWP adresini kullanın. Dizeyi çevreleyen Xamarin platformu simgeleri gibi alt çizgi yoktur.

#if WINDOWS_UWP
// UWP-specific code
#endif

Koşullu Derleme Kullanma

Koşullu derlemenin basit bir örnek örneği, SQLite veritabanı dosyasının dosya konumunu ayarlamaktır. Üç platform, dosya konumunu belirtmek için biraz farklı gereksinimlere sahiptir:

  • iOS – Apple, kullanıcı dışı verilerin belirli bir konuma (Kitaplık dizini) yerleştirilmesini tercih eder, ancak bu dizin için sistem sabiti yoktur. Doğru yolu oluşturmak için platforma özgü kod gereklidir.
  • Android – tarafından Environment.SpecialFolder.Personal döndürülen sistem yolu, veritabanı dosyasını depolamak için kabul edilebilir bir konumdur.
  • Windows Telefon – Yalıtılmış depolama mekanizması, yalnızca göreli bir yol ve dosya adı olmak üzere tam yolun belirtilmesine izin vermez.
  • Evrensel Windows Platformu : API'leri kullanırWindows.Storage.

Aşağıdaki kod, her platform için doğru olduğundan emin olmak DatabaseFilePath için koşullu derlemeyi kullanır:

public static string DatabaseFilePath
{
    get
    {
        var filename = "TodoDatabase.db3";
#if SILVERLIGHT
        // Windows Phone 8
        var path = filename;
#else

#if __ANDROID__
        string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
#else
#if __IOS__
        // we need to put in /Library/ on iOS5.1 to meet Apple's iCloud terms
        // (they don't want non-user-generated data in Documents)
        string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
        string libraryPath = Path.Combine (documentsPath, "..", "Library");
#else
        // UWP
        string libraryPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
#endif
#endif
        var path = Path.Combine(libraryPath, filename);
#endif
        return path;
    }
}

Sonuç, SQLite veritabanı dosyasını her platformda farklı bir konuma yerleştirerek tüm platformlarda oluşturulabilen ve kullanılabilen bir sınıftır.