Memanggil kode platform
Dalam situasi di mana .NET Multi-platform App UI (.NET MAUI) tidak menyediakan API apa pun untuk mengakses API platform tertentu, Anda dapat menulis kode Anda sendiri untuk mengakses API platform yang diperlukan. Ini membutuhkan pengetahuan tentang API iOS dan MacCatalyst Apple, API Android Google, dan API SDK Aplikasi Windows Microsoft.
Kode platform dapat dipanggil dari kode lintas platform dengan menggunakan kompilasi kondisional, atau dengan menggunakan kelas parsial dan metode parsial.
Kompilasi kondisional
Kode platform dapat dipanggil dari kode lintas platform dengan menggunakan kompilasi kondisional untuk menargetkan platform yang berbeda.
Contoh berikut menunjukkan DeviceOrientation
enumerasi, yang akan digunakan untuk menentukan orientasi perangkat Anda:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Mengambil orientasi perangkat Anda memerlukan penulisan kode platform. Ini dapat dicapai dengan menulis metode yang menggunakan kompilasi kondisional untuk menargetkan platform yang berbeda:
#if ANDROID
using Android.Content;
using Android.Views;
using Android.Runtime;
#elif IOS
using UIKit;
#endif
using InvokePlatformCodeDemos.Services;
namespace InvokePlatformCodeDemos.Services.ConditionalCompilation
{
public class DeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
#if ANDROID
IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
#elif IOS
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
#else
return DeviceOrientation.Undefined;
#endif
}
}
}
Dalam contoh ini, implementasi platform metode GetOrientation
disediakan untuk Android dan iOS. Pada platform lain, DeviceOrientation.Undefined
dikembalikan. Atau, daripada mengembalikan DeviceOrientation.Undefined
, Anda dapat melempar PlatformNotSupportedException
yang menentukan platform yang disediakan implementasi untuk:
throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");
Metode DeviceOrientationService.GetOrientation
ini kemudian dapat dipanggil dari kode lintas platform dengan membuat instans objek dan memanggil operasinya:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
Pada waktu build, sistem build menggunakan kompilasi bersyarat untuk menargetkan kode platform Android dan iOS ke platform yang benar.
Untuk informasi selengkapnya tentang kompilasi bersyar, lihat Kompilasi bersyar.
Kelas dan metode parsial
Proyek aplikasi .NET MAUI berisi folder Platform , dengan setiap folder anak mewakili platform yang dapat ditargetkan .NET MAUI:
Folder untuk setiap platform target berisi kode khusus platform yang memulai aplikasi di setiap platform, ditambah kode platform tambahan yang Anda tambahkan. Pada waktu build, sistem build hanya menyertakan kode dari setiap folder saat membangun untuk platform tertentu. Misalnya, ketika Anda membuat untuk Android, file di folder Platform Android> akan dibangun ke dalam paket aplikasi, tetapi file di folder Platform lain tidak akan. Pendekatan ini menggunakan fitur yang disebut multi-penargetan untuk menargetkan beberapa platform dari satu proyek.
Multi-penargetan dapat dikombinasikan dengan kelas parsial dan metode parsial untuk memanggil fungsionalitas platform dari kode lintas platform. Proses untuk melakukan ini adalah untuk:
- Tentukan API lintas platform sebagai kelas parsial yang menentukan tanda tangan metode parsial untuk operasi apa pun yang ingin Anda panggil di setiap platform. Untuk informasi selengkapnya, lihat Menentukan API lintas platform.
- Terapkan API lintas platform per platform, dengan mendefinisikan kelas parsial yang sama dan tanda tangan metode parsial yang sama, sekaligus menyediakan implementasi metode. Untuk informasi selengkapnya, lihat Menerapkan API per platform.
- Panggil API lintas platform dengan membuat instans kelas parsial dan memanggil metodenya sesuai kebutuhan. Untuk informasi selengkapnya, lihat Memanggil API lintas platform.
Menentukan API lintas platform
Untuk memanggil kode platform dari kode lintas platform, langkah pertama adalah menentukan API lintas platform sebagai kelas parsial yang menentukan tanda tangan metode parsial untuk setiap operasi yang ingin Anda panggil di setiap platform.
Contoh berikut menunjukkan DeviceOrientation
enumerasi, yang akan digunakan untuk menentukan orientasi perangkat Anda:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Contoh berikut menunjukkan API lintas platform yang dapat digunakan untuk mengambil orientasi perangkat:
namespace InvokePlatformCodeDemos.Services.PartialMethods
{
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation();
}
}
Kelas parsial diberi nama DeviceOrientationService
, yang mencakup metode parsial bernama GetOrientation
. File kode untuk kelas ini harus berada di luar folder Platform :
Menerapkan API per platform
Setelah menentukan API lintas platform, API harus diimplementasikan pada semua platform yang Anda targetkan dengan mendefinisikan kelas parsial yang sama dan tanda tangan metode parsial yang sama, sekaligus menyediakan implementasi metode.
Implementasi platform harus ditempatkan di folder anak Platform yang benar untuk memastikan bahwa sistem build hanya mencoba membangun kode platform saat membangun untuk platform tertentu. Tabel berikut mencantumkan lokasi folder default untuk implementasi platform:
Platform | Folder |
---|---|
Android | Platform>Android |
iOS | Platform>Ios |
MacCatalyst | Platform>MacCatalyst |
Tizen | Platform>Tizen |
Windows | Platform>Windows |
Penting
Implementasi platform harus berada di namespace yang sama dan kelas yang sama dengan API lintas platform yang ditentukan.
Cuplikan layar berikut menunjukkan DeviceOrientationService
kelas di folder Android dan iOS :
Atau, multi-penargetan dapat dilakukan berdasarkan kriteria nama file dan folder Anda sendiri, daripada menggunakan folder Platform . Untuk informasi selengkapnya, lihat Mengonfigurasi multi-penargetan.
Android
Contoh berikut menunjukkan implementasi GetOrientation
metode di Android:
using Android.Content;
using Android.Runtime;
using Android.Views;
namespace InvokePlatformCodeDemos.Services.PartialMethods;
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation()
{
IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
}
}
iOS
Contoh berikut menunjukkan implementasi GetOrientation
metode di iOS:
using UIKit;
namespace InvokePlatformCodeDemos.Services.PartialMethods;
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation()
{
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
}
}
Memanggil API lintas platform
Setelah menyediakan implementasi platform, API dapat dipanggil dari kode lintas platform dengan membuat instans objek dan memanggil operasinya:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.PartialMethods;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
Pada waktu build, sistem build akan menggunakan multi-penargetan untuk menggabungkan kelas parsial lintas platform dengan kelas parsial untuk platform target, dan membangunnya ke dalam paket aplikasi.
Mengonfigurasi multi-penargetan
Aplikasi MAUI .NET juga dapat multi-target berdasarkan kriteria nama file dan folder Anda sendiri. Ini memungkinkan Anda menyusun proyek aplikasi .NET MAUI sehingga Anda tidak perlu menempatkan kode platform Anda ke dalam folder anak folder Platform .
Misalnya, pola multi-penargetan standar adalah menyertakan platform sebagai ekstensi dalam nama file untuk kode platform. Sistem build dapat dikonfigurasi untuk menggabungkan kelas parsial lintas platform dengan kelas parsial platform berdasarkan pola ini:
Pola multi-penargetan standar lainnya adalah menyertakan platform sebagai nama folder. Sistem build dapat dikonfigurasi untuk menggabungkan kelas parsial lintas platform dengan kelas parsial platform berdasarkan pola ini:
Untuk informasi selengkapnya, lihat Mengonfigurasi multi-penargetan.