WebView
.NET Multi-platform App UI (.NET MAUI) WebView visar fjärrwebbsidor, lokala HTML-filer och HTML-strängar i en app. Innehållet som visas i en WebView innehåller stöd för CSS (Cascading Style Sheets) och JavaScript. Som standard innehåller .NET MAUI-projekt de plattformsbehörigheter som krävs för en WebView för att visa en fjärrwebbsida.
WebView definierar följande egenskaper:
-
Cookies, av typen
CookieContainer
, tillhandahåller lagring för en samling cookies. -
CanGoBack, av typen
bool
, anger om användaren kan navigera till föregående sidor. Det här är en skrivskyddad egenskap. -
CanGoForward, av typen
bool
, anger om användaren kan navigera framåt. Det här är en skrivskyddad egenskap. -
Source, av typen
WebViewSource
, representerar den plats som WebView visar. -
UserAgent, av typen
string
, representerar användaragenten. Standardvärdet är användaragenten för den underliggande plattformswebbläsaren ellernull
om det inte kan fastställas.
Dessa egenskaper stöds av BindableProperty-objekt, så de kan vara mål för databindningar och stylas.
Egenskapen Source
kan anges till ett UrlWebViewSource
objekt eller ett HtmlWebViewSource
objekt som båda härleds från WebViewSource
. En UrlWebViewSource
används för att läsa in en webbsida som anges med en URL, medan ett HtmlWebViewSource
-objekt används för att läsa in en lokal HTML-fil eller lokal HTML.
WebView definierar en Navigating
händelse som aktiveras när sidnavigering startar och en Navigated
händelse som aktiveras när sidnavigering slutförs. Det WebNavigatingEventArgs
objekt som medföljer händelsen Navigating
definierar en Cancel
egenskap av typen bool
som kan användas för att avbryta navigeringen. Det WebNavigatedEventArgs
objekt som medföljer händelsen Navigated
definierar en Result
egenskap av typen WebNavigationResult
som anger navigeringsresultatet.
WebView definierar följande händelser:
-
Navigating
, som aktiveras när sidnavigering startar. DetWebNavigatingEventArgs
objekt som medföljer den här händelsen definierar enCancel
egenskap av typenbool
som kan användas för att avbryta navigeringen. -
Navigated
, som aktiveras när sidnavigering slutförs. DetWebNavigatedEventArgs
objekt som medföljer den här händelsen definierar enResult
egenskap av typenWebNavigationResult
som anger navigeringsresultatet. -
ProcessTerminated
genereras när en WebView process slutar oväntat. DetWebViewProcessTerminatedEventArgs
objekt som medföljer den här händelsen definierar plattformsspecifika egenskaper som anger varför processen misslyckades.
Viktig
En WebView måste ange sina egenskaper för HeightRequest och WidthRequest när den finns i en HorizontalStackLayout, StackLayouteller VerticalStackLayout. Om du underlåter att ange dessa egenskaper kommer WebView inte att återges.
Visa en webbsida
Om du vill visa en fjärrwebbsida anger du egenskapen Source
till en string
som anger URI:n:
<WebView Source="https://learn.microsoft.com/dotnet/maui" />
Motsvarande C#-kod är:
WebView webvView = new WebView
{
Source = "https://learn.microsoft.com/dotnet/maui"
};
URI:er måste vara helt utformade med det angivna protokollet.
Not
Trots att egenskapen Source
är av typen WebViewSource
kan egenskapen anges till en strängbaserad URI. Det beror på att .NET MAUI innehåller en typkonverterare och en implicit konverteringsoperator som konverterar den strängbaserade URI:n till ett UrlWebViewSource
objekt.
Konfigurera App Transport Security på iOS och Mac Catalyst
Sedan version 9 tillåter iOS endast att din app kommunicerar med säkra servrar. En app måste välja att aktivera kommunikation med osäkra servrar.
Följande Info.plist konfiguration visar hur du aktiverar en specifik domän för att kringgå Kraven för 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>
Det är bästa praxis att bara aktivera specifika domäner för att kringgå ATS, så att du kan använda betrodda webbplatser samtidigt som du drar nytta av ytterligare säkerhet på ej betrodda domäner.
Följande Info.plist konfiguration visar hur du inaktiverar ATS för en app:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Viktig
Om din app kräver en anslutning till en osäker webbplats bör du alltid ange domänen som ett undantag med hjälp av NSExceptionDomains
-nyckeln i stället för att stänga av ATS helt med hjälp av NSAllowsArbitraryLoads
-nyckeln.
Visa lokal HTML
Om du vill visa infogad HTML anger du egenskapen Source
till ett HtmlWebViewSource
objekt:
<WebView>
<WebView.Source>
<HtmlWebViewSource Html="<HTML><BODY><H1>.NET MAUI</H1><P>Welcome to WebView.</P></BODY><HTML>" />
</WebView.Source>
</WebView>
I XAML kan HTML-strängar bli olästa på grund av att <
- och >
-symbolerna inte kan läsas. Därför kan HTML för bättre läsbarhet anges i ett CDATA
avsnitt:
<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>
Motsvarande C#-kod är:
WebView webView = new WebView
{
Source = new HtmlWebViewSource
{
Html = @"<HTML><BODY><H1>.NET MAUI</H1><P>Welcome to WebView.</P></BODY></HTML>"
}
};
Visa en lokal HTML-fil
Om du vill visa en lokal HTML-fil lägger du till filen i mappen Resources\Raw i appprojektet och ställer in dess byggåtgärd på MauiAsset. Sedan kan filen laddas in från infogad HTML som är definierad i ett objekt HtmlWebViewSource
och som anges som värdet för egenskapen 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>
Den lokala HTML-filen kan läsa in CSS (Cascading Style Sheets), JavaScript och bilder om de också har lagts till i ditt appprojekt med MauiAsset build-åtgärden.
Mer information om råtillgångar finns i Råtillgångar.
Läsa in innehåll på nytt
WebView har en Reload
metod som kan anropas för att läsa in källan igen:
WebView webView = new WebView();
...
webView.Reload();
När Reload
-metoden anropas utlöses händelsen ReloadRequested
, vilket indikerar att en begäran har gjorts om att läsa in det aktuella innehållet igen.
Utför navigering
WebView stöder programmeringsnavigering med metoderna GoBack
och GoForward
. Dessa metoder aktiverar navigering via WebView-sidstacken och bör bara anropas efter att du har kontrollerat värdena för egenskaperna CanGoBack
och CanGoForward
:
WebView webView = new WebView();
...
// Go backwards, if allowed.
if (webView.CanGoBack)
{
webView.GoBack();
}
// Go forwards, if allowed.
if (webView.CanGoForward)
{
webView.GoForward();
}
När sidnavigering sker i en WebView, antingen initierad programmatiskt eller av användaren, inträffar följande händelser:
-
Navigating
, som aktiveras när sidnavigering startar. DetWebNavigatingEventArgs
objekt som medföljer händelsenNavigating
definierar enCancel
egenskap av typenbool
som kan användas för att avbryta navigeringen. -
Navigated
, som aktiveras när sidnavigering slutförs. DetWebNavigatedEventArgs
objekt som medföljer händelsenNavigated
definierar enResult
egenskap av typenWebNavigationResult
som anger navigeringsresultatet.
Hantera behörigheter för Android
När du bläddrar till en sida som begär åtkomst till enhetens inspelningsmaskinvara, till exempel kameran eller mikrofonen, måste behörighet beviljas av WebView-kontrollen.
WebView
-kontrollen använder Android.Webkit.WebChromeClient typ på Android för att reagera på behörighetsbegäranden. Den WebChromeClient
implementeringen som tillhandahålls av .NET MAUI ignorerar dock behörighetsbegäranden. Du måste skapa en ny typ som ärver från MauiWebChromeClient
och godkänner behörighetsbegäranden.
Viktig
För att kunna anpassa WebView
för att godkänna behörighetsbegäranden med den här metoden krävs Android API 26 eller senare.
Behörighetsbegäranden från en webbsida till WebView
kontroll skiljer sig från behörighetsbegäranden från .NET MAUI-appen till användaren. .NET MAUI-appbehörigheter begärs och godkänns av användaren för hela appen. Den WebView
kontrollen är beroende av apparnas möjlighet att komma åt maskinvaran. För att illustrera det här konceptet bör du överväga en webbsida som begär åtkomst till enhetens kamera. Även om den begäran godkänns av WebView
kontroll, men .NET MAUI-appen inte hade godkännande av användaren att komma åt kameran, skulle webbsidan inte kunna komma åt kameran.
Följande steg visar hur du fångar upp behörighetsbegäranden från WebView
kontroll för att använda kameran. Om du försöker använda mikrofonen skulle stegen vara liknande förutom att du skulle använda mikrofonrelaterade behörigheter i stället för kamerarelaterade behörigheter.
Lägg först till nödvändiga appbehörigheter i Android-manifestet. Öppna filen Platforms/Android/AndroidManifest.xml och lägg till följande i noden
manifest
:<uses-permission android:name="android.permission.CAMERA" />
Vid något tillfälle i din app, till exempel när sidan som innehåller en
WebView
kontroll läses in, begär du behörighet från användaren för att ge appen åtkomst till kameran.private async Task RequestCameraPermission() { PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.Camera>(); if (status != PermissionStatus.Granted) await Permissions.RequestAsync<Permissions.Camera>(); }
Lägg till följande klass i mappen Platforms/Android och ändra rotnamnområdet så att det matchar projektets namnområde (lägg inte till
.Platforms.Android
i namnområdet):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); } }
I föregående kodfragment ärver klassen
MyWebChromeClient
frånMauiWebChromeClient
och åsidosätterOnPermissionRequest
-metoden för att fånga upp begäranden om webbplatsbehörigheter. Varje behörighetsobjekt kontrolleras för att se om det matcharPermissionRequest.ResourceVideoCapture
strängkonstant, som representerar kameran. Om en kamerabehörighet matchas kontrollerar koden om appen har behörighet att använda kameran. Om den har behörighet beviljas webbsidans begäran.Använd SetWebChromeClient-metoden på Androids
WebView
-kontroll för att ställa in chrome-klienten påMyWebChromeClient
. Följande två objekt visar hur du kan ange chrome-klienten:Med en .NET MAUI-
WebView
-kontroll med namnettheWebViewControl
kan du ange chrome-klienten direkt i plattformsvyn, vilket är Android-kontrollen:((IWebViewHandler)theWebViewControl.Handler).PlatformView.SetWebChromeClient(new MyWebChromeClient((IWebViewHandler)theWebViewControl.Handler));
Du kan också använda mappning av hanteraregenskap för att tvinga alla
WebView
kontroller att använda chrome-klienten. Mer information finns i Handlers.Följande kodfragments
CustomizeWebViewHandler
-metod ska anropas när appen startar, till exempel i metodenMauiProgram.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 }
Ange cookies
Cookies kan ställas in på en WebView så att de skickas med webbbegäran till den angivna URL:en. Ställ in cookies genom att lägga till Cookie
objekt i en CookieContainer
, och ange sedan containern som värdet för den bindbara egenskapen WebView.Cookies
. Följande kod visar ett exempel:
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() };
I det här exemplet läggs en enda Cookie
till i CookieContainer
-objektet, som sedan anges som värdet för egenskapen WebView.Cookies
. När WebView skickar en webbbegäran till den angivna URL:en skickas cookien med begäran.
Anropa JavaScript
WebView innehåller möjligheten att anropa en JavaScript-funktion från C# och returnera eventuella resultat till den anropande C#-koden. Det här interopet utförs med metoden EvaluateJavaScriptAsync
, som visas i följande exempel:
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}.";
Metoden WebView.EvaluateJavaScriptAsync
utvärderar JavaScript som anges som argumentet och returnerar alla resultat som ett string
. I det här exemplet anropas JavaScript-funktionen factorial
, som returnerar faktorialen av number
som resultat. Den här JavaScript-funktionen definieras i den lokala HTML-fil som WebView läser in och visas i följande exempel:
<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>
Konfigurera den interna WebView på iOS och Mac Catalyst
Den inbyggda WebView-kontrollen är en MauiWKWebView
på iOS och Mac Catalyst, som härstammar från WKWebView
. En av MauiWKWebView
konstruktoröverlagringar gör att ett WKWebViewConfiguration
objekt kan anges, vilket ger information om hur du konfigurerar WKWebView
-objektet. Vanliga konfigurationer är att ställa in användaragenten, ange cookies för att göra tillgängligt för ditt webbinnehåll och mata in anpassade skript i webbinnehållet.
Du kan skapa ett WKWebViewConfiguration
objekt i din app och sedan konfigurera dess egenskaper efter behov. Du kan också anropa metoden static MauiWKWebView.CreateConfiguration
för att hämta .NET MAUI:s WKWebViewConfiguration
objekt och sedan ändra det. Objektet WKWebViewConfiguration
kan sedan anges som ett argument för överladdning av konstruktorn MauiWKWebView
.
Eftersom konfigurationen av den interna WebView inte kan ändras på iOS och Mac Catalyst när hanterarens plattformsvy har skapats bör du skapa en anpassad hanterarfabriksdelegat för att ändra den:
#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
Not
Du bör konfigurera MauiWKWebView
med ett WKWebViewConfiguration
objekt innan en WebView visas i din app. Lämpliga platser för att göra detta finns i appens startsökväg, till exempel i MauiProgram.cs eller App.xaml.cs.
Ange inställningar för medieuppspelning på iOS och Mac Catalyst
Infogad medieuppspelning av HTML5-video, inklusive automatisk uppspelning och bild i bilden, är aktiverad som standard för WebView på iOS och Mac Catalyst. Om du vill ändra den här standardinställningen eller ange andra inställningar för medieuppspelning bör du skapa ett fabriksdelegat för anpassad hanterare eftersom inställningar för medieuppspelning inte kan ändras när hanterarens plattformsvy har skapats. Följande kod visar ett exempel på hur du gör detta:
#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
Mer information om hur du konfigurerar en WebView på iOS finns i Konfigurera den interna WebView på iOS och Mac Catalyst.
Inspektera en WebView på Mac Catalyst
Om du vill använda Safari-utvecklarverktyg för att inspektera innehållet i en WebView på Mac Catalyst lägger du till följande kod i din app:
#if MACCATALYST
Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping("Inspect", (handler, view) =>
{
if (OperatingSystem.IsMacCatalystVersionAtLeast(16, 6))
handler.PlatformView.Inspectable = true;
});
#endif
Den här koden anpassar egenskapsmapparen för WebViewHandler
på Mac Catalyst för att göra WebView innehåll besiktigat av Safari-utvecklarverktyg. Mer information om hanterare finns i Handlers.
Så här använder du Safari-utvecklarverktyg med en Mac Catalyst-app:
- Öppna Safari på din Mac.
- I Safari markerar du kryssrutan Safari > Inställningar > Avancerat > Visa Utvecklar-menyn i menyraden.
- Kör .NET MAUI Mac Catalyst-appen.
- I Safari väljer du menyn Utveckla > {Enhetsnamn}, där platshållaren
{Device name}
är ditt enhetsnamn, till exempelMacbook Pro
. Välj sedan posten under ditt appnamn, vilket även markerar din körande app. Detta gör att fönstret för webb-inspektören visas.
Starta systemwebbläsaren
Det går att öppna en URI i systemwebbläsaren med klassen Launcher
, som tillhandahålls av Microsoft.Maui.Essentials
. Anropa startprogrammets OpenAsync
-metod och skicka in ett string
- eller Uri
argument som representerar den URI som ska öppnas:
await Launcher.OpenAsync("https://learn.microsoft.com/dotnet/maui");
Mer information finns i Launcher.