Mostrar mensaje para conocer la ubicación
Estoy usando Xamarin WebView controlador para mostrar un sitio web (en iOS / Android). La página de inicio del sitio web le pide que acceda a la ubicación del dispositivo. Pero ese indicador no se muestra cuando tengo este sitio web en un WebView (de la aplicación). Cuando abro este sitio en el navegador, desde el mismo dispositivo móvil se muestra el cuadro de mensaje. Me pregunto si es posible tener tales mensajes en Xamarin WebView?
Aquí hay un ejemplo.
- FormsAppCompatActivity y MasterDetailPage: no hay barra de herramientas
- Cómo configurar la orientación ContentPage en Xamarin.Forms
- Superposición blanca en WebView después de la actualización a AppCompat con Xamarin Forms
- ¿Puedo diseñar la interfaz de usuario en Xamarin.Forms mediante XAML
- Xamarin.Forms Tome la foto con la cámara muestra la orientación equivocada y se bloquea en el botón Atrás
Esto es todo lo que tengo en la aplicación Xamarin.
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:nCollar" x:Class="nCollar.MainPage"> <ContentPage.Padding> <OnPlatform x:TypeArguments="Thickness"> <OnPlatform.iOS>0,20,0,0</OnPlatform.iOS> <OnPlatform.Android>0,0,0,0</OnPlatform.Android> <OnPlatform.WinPhone>0,0,0,0</OnPlatform.WinPhone> </OnPlatform> </ContentPage.Padding> <WebView x:Name="webView" Grid.Row="0" VerticalOptions="FillAndExpand" Source="https://www.ncollar.com.au/"/> </ContentPage>
ACTUALIZACIÓN 1
Androide
He intentado la solución mencionada en esta publicación, pero aún así no muestra la solicitud.
WebViewRenderer.cs
using Android.Webkit; using Xamarin.Forms.Platform.Android; [assembly: Xamarin.Forms.ExportRenderer(typeof(TestApp.Controls.WebView), typeof(TestApp.Droid.Renderers.WebViewRenderer))] namespace TestApp.Droid.Renderers { public class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e) { base.OnElementChanged(e); if (this.Control == null) { return; } var webView = this.Element as TestApp.Controls.WebView; if (webView == null) { return; } // webView. ings.JavaScriptEnabled = true; this.Control.Settings.DomStorageEnabled = true; this.Control.Settings.DisplayZoomControls = true; this.Control.Settings.BuiltInZoomControls = true; this.Control.Settings.SetGeolocationEnabled(true); this.Control.Settings.JavaScriptCanOpenWindowsAutomatically = true; this.Control.SetWebViewClient(new GeoWebViewClient()); this.Control.SetWebChromeClient(new GeoWebChromeClient()); } } public class GeoWebChromeClient : WebChromeClient { public override void OnGeolocationPermissionsShowPrompt(string origin, GeolocationPermissions.ICallback callback) { callback.Invoke(origin, true, false); } } public class GeoWebViewClient : WebViewClient { public override bool ShouldOverrideUrlLoading(WebView view, string url) { view.LoadUrl(url); return true; } } }
Manifiesto
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application android:label="TestApp.Android"></application> </manifest>
IOS
Probado NSLocationWhenInUseUsageDescription
en el archivo plist, pero no hay diferencia.
Ejemplo de aplicación que hace algo similar
- Hacer desaparecer una barra de navegación en Xamarin.Forms
- Xamarin Forms Navegación de página MasterDetail causando un accidente en android , Funciona en iOS y UWP
- Consulta del cliente de Azure Mobile Service que no devuelve el control a Xamarin Form android client app
- ¿Cómo puedo borrar la pila de navegación?
- Xamarin Forms PCL HttpClient lanzando una excepción no controlada en Android
- Xamarin Forms ListView Programatic Refresh No se detiene en Android cuando se carga la página
- ¿Por qué Xamarin.Forms es tan lento al mostrar algunas etiquetas (especialmente en Android)?
- Xamarin con Visual Studio: pantalla en blanco al depurar
Respuesta actualizada (con código)
En el caso de Android – necesitará un procesador personalizado para su control WebView. (Ref: esencia )
public class ExtendedWebViewRenderer : WebViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e) { base.OnElementChanged(e); if (e.OldElement != null || Element == null) { return; } Control.Settings.JavaScriptEnabled = true; Control.Settings.SetGeolocationEnabled(true); Control.Settings.SetGeolocationDatabasePath(Control.Context.FilesDir.Path); Control.SetWebViewClient(new CustomWebViewClient()); Control.SetWebChromeClient(new CustomChromeClient(Control.Context)); } } public class CustomWebViewClient : WebViewClient { public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url) { view.LoadUrl(url); return true; } } public class CustomChromeClient : WebChromeClient { private readonly Context _context; public CustomChromeClient(Context context) { _context = context; } public override void OnGeolocationPermissionsShowPrompt(string origin, GeolocationPermissions.ICallback callback) { const bool remember = false; var builder = new AlertDialog.Builder(_context); builder.SetTitle("Location") .SetMessage(string.Format("{0} would like to use your current location", origin)) .SetPositiveButton("Allow", (sender, args) => callback.Invoke(origin, true, remember)) .SetNegativeButton("Disallow", (sender, args) => callback.Invoke(origin, false, remember)); var alert = builder.Create(); alert.Show(); } }
Permisos de manifiesto
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />
Ejemplo de uso
<StackLayout Margin="30" BackgroundColor="#ededed"> <Label Text="WebView location prompt sample" Margin="15" HorizontalOptions="Center" /> <local:ExtendedWebView x:Name="webView" Source="https://www.yellowpages.com/" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" /> </StackLayout>
Y, en el caso de iOS , es necesario establecer la descripción NSLocationWhenInUseUsageDescription
en el archivo info.plist
.
Y muestra el mensaje.
Se puede encontrar un ejemplo de código completo en este enlace
Respuesta original
En el caso de Android – usted debería ser capaz de resolver esto mediante la adición de un renderizador de plataforma específica para WebView e implementar el manejo de permisos mediante la adición de un WebChromeClient personalizado .
En el caso de iOS – es necesario agregar la descripción de NSLocationWhenInUseUsageDescription en su información plist
Pero ese indicador no se muestra cuando tengo este sitio web en un WebView (de la aplicación).
Si lo tengo bien, estás envolviendo esto en una aplicación. Esta no es la experiencia de usuario esperada de una aplicación para móviles. Su aplicación debe utilizar los permisos de ubicación de la plataforma (por ejemplo, iOS, Android) para obtener la aprobación del usuario.
Xamarin le permitirá acceder a la ubicación en cada plataforma de manera muy diferente. Si la aplicación Xamarin tiene acceso a la ubicación que la vista web debe heredar estos permisos. Por lo tanto, puede ser que valga la pena probar esta receta y tratar de acceder a la ubicación antes de abrir la vista web
- Android: descargar archivo grande
- Adición de entradas específicas de la aplicación en el menú Configuración de Android