Bagikan melalui


Memanggil kode platform

Telusuri sampel. Telusuri sampel

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:

Cuplikan layar folder platform.

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:

  1. 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.
  2. 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.
  3. 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 :

Kelas DeviceOrientationService di cuplikan layar folder Layanan.

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 :

Kelas DeviceOrientationService di cuplikan layar folder Platform mereka.

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:

Kelas DeviceOrientationService menggunakan multi-penargetan berbasis nama file.

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:

Kelas DeviceOrientationService menggunakan multi-penargetan berbasis folder.

Untuk informasi selengkapnya, lihat Mengonfigurasi multi-penargetan.