Widok sieci Web
Wieloplatformowy interfejs użytkownika aplikacji platformy .NET (.NET MAUI) WebView wyświetla zdalne strony internetowe, lokalne pliki HTML i ciągi HTML w aplikacji. Zawartość wyświetlana pod numerem WebView obejmuje obsługę Kaskadowych Arkuszy Stylów (CSS) i JavaScript. Domyślnie projekty MAUI platformy .NET obejmują uprawnienia platformy wymagane do WebView wyświetlania zdalnej strony internetowej.
WebView definiuje następujące właściwości:
-
Cookies, typu
CookieContainer
, zapewnia przestrzeń do przechowywania plików cookie. -
CanGoBacktypu
bool
wskazuje, czy użytkownik może przejść do poprzednich stron. Jest to właściwość tylko do odczytu. -
CanGoForwardtypu
bool
wskazuje, czy użytkownik może przejść do przodu. Jest to właściwość tylko do odczytu. -
Sourcetypu
WebViewSource
reprezentuje lokalizację wyświetlaną przez WebView. -
UserAgenttypu
string
reprezentuje agenta użytkownika. Wartość domyślna to agent użytkownika przeglądarki platformy źródłowej lubnull
, jeśli nie można go określić.
Te właściwości są wspierane przez obiekty BindableProperty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Właściwość Source
można ustawić na obiekt UrlWebViewSource
lub obiekt HtmlWebViewSource
, który pochodzi z WebViewSource
.
UrlWebViewSource
służy do ładowania strony internetowej określonej przy użyciu adresu URL, podczas gdy obiekt HtmlWebViewSource
jest używany do ładowania lokalnego pliku HTML lub lokalnego kodu HTML.
WebView definiuje zdarzenie Navigating
, które jest wywoływane podczas uruchamiania nawigacji strony, oraz zdarzenie Navigated
zgłaszane po zakończeniu nawigacji strony. Obiekt WebNavigatingEventArgs
, który towarzyszy zdarzeniu Navigating
definiuje właściwość Cancel
typu bool
, która może służyć do anulowania nawigacji. Obiekt WebNavigatedEventArgs
, który towarzyszy zdarzeniu Navigated
definiuje właściwość Result
typu WebNavigationResult
wskazującą wynik nawigacji.
WebView definiuje następujące zdarzenia:
-
Navigating
, który jest wywoływany podczas uruchamiania nawigacji po stronie. ObiektWebNavigatingEventArgs
, który towarzyszy temu zdarzeniu, definiuje właściwośćCancel
typubool
, która może służyć do anulowania nawigacji. -
Navigated
, który jest wywoływany po zakończeniu nawigacji po stronie. ObiektWebNavigatedEventArgs
, który towarzyszy temu zdarzeniu, definiuje właściwośćResult
typuWebNavigationResult
, która wskazuje wynik nawigacji. -
ProcessTerminated
, który jest zgłaszany, gdy proces WebView kończy się nieoczekiwanie. ObiektWebViewProcessTerminatedEventArgs
, który towarzyszy temu zdarzeniu, definiuje właściwości specyficzne dla platformy, które wskazują, dlaczego proces zakończył się niepowodzeniem.
Ważny
WebView musi określać jego właściwości HeightRequest i WidthRequest, gdy znajdują się w HorizontalStackLayout, StackLayoutlub VerticalStackLayout. Jeśli nie określisz tych właściwości, WebView nie będzie renderowany.
Wyświetlanie strony internetowej
Aby wyświetlić zdalną stronę internetową, ustaw właściwość Source
na string
, która określa identyfikator URI:
<WebView Source="https://learn.microsoft.com/dotnet/maui" />
Równoważny kod języka C# to:
WebView webvView = new WebView
{
Source = "https://learn.microsoft.com/dotnet/maui"
};
Identyfikatory URI muszą być w pełni sformułowane przy użyciu określonego protokołu.
Notatka
Pomimo że właściwość Source
jest typu WebViewSource
, można ustawić ją na URI oparty na ciągu znaków. Dzieje się tak, ponieważ program .NET MAUI zawiera konwerter typów i niejawny operator konwersji, który konwertuje identyfikator URI oparty na ciągu na obiekt UrlWebViewSource
.
Konfigurowanie usługi App Transport Security w systemach iOS i Mac Catalyst
Ponieważ wersja 9, system iOS zezwoli aplikacji tylko na komunikację z bezpiecznymi serwerami. Aplikacja musi zdecydować się na włączanie komunikacji z niezabezpieczonymi serwerami.
W poniższej konfiguracji Info.plist pokazano, jak włączyć określoną domenę w celu obejścia wymagań usługi Apple Transport Security (ATS):
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>mydomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
Najlepszym rozwiązaniem jest włączenie tylko określonych domen w celu obejścia usługi ATS, co umożliwia korzystanie z zaufanych witryn przy jednoczesnym korzystaniu z dodatkowych zabezpieczeń w niezaufanych domenach.
W poniższej konfiguracji Info.plist pokazano, jak wyłączyć usługę ATS dla aplikacji:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Ważny
Jeśli aplikacja wymaga połączenia z niezabezpieczoną witryną internetową, zawsze należy wprowadzić domenę jako wyjątek przy użyciu klucza NSExceptionDomains
zamiast wyłączać usługę ATS całkowicie przy użyciu klucza NSAllowsArbitraryLoads
.
Wyświetlanie lokalnego kodu HTML
Aby wyświetlić wbudowany kod HTML, ustaw właściwość Source
na obiekt HtmlWebViewSource
:
<WebView>
<WebView.Source>
<HtmlWebViewSource Html="<HTML><BODY><H1>.NET MAUI</H1><P>Welcome to WebView.</P></BODY><HTML>" />
</WebView.Source>
</WebView>
W języku XAML ciągi HTML mogą stać się nieczytelne z powodu ucieczki <
i >
symboli. W związku z tym w celu zapewnienia większej czytelności kod HTML może być podkreślony w sekcji CDATA
:
<WebView>
<WebView.Source>
<HtmlWebViewSource>
<HtmlWebViewSource.Html>
<![CDATA[
<HTML>
<BODY>
<H1>.NET MAUI</H1>
<P>Welcome to WebView.</P>
</BODY>
</HTML>
]]>
</HtmlWebViewSource.Html>
</HtmlWebViewSource>
</WebView.Source>
</WebView>
Równoważny kod języka C# to:
WebView webView = new WebView
{
Source = new HtmlWebViewSource
{
Html = @"<HTML><BODY><H1>.NET MAUI</H1><P>Welcome to WebView.</P></BODY></HTML>"
}
};
Wyświetlanie lokalnego pliku HTML
Aby wyświetlić lokalny plik HTML, dodaj plik do folderu Resources\Raw projektu aplikacji i ustaw jego akcję kompilacji na MauiAsset. Następnie plik można załadować z wbudowanego kodu HTML zdefiniowanego w obiekcie HtmlWebViewSource
ustawionym jako wartość właściwości Source
:
<WebView>
<WebView.Source>
<HtmlWebViewSource>
<HtmlWebViewSource.Html>
<![CDATA[
<html>
<head>
</head>
<body>
<h1>.NET MAUI</h1>
<p>The CSS and image are loaded from local files!</p>
<p><a href="localfile.html">next page</a></p>
</body>
</html>
]]>
</HtmlWebViewSource.Html>
</HtmlWebViewSource>
</WebView.Source>
</WebView>
Lokalny plik HTML może ładować kaskadowe arkusze stylów (CSS), JavaScript i obrazy, jeśli zostały one również dodane do projektu aplikacji przy użyciu MauiAsset akcji kompilacji.
Aby uzyskać więcej informacji na temat zasobów pierwotnych, zobacz Nieprzetworzone zasoby.
Załaduj ponownie zawartość
WebView ma metodę Reload
, którą można wywołać w celu ponownego załadowania źródła:
WebView webView = new WebView();
...
webView.Reload();
Po wywołaniu metody Reload
zostanie wyzwolone zdarzenie ReloadRequested
wskazujące, że żądanie zostało wykonane w celu ponownego załadowania bieżącej zawartości.
Wykonywanie nawigacji
WebView obsługuje nawigację programową za pomocą metod GoBack
i GoForward
. Te metody umożliwiają nawigację za pośrednictwem stosu strony WebView i powinny być wywoływane tylko po sprawdzeniu wartości właściwości CanGoBack
i CanGoForward
:
WebView webView = new WebView();
...
// Go backwards, if allowed.
if (webView.CanGoBack)
{
webView.GoBack();
}
// Go forwards, if allowed.
if (webView.CanGoForward)
{
webView.GoForward();
}
Kiedy nawigacja po stronie w WebViewjest inicjowana programowo lub przez użytkownika, mają miejsce następujące zdarzenia:
-
Navigating
, który jest podnoszony, gdy rozpoczyna się nawigacja po stronie. ObiektWebNavigatingEventArgs
, który towarzyszy zdarzeniuNavigating
definiuje właściwośćCancel
typubool
, która może służyć do anulowania nawigacji. -
Navigated
, który jest wywoływany po zakończeniu nawigacji po stronie. ObiektWebNavigatedEventArgs
, który towarzyszy zdarzeniuNavigated
definiuje właściwośćResult
typuWebNavigationResult
wskazującą wynik nawigacji.
Przejdź do zawartości, która otwiera nowe okno w systemie Android
W systemie Android nawigacja nie będzie występować w WebView, gdy zostanie naciśnięty hiperlink określający target="_blank"
(aby otworzyć zawartość w nowym oknie). Wynika to z faktu, że otwarcie hiperlinku w nowym oknie wymaga zaimplementowania OnCreateWindow, którego nie ma .NET MAUI. W związku z tym w tym scenariuszu należy zdecydować, czy wdrożyć OnCreateWindow samodzielnie, otworzyć adres URL w przeglądarce systemowej, czy zrobić coś innego.
Alternatywnie, aby wymusić otwarcie wszystkich hiperlinków w tym samym WebView, zmodyfikuj WebViewHandler
w aplikacji, aby natywna WebView wyłączyła obsługę wielu okien:
#if ANDROID
Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping("SupportMultipleWindows", (handler, view) =>
{
handler.PlatformView.Settings.SetSupportMultipleWindows(false);
});
#endif
Ten kod dostosowuje maper właściwości dla WebViewHandler
na Androidzie, wywołując metodę SetSupportMultipleWindows z argumentem false
i należy go wykonać, zanim użytkownik będzie mógł przejść do łącza wskazującego na target="_blank"
. Aby uzyskać więcej informacji o programach obsługi, zobacz Handlers.
Obsługa uprawnień w systemie Android
Podczas przechodzenia do strony, która żąda dostępu do sprzętu rejestrującego urządzenie, takiego jak aparat lub mikrofon, należy udzielić uprawnień przez kontrolę WebView. Kontrolka WebView
używa typu Android.Webkit.WebChromeClient w systemie Android do reagowania na żądania uprawnień. Jednak implementacja WebChromeClient
dostarczana przez program .NET MAUI ignoruje żądania uprawnień. Należy utworzyć nowy typ, który dziedziczy po MauiWebChromeClient
i zatwierdza żądania uprawnień.
Ważny
Dostosowanie WebView
do zatwierdzania żądań uprawnień przy użyciu tej metody wymaga Android API 26 lub nowszego.
Żądania uprawnień ze strony internetowej do kontrolki WebView
różnią się od żądań uprawnień od aplikacji .NET MAUI do użytkownika. Uprawnienia aplikacji .NET MAUI są wymagane i zatwierdzone przez użytkownika dla całej aplikacji. Kontrola WebView
zależy od możliwości uzyskiwania dostępu do sprzętu przez aplikacje. Aby zilustrować tę koncepcję, rozważ stronę internetową żądającą dostępu do aparatu urządzenia. Nawet jeśli to żądanie zostanie zatwierdzone przez kontrolkę WebView
, ale aplikacja .NET MAUI nie ma zatwierdzenia przez użytkownika w celu uzyskania dostępu do aparatu, strona internetowa nie będzie mogła uzyskać dostępu do aparatu.
W poniższych krokach pokazano, jak przechwytywać żądania uprawnień z kontrolki WebView
do korzystania z aparatu. Jeśli próbujesz użyć mikrofonu, kroki będą podobne, z tą różnicą, że należy użyć uprawnień związanych z mikrofonem zamiast uprawnień związanych z kamerą.
Najpierw dodaj wymagane uprawnienia aplikacji do manifestu systemu Android. Otwórz plik Platforms/Android/AndroidManifest.xml i dodaj następujący kod w węźle
manifest
:<uses-permission android:name="android.permission.CAMERA" />
W pewnym momencie w aplikacji, na przykład gdy strona zawierająca kontrolkę
WebView
jest ładowana, poproś użytkownika o uprawnienie, aby zezwolić aplikacji na dostęp do aparatu.private async Task RequestCameraPermission() { PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.Camera>(); if (status != PermissionStatus.Granted) await Permissions.RequestAsync<Permissions.Camera>(); }
Dodaj następującą klasę do folderu Platforms/Android, zmieniając przestrzeń nazw katalogu głównego tak, aby odpowiadała przestrzeni nazw projektu (nie dołączaj
.Platforms.Android
do przestrzeni nazw):using Android.Webkit; using Microsoft.Maui.Handlers; using Microsoft.Maui.Platform; namespace MauiAppWebViewHandlers.Platforms.Android; internal class MyWebChromeClient: MauiWebChromeClient { public MyWebChromeClient(IWebViewHandler handler) : base(handler) { } public override void OnPermissionRequest(PermissionRequest request) { // Process each request foreach (var resource in request.GetResources()) { // Check if the web page is requesting permission to the camera if (resource.Equals(PermissionRequest.ResourceVideoCapture, StringComparison.OrdinalIgnoreCase)) { // Get the status of the .NET MAUI app's access to the camera PermissionStatus status = Permissions.CheckStatusAsync<Permissions.Camera>().Result; // Deny the web page's request if the app's access to the camera is not "Granted" if (status != PermissionStatus.Granted) request.Deny(); else request.Grant(request.GetResources()); return; } } base.OnPermissionRequest(request); } }
W poprzednim fragmencie kodu klasa
MyWebChromeClient
dziedziczy zMauiWebChromeClient
i zastępuje metodęOnPermissionRequest
w celu przechwycenia żądań uprawnień strony internetowej. Każdy element uprawnień jest sprawdzany, czy odpowiada stałej o wartościPermissionRequest.ResourceVideoCapture
, która reprezentuje aparat. Jeśli uprawnienie aparatu jest zgodne, kod sprawdza, czy aplikacja ma uprawnienia do korzystania z aparatu. Jeśli ma uprawnienia, żądanie strony internetowej zostanie przyznane.Użyj metody SetWebChromeClient w kontrolce
WebView
systemu Android, aby ustawić klienta chrome na wartośćMyWebChromeClient
. W poniższych dwóch elementach pokazano, jak ustawić klienta chrome:Na podstawie kontrolki .NET MAUI
WebView
o nazwietheWebViewControl
można ustawić klienta chrome bezpośrednio w widoku platformy, który jest kontrolką systemu Android:((IWebViewHandler)theWebViewControl.Handler).PlatformView.SetWebChromeClient(new MyWebChromeClient((IWebViewHandler)theWebViewControl.Handler));
Możesz również użyć mapowania właściwości programu handlers, aby wymusić, że wszystkie kontrolki
WebView
korzystają z klienta Chrome. Aby uzyskać więcej informacji, zobacz Handlers.Podczas uruchamiania aplikacji należy wywołać metodę
CustomizeWebViewHandler
poniższego fragmentu kodu, taką jak w metodzieMauiProgram.CreateMauiApp
.private static void CustomizeWebViewHandler() { #if ANDROID26_0_OR_GREATER Microsoft.Maui.Handlers.WebViewHandler.Mapper.ModifyMapping( nameof(Android.Webkit.WebView.WebChromeClient), (handler, view, args) => handler.PlatformView.SetWebChromeClient(new MyWebChromeClient(handler))); #endif }
Ustawianie plików cookie
Pliki cookie można ustawić na WebView, aby były wysyłane z żądaniem internetowym do określonego adresu URL. Ustaw ciasteczka, dodając obiekty Cookie
do CookieContainer
, a następnie ustaw kontener jako wartość właściwości wiązanej WebView.Cookies
. Poniższy kod przedstawia przykład:
using System.Net;
CookieContainer cookieContainer = new CookieContainer();
Uri uri = new Uri("https://learn.microsoft.com/dotnet/maui", UriKind.RelativeOrAbsolute);
Cookie cookie = new Cookie
{
Name = "DotNetMAUICookie",
Expires = DateTime.Now.AddDays(1),
Value = "My cookie",
Domain = uri.Host,
Path = "/"
};
cookieContainer.Add(uri, cookie);
webView.Cookies = cookieContainer;
webView.Source = new UrlWebViewSource { Url = uri.ToString() };
W tym przykładzie do obiektu Cookie
jest dodawany pojedynczy CookieContainer
, który jest następnie ustawiany jako wartość właściwości WebView.Cookies
. Gdy WebView wysyła żądanie internetowe do określonego adresu URL, plik cookie jest wysyłany z żądaniem.
Wywoływanie kodu JavaScript
WebView obejmuje możliwość wywoływania funkcji JavaScript z języka C# i zwracania dowolnego wyniku do wywołującego kodu języka C#. Ta interoperacyjność jest osiągana za pomocą metody EvaluateJavaScriptAsync
, która jest pokazana w poniższym przykładzie.
Entry numberEntry = new Entry { Text = "5" };
Label resultLabel = new Label();
WebView webView = new WebView();
...
int number = int.Parse(numberEntry.Text);
string result = await webView.EvaluateJavaScriptAsync($"factorial({number})");
resultLabel.Text = $"Factorial of {number} is {result}.";
Metoda WebView.EvaluateJavaScriptAsync
wykonuje kod JavaScript określony jako argument i zwraca wynik jako string
. W tym przykładzie wywoływana jest funkcja factorial
JavaScript, która zwraca współczynnik number
w wyniku. Ta funkcja JavaScript jest zdefiniowana w lokalnym pliku HTML ładowanych przez WebView i jest wyświetlana w poniższym przykładzie:
<html>
<body>
<script type="text/javascript">
function factorial(num) {
if (num === 0 || num === 1)
return 1;
for (var i = num - 1; i >= 1; i--) {
num *= i;
}
return num;
}
</script>
</body>
</html>
Konfigurowanie natywnego elementu WebView na platformach iOS i Mac Catalyst
Natywna kontrolka WebView jest MauiWKWebView
w systemach iOS i Mac Catalyst, która wywodzi się z WKWebView
. Jedno z przeciążeń konstruktora MauiWKWebView
umożliwia określenie obiektu WKWebViewConfiguration
, który zawiera informacje o sposobie konfigurowania obiektu WKWebView
. Typowe konfiguracje obejmują ustawienie agenta użytkownika, udostępnienie plików cookie dla zawartości internetowej oraz wstrzykiwanie niestandardowych skryptów do tej zawartości.
Możesz utworzyć obiekt WKWebViewConfiguration
w aplikacji, a następnie skonfigurować jego właściwości zgodnie z potrzebami. Alternatywnie można wywołać metodę statyczną MauiWKWebView.CreateConfiguration
w celu pobrania obiektu WKWebViewConfiguration
programu MAUI platformy .NET, a następnie zmodyfikować go. Obiekt WKWebViewConfiguration
można następnie określić jako argument przeciążenia konstruktora MauiWKWebView
.
Ponieważ nie można zmienić konfiguracji natywnej WebView w systemach iOS i Mac Catalyst po utworzeniu widoku platformy programu obsługi, należy utworzyć niestandardowy delegat fabryki obsługi, aby go zmodyfikować:
#if IOS || MACCATALYST
using WebKit;
using CoreGraphics;
using Microsoft.Maui.Platform;
using Microsoft.Maui.Handlers;
#endif
...
#if IOS || MACCATALYST
Microsoft.Maui.Handlers.WebViewHandler.PlatformViewFactory = (handler) =>
{
WKWebViewConfiguration config = MauiWKWebView.CreateConfiguration();
config.ApplicationNameForUserAgent = "MyProduct/1.0.0";
return new MauiWKWebView(CGRect.Empty, (WebViewHandler)handler, config);
};
#endif
Notatka
Należy skonfigurować MauiWKWebView
z obiektem WKWebViewConfiguration
przed wyświetleniem WebView w aplikacji. Odpowiednie lokalizacje do tego celu można znaleźć w ścieżce uruchamiania aplikacji, na przykład w plikach MauiProgram.cs lub App.xaml.cs.
Ustawianie preferencji odtwarzania multimediów w systemach iOS i Mac Catalyst
Wbudowane odtwarzanie multimediów wideo HTML5, w tym autoodtwarzanie i obraz na obrazie, jest domyślnie włączone dla WebView w systemach iOS i Mac Catalyst. Aby zmienić to ustawienie domyślne lub ustawić inne preferencje odtwarzania multimediów, należy utworzyć niestandardowy delegat fabryki obsługi, ponieważ nie można zmienić preferencji odtwarzania multimediów po utworzeniu widoku platformy programu obsługi. Poniższy kod przedstawia przykład wykonywania tego zadania:
#if IOS || MACCATALYST
using WebKit;
using CoreGraphics;
using Microsoft.Maui.Platform;
using Microsoft.Maui.Handlers;
#endif
...
#if IOS || MACCATALYST
Microsoft.Maui.Handlers.WebViewHandler.PlatformViewFactory = (handler) =>
{
WKWebViewConfiguration config = MauiWKWebView.CreateConfiguration();
// True to play HTML5 videos inliine, false to use the native full-screen controller.
config.AllowsInlineMediaPlayback = false;
// True to play videos over AirPlay, otherwise false.
config.AllowsAirPlayForMediaPlayback = false;
// True to let HTML5 videos play Picture in Picture.
config.AllowsPictureInPictureMediaPlayback = false;
// Media types that require a user gesture to begin playing.
config.MediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypes.All;
return new MauiWKWebView(CGRect.Empty, (WebViewHandler)handler, config);
};
#endif
Aby uzyskać więcej informacji na temat konfigurowania WebView w systemie iOS, zobacz Konfigurowanie natywnego widoku WebView w systemach iOS i Mac Catalyst.
Inspekcjonuj WebView na Mac Catalyst
Aby użyć narzędzi dewelopera Safari do sprawdzenia zawartości WebView dla Mac Catalyst, dodaj następujący kod do swojej aplikacji:
#if MACCATALYST
Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping("Inspect", (handler, view) =>
{
if (OperatingSystem.IsMacCatalystVersionAtLeast(16, 6))
handler.PlatformView.Inspectable = true;
});
#endif
Ten kod dostosowuje maper właściwości dla WebViewHandler
na Mac Catalyst, aby umożliwić sprawdzanie zawartości WebView za pomocą narzędzi deweloperskich Safari. Aby uzyskać więcej informacji o programach obsługi, zobacz Handlers.
Aby użyć narzędzi deweloperskich Safari z aplikacją Mac Catalyst:
- Otwórz przeglądarkę Safari na komputerze Mac.
- W przeglądarce Safari zaznacz pole wyboru Ustawienia > Safari > Zaawansowane > Pokaż menu Dewelopera na pasku menu.
- Uruchom aplikację .NET MAUI Mac Catalyst.
- W przeglądarce Safari wybierz menu
Programowanie {Nazwa urządzenia}, w którym symbol zastępczy to Twoja nazwa urządzenia, taka jak . Następnie wybierz wpis pod nazwą aplikacji, który będzie również wyróżniać uruchomioną aplikację. Spowoduje to, że pojawi się okno Web inspector.
Uruchamianie przeglądarki systemowej
Możliwe jest otwarcie identyfikatora URI w przeglądarce internetowej systemu za pomocą klasy Launcher
, dostarczanej przez Microsoft.Maui.Essentials
. Wywołaj metodę OpenAsync
modułu uruchamiania i przekaż argument string
lub Uri
reprezentujący identyfikator URI do otwarcia:
await Launcher.OpenAsync("https://learn.microsoft.com/dotnet/maui");
Aby uzyskać więcej informacji, zobacz Launcher.