Bagikan melalui


Bagian 4 - Berurusan dengan Beberapa Platform

Menangani Platform Divergence &Features

Divergensi bukan hanya masalah 'lintas platform'; perangkat pada platform 'sama' memiliki kemampuan yang berbeda (terutama berbagai perangkat Android yang tersedia). Yang paling jelas dan dasar adalah ukuran layar, tetapi atribut perangkat lain dapat bervariasi dan mengharuskan aplikasi untuk memeriksa kemampuan tertentu dan berperilaku berbeda berdasarkan kehadiran mereka (atau tidak ada).

Ini berarti semua aplikasi perlu menangani degradasi fungsionalitas yang anggun, atau menyajikan set fitur penyebut umum terendah yang tidak menarik. Integrasi mendalam Xamarin dengan SDK asli dari setiap platform memungkinkan aplikasi untuk memanfaatkan fungsionalitas khusus platform, sehingga masuk akal untuk merancang aplikasi untuk menggunakan fitur-fitur tersebut.

Lihat dokumentasi Kemampuan Platform untuk gambaran umum tentang bagaimana platform berbeda dalam fungsionalitas.

Contoh Platform Divergence

Elemen dasar yang ada di seluruh platform

Ada beberapa karakteristik aplikasi seluler yang universal. Ini adalah konsep tingkat lebih tinggi yang umumnya benar dari semua perangkat dan oleh karena itu dapat membentuk dasar desain aplikasi Anda:

  • Pilihan fitur melalui tab atau menu
  • Daftar data dan pengguliran
  • Tampilan data tunggal
  • Mengedit tampilan data tunggal
  • Menavigasi kembali

Saat merancang alur layar tingkat tinggi, Anda dapat mendasarkan pengalaman pengguna umum pada konsep-konsep ini.

Atribut khusus platform

Selain elemen dasar yang ada di semua platform, Anda harus mengatasi perbedaan platform utama dalam desain Anda. Anda mungkin perlu mempertimbangkan (dan menulis kode khusus untuk menangani) perbedaan ini:

  • Ukuran layar – Beberapa platform (seperti iOS dan versi Windows Telepon sebelumnya) memiliki ukuran layar standar yang relatif sederhana untuk ditargetkan. Perangkat Android memiliki berbagai dimensi layar, yang membutuhkan lebih banyak upaya untuk mendukung dalam aplikasi Anda.
  • Metafora navigasi – Berbeda di seluruh platform (misalnya, tombol 'kembali' perangkat keras, kontrol UI Panorama) dan dalam platform (Android 2 dan 4, i Telepon vs iPad).
  • Keyboard - Beberapa perangkat Android memiliki keyboard fisik sementara yang lain hanya memiliki keyboard perangkat lunak. Kode yang mendeteksi ketika papan ketik lunak mengaburkan bagian layar harus sensitif terhadap perbedaan ini.
  • Sentuhan dan gerakan - Dukungan sistem operasi untuk pengenalan gerakan bervariasi, terutama dalam versi yang lebih lama dari setiap sistem operasi. Versi Android yang lebih lama memiliki dukungan yang sangat terbatas untuk operasi sentuhan, yang berarti bahwa mendukung perangkat yang lebih lama mungkin memerlukan kode terpisah
  • Pemberitahuan push – Ada berbagai kemampuan/implementasi pada setiap platform (misalnya. Petak Peta Langsung di Windows).

Fitur khusus perangkat

Tentukan fitur minimum yang diperlukan untuk aplikasi; atau ketika memutuskan fitur tambahan apa yang akan dimanfaatkan di setiap platform. Kode akan diperlukan untuk mendeteksi fitur dan menonaktifkan fungsionalitas atau menawarkan alternatif (misalnya. alternatif untuk lokasi geografis bisa untuk membiarkan pengguna mengetik lokasi atau memilih dari peta):

  • Kamera – Fungsionalitas berbeda di seluruh perangkat: beberapa perangkat tidak memiliki kamera, yang lain memiliki kamera depan dan belakang. Beberapa kamera mampu merekam video.
  • Lokasi geografis & peta – Dukungan untuk lokasi GPS atau Wi-Fi tidak ada di semua perangkat. Aplikasi juga perlu memenuhi berbagai tingkat akurasi yang didukung oleh setiap metode.
  • Akselerometer, giroskop , dan kompas - Fitur-fitur ini sering ditemukan hanya dalam pilihan perangkat di setiap platform, sehingga aplikasi hampir selalu perlu menyediakan fallback ketika perangkat keras tidak didukung.
  • Twitter dan Facebook - hanya 'bawaan' di iOS5 dan iOS6 masing-masing. Pada versi sebelumnya dan platform lain, Anda harus menyediakan fungsi dan antarmuka autentikasi Anda sendiri langsung dengan API setiap layanan.
  • Dekat Field Communications (NFC) – Hanya pada (beberapa) ponsel Android (pada saat penulisan).

Berurusan dengan Platform Divergence

Ada dua pendekatan berbeda untuk mendukung beberapa platform dari basis kode yang sama, masing-masing dengan serangkaian manfaat dan kekurangannya sendiri.

  • Abstraksi Platform – Pola Fasad Bisnis, menyediakan akses terpadu di seluruh platform dan mengabstraksi implementasi platform tertentu menjadi SATU API terpadu.
  • Implementasi Divergent – Pemanggilan fitur platform tertentu melalui implementasi yang berbeda melalui alat arsitektur seperti antarmuka dan warisan atau kompilasi kondisional.

Abstraksi Platform

Abstraksi Kelas

Menggunakan antarmuka atau kelas dasar yang ditentukan dalam kode bersama dan diimplementasikan atau diperluas dalam proyek khusus platform. Menulis dan memperluas kode bersama dengan abstraksi kelas sangat cocok untuk Pustaka Kelas Portabel karena mereka memiliki subset terbatas dari kerangka kerja yang tersedia untuk mereka dan tidak dapat berisi arahan kompilator untuk mendukung cabang kode khusus platform.

Antarmuka

Menggunakan antarmuka memungkinkan Anda menerapkan kelas khusus platform yang masih dapat diteruskan ke pustaka bersama Anda untuk memanfaatkan kode umum.

Antarmuka didefinisikan dalam kode bersama, dan diteruskan ke pustaka bersama sebagai parameter atau properti.

Aplikasi khusus platform kemudian dapat mengimplementasikan antarmuka dan masih memanfaatkan kode bersama untuk 'memproses' itu.

Kelebihan

Implementasi dapat berisi kode khusus platform dan bahkan mereferensikan pustaka eksternal khusus platform.

Kerugian

Harus membuat dan meneruskan implementasi ke dalam kode bersama. Jika antarmuka digunakan jauh dalam kode bersama maka akhirnya diteruskan melalui beberapa parameter metode atau didorong ke bawah melalui rantai panggilan. Jika kode bersama menggunakan banyak antarmuka yang berbeda, semuanya harus dibuat dan diatur dalam kode bersama di suatu tempat.

Warisan

Kode bersama dapat menerapkan kelas abstrak atau virtual yang dapat diperluas dalam satu atau beberapa proyek khusus platform. Ini mirip dengan menggunakan antarmuka tetapi dengan beberapa perilaku yang sudah diterapkan. Ada berbagai sudut pandang tentang apakah antarmuka atau warisan adalah pilihan desain yang lebih baik: khususnya karena C# hanya memungkinkan pewarisan tunggal dapat menentukan cara API Anda dapat dirancang ke depannya. Gunakan warisan dengan hati-hati.

Kelebihan dan kekurangan antarmuka berlaku sama untuk warisan, dengan keuntungan tambahan bahwa kelas dasar dapat berisi beberapa kode implementasi (mungkin seluruh implementasi agnostik platform yang dapat diperluas secara opsional).

Xamarin.Forms

Lihat dokumentasi Xamarin.Forms.

Pustaka Lintas Platform Lainnya

Pustaka ini juga menawarkan fungsionalitas lintas platform untuk pengembang C#:

Kompilasi Bersyarat

Ada beberapa situasi di mana kode bersama Anda masih perlu bekerja secara berbeda di setiap platform, mungkin mengakses kelas atau fitur yang berperilaku berbeda. Kompilasi bersyarkat berfungsi paling baik dengan Proyek Aset Bersama, di mana file sumber yang sama sedang dirujuk dalam beberapa proyek yang memiliki simbol berbeda yang ditentukan.

Proyek Xamarin selalu mendefinisikan __MOBILE__ mana yang benar untuk proyek aplikasi iOS dan Android (perhatikan pra-garis bawah ganda dan pasca-perbaikan pada simbol-simbol ini).

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

iOS

Xamarin.iOS mendefinisikan __IOS__ yang dapat Anda gunakan untuk mendeteksi perangkat iOS.

#if __IOS__
// iOS-specific code
#endif

Ada juga simbol khusus Tonton dan TV:

#if __TVOS__
// tv-specific stuff
#endif

#if __WATCHOS__
// watch-specific stuff
#endif

Android

Kode yang hanya boleh dikompilasi ke dalam aplikasi Xamarin.Android dapat menggunakan yang berikut ini

#if __ANDROID__
// Android-specific code
#endif

Setiap versi API juga mendefinisikan direktif kompilator baru, sehingga kode seperti ini akan memungkinkan Anda menambahkan fitur jika API yang lebih baru ditargetkan. Setiap tingkat API mencakup semua simbol tingkat 'lebih rendah'. Fitur ini tidak benar-benar berguna untuk mendukung beberapa platform; __ANDROID__ biasanya simbol akan cukup.

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

Mac

Xamarin.Mac menentukan __MACOS__ mana yang dapat Anda gunakan untuk mengkompilasi untuk macOS saja:

#if __MACOS__
// macOS-specific code
#endif

Universal Windows Platform (UWP)

Gunakan WINDOWS_UWP. Tidak ada garis bawah di sekitar string seperti simbol platform Xamarin.

#if WINDOWS_UWP
// UWP-specific code
#endif

Menggunakan Kompilasi Bersyarah

Contoh studi kasus sederhana dari kompilasi bersyarkat adalah mengatur lokasi file untuk file database SQLite. Ketiga platform memiliki persyaratan yang sedikit berbeda untuk menentukan lokasi file:

  • iOS – Apple lebih suka data non-pengguna ditempatkan di lokasi tertentu (direktori Pustaka), tetapi tidak ada konstanta sistem untuk direktori ini. Kode khusus platform diperlukan untuk membangun jalur yang benar.
  • Android – Jalur sistem yang dikembalikan oleh Environment.SpecialFolder.Personal adalah lokasi yang dapat diterima untuk menyimpan file database.
  • Windows Telepon – Mekanisme penyimpanan terisolasi tidak memungkinkan jalur lengkap ditentukan, hanya jalur relatif dan nama file.
  • Platform Windows Universal – Menggunakan Windows.Storage API.

Kode berikut menggunakan kompilasi bersyarat untuk memastikan DatabaseFilePath benar untuk setiap platform:

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

Hasilnya adalah kelas yang dapat dibangun dan digunakan di semua platform, menempatkan file database SQLite di lokasi yang berbeda di setiap platform.