显示提示知道位置

我使用Xamarin WebView控制器来显示一个网站(在iOS / Android中)。 网站的主页提示访问设备位置。 但是这个提示并没有显示,当我有一个WebView(从应用程序)这个网站。 当我在浏览器上打开这个网站时,从同一移动设备上显示消息框。 我只是想知道是否有可能在Xamarin WebView上有这样的提示?

这里是一个示例提示。

在这里输入图像说明

这是我在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> 

更新1

Android的

我已经尝试了这篇文章中提到的解决scheme,但仍然没有显示提示。

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; } } } 

performance

 <?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版

试过NSLocationWhenInUseUsageDescription中的plist文件,但是没有区别。

示例应用程序,做类似的事情

在这里输入图像说明

Solutions Collecting From Web of "显示提示知道位置"

更新答案(附代码)

在Android的情况下 – 您将需要为您的WebView控件自定义渲染器。 (ref: gist )

 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(); } } 

清单权限

 <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" /> 

使用示例

 <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> 

android输出

而且, 对于iOS ,您需要在info.plist文件中设置NSLocationWhenInUseUsageDescription描述。

info.plist中

并显示提示。

ios输出

完整的代码示例可以在此链接find


原始答案

在Android的情况下,您应该能够通过为WebView添加平台特定的渲染器来解决此问题,并通过添加自定义WebChromeClient来实现权限处理。

在iOS的情况下 – 你需要在你的信息plist中添加NSLocationWhenInUseUsageDescription描述

但是这个提示并没有显示,当我有一个WebView(从应用程序)这个网站。

如果我说得对,那么你就把它包装在一个应用程序中。 这不是来自移动应用程序的预期用户体验。 你的应用程序应该使用平台(例如iOS,Android)的位置权限,以获得用户的认可。

Xamarin会让你在不同的平台上访问位置。 如果Xamarin应用程序有权访问位置,则webview应inheritance这些权限。 所以它可能值得尝试这个配方,并尝试在打开webview本身之前的位置