Cha*_*thJ 10 android webview ios xamarin xamarin.forms
我使用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>
Run Code Online (Sandbox Code Playgroud)
更新1
Android的
我已经尝试过这篇文章中提到的解决方案,但它仍然没有显示提示.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
表现
<?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>
Run Code Online (Sandbox Code Playgroud)
iOS版
尝试NSLocationWhenInUseUsageDescription在plist文件中,但没有区别.
对于 Android - 您将需要一个用于 WebView 控件的自定义渲染器。(参考:要点)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
清单权限
<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" />
Run Code Online (Sandbox Code Playgroud)
使用示例
<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>
Run Code Online (Sandbox Code Playgroud)
并且,如果是 iOS,您需要在文件NSLocationWhenInUseUsageDescription中设置描述info.plist。
并显示提示。
原答案
对于 Android - 您应该能够通过为 WebView 添加特定于平台的渲染器来解决此问题,并通过添加自定义 WebChromeClient 来实现权限处理。
如果是 iOS - 您需要在信息 plist 中添加NSLocationWhenInUseUsageDescription 描述
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |