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.

Introduzca aquí la descripción de la imagen

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

Introduzca aquí la descripción de la imagen

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> 

Salida del androide

Y, en el caso de iOS , es necesario establecer la descripción NSLocationWhenInUseUsageDescription en el archivo info.plist .

Lista de información

Y muestra el mensaje.

Ios salida

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

  • Xamarin Forms ToolBarItem (Número sobre el icono) Notificación
  • ¿Cómo configurar el mapa en el proyecto pcl de xamarin.forms?
  • Cómo personalizar el icono de flecha, el icono de la página y el título de la página en MasterDetailPage - Xamarin.Forms
  • Formatos Xamarin desajuste de tamaño de imagen
  • Xamarin.Forms Switch Control no es visible en Android antes de seleccionar un control de entrada
  • Xamarin.Forms ListView OutOfMemoryError excepción en Android
  • Xamarin Android Crash en Inicio "Got a SIGSEGV"
  • Xamarin.Forms: alineación incorrecta del texto del botón después del clic (Android)
  • Xamarin - Visual Studio está atascado en zipalign.exe
  • GetObject <T> de Akavache se bloquea cuando se espera. Alguna idea de lo que está mal aquí?
  • ¿Cómo mostrar el cuadro de alerta con Xamarin.Forms para su validación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.