Platform kodunu çağırma
.NET Çok Platformlu Uygulama Kullanıcı Arabiriminin (.NET MAUI) belirli platform API'lerine erişmek için herhangi bir API sağlamadığı durumlarda, gerekli platform API'lerine erişmek için kendi kodunuzu yazabilirsiniz. Bunun için Apple'ın iOS ve MacCatalyst API'leri, Google'ın Android API'leri ve Microsoft'un Windows Uygulama SDK'sı API'leri hakkında bilgi sahibi olunması gerekir.
Platform kodu, koşullu derleme kullanılarak platformlar arası koddan veya kısmi sınıflar ve kısmi yöntemler kullanılarak çağrılabilir.
Koşullu derleme
Platform kodu, farklı platformları hedeflemek için koşullu derleme kullanılarak platformlar arası koddan çağrılabilir.
Aşağıdaki örnek, cihazınızın yönlendirmesini DeviceOrientation
belirtmek için kullanılacak numaralandırmayı gösterir:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Cihazınızın yönlendirmesini almak için platform kodu yazılması gerekir. Bu, farklı platformları hedeflemek için koşullu derleme kullanan bir yöntem yazılarak gerçekleştirilebilir:
#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
}
}
}
Bu örnekte, android ve iOS için yönteminin GetOrientation
platform uygulamaları sağlanır. Diğer platformlarda DeviceOrientation.Undefined
döndürülür. Alternatif olarak, döndürmek DeviceOrientation.Undefined
yerine, uygulamaların sağlandığı platformları belirten bir PlatformNotSupportedException
oluşturabilirsiniz:
throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");
Yöntem DeviceOrientationService.GetOrientation
daha sonra bir nesne örneği oluşturup işlemini çağırarak platformlar arası koddan çağrılabilir:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
Derleme zamanında derleme sistemi, Android ve iOS platform kodunu doğru platforma hedeflemek için koşullu derleme kullanır.
Koşullu derleme hakkında daha fazla bilgi için bkz. Koşullu derleme.
Kısmi sınıflar ve yöntemler
.NET MAUI uygulama projesi, .NET MAUI'nin hedefleyebileceği bir platformu temsil eden her alt klasörün bulunduğu bir Platformlar klasörü içerir:
Her hedef platformun klasörleri, uygulamayı her platformda başlatan platforma özgü kodun yanı sıra eklediğiniz tüm ek platform kodlarını içerir. Derleme zamanında, derleme sistemi yalnızca belirli bir platform için derleme yaparken her klasörden kodu içerir. Örneğin, Android için derleme yaptığınızda , Platformlar>Android klasöründeki dosyalar uygulama paketinde yerleşik olarak bulunur, ancak diğer Platformlar klasörlerindeki dosyalar oluşturulmaz. Bu yaklaşımda, tek bir projeden birden çok platformu hedeflemek için çoklu hedefleme adı verilen bir özellik kullanılır.
Çoklu hedefleme, platformlar arası koddan platform işlevselliğini çağırmak için kısmi sınıflar ve kısmi yöntemlerle birleştirilebilir. Bunu yapma işlemi şu şekildedir:
- Platformlar arası API'yi, her platformda çağırmak istediğiniz işlemler için kısmi yöntem imzalarını tanımlayan kısmi bir sınıf olarak tanımlayın. Daha fazla bilgi için bkz. Platformlar arası API'yi tanımlama.
- Aynı kısmi sınıfı ve aynı kısmi yöntem imzalarını tanımlayıp yöntem uygulamalarını sağlayarak platform başına platformlar arası API'yi uygulayın. Daha fazla bilgi için bkz. Api'yi platform başına uygulama.
- Kısmi sınıfın bir örneğini oluşturup yöntemlerini gerektiği gibi çağırarak platformlar arası API'yi çağırın. Daha fazla bilgi için bkz. Platformlar arası API'yi çağırma.
Platformlar arası API'yi tanımlama
Platformlar arası koddan platform kodunu çağırmak için ilk adım, platformlar arası API'yi, her platformda çağırmak istediğiniz işlemler için kısmi yöntem imzalarını tanımlayan kısmi bir sınıf olarak tanımlamaktır.
Aşağıdaki örnek, cihazınızın yönlendirmesini DeviceOrientation
belirtmek için kullanılacak numaralandırmayı gösterir:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Aşağıdaki örnekte, bir cihazın yönlendirmesini almak için kullanılabilecek bir platformlar arası API gösterilmektedir:
namespace InvokePlatformCodeDemos.Services.PartialMethods
{
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation();
}
}
Kısmi sınıf, adlı DeviceOrientationService
kısmi bir yöntem içeren adlı GetOrientation
sınıfıdır. Bu sınıfın kod dosyası Platformlar klasörünün dışında olmalıdır:
Platform başına API uygulama
Platformlar arası API tanımlandıktan sonra, aynı kısmi sınıfı ve aynı kısmi yöntem imzalarını tanımlayıp yöntem uygulamalarını sağlayarak hedeflediğiniz tüm platformlarda uygulanmalıdır.
Derleme sisteminin yalnızca belirli bir platform için derleme yaparken platform kodu oluşturmaya çalıştığından emin olmak için platform uygulamaları doğru Platformlar alt klasörlerine yerleştirilmelidir. Aşağıdaki tabloda platform uygulamaları için varsayılan klasör konumları listelemektedir:
Platform | Klasör |
---|---|
Android | Platform>Android |
iOS | Platform>Ios |
MacCatalyst | Platform>MacCatalyst |
Tizen | Platform>Tizen dili |
Windows | Platform>Windows |
Önemli
Platform uygulamaları, platformlar arası API'nin tanımlandığı ad alanında ve aynı sınıfta olmalıdır.
Aşağıdaki ekran görüntüsünde DeviceOrientationService
Android ve iOS klasörlerindeki sınıflar gösterilmektedir:
Alternatif olarak çoklu hedefleme, Platformlar klasörlerini kullanmak yerine kendi dosya adınıza ve klasör ölçütlerinize göre gerçekleştirilebilir. Daha fazla bilgi için bkz. Çoklu hedeflemeyi yapılandırma.
Android
Aşağıdaki örnekte, Android'de yönteminin GetOrientation
uygulanması gösterilmektedir:
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
Aşağıdaki örnekte iOS'ta yönteminin GetOrientation
uygulanması gösterilmektedir:
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;
}
}
Platformlar arası API'yi çağırma
Platform uygulamaları sağlandıktan sonra API, bir nesne örneği oluşturup işlemi çağrılarak platformlar arası koddan çağrılabilir:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.PartialMethods;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
Derleme zamanında derleme sistemi çoklu hedefleme kullanarak platformlar arası kısmi sınıfı hedef platformun kısmi sınıfıyla birleştirir ve uygulama paketinde derler.
Çoklu hedeflemeyi yapılandırma
.NET MAUI uygulamaları, kendi dosya adınıza ve klasör ölçütlerinize göre de çok hedefli olabilir. Bu, platform kodunuzu Platformlar klasörünün alt klasörlerine yerleştirmeniz gerekmeyecek şekilde .NET MAUI uygulama projenizi yapılandırmanızı sağlar.
Örneğin, standart bir çoklu hedefleme düzeni, platform kodunun dosya adına bir uzantı olarak platformu dahil etmektir. Derleme sistemi, platformlar arası kısmi sınıfları bu desene göre platform kısmi sınıfları ile birleştirecek şekilde yapılandırılabilir:
Bir diğer standart çoklu hedefleme düzeni de platformu klasör adı olarak eklemektir. Derleme sistemi, platformlar arası kısmi sınıfları bu desene göre platform kısmi sınıfları ile birleştirecek şekilde yapılandırılabilir:
Daha fazla bilgi için bkz. Çoklu hedeflemeyi yapılandırma.