Показать подсказку, чтобы узнать местоположение
Я использую контроллер 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
Я пробовал решение, упомянутое в этот, но все же он не отображает приглашение.
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;
}
}
}
манифеста
<?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, но никакой разницы.
Пример приложения, которое делает аналогичную вещь
![введите описание изображения здесь]()
Ответы
Ответ 1
Обновленный ответ (с кодом)
В случае 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 output]()
И, в случае iOS, вам нужно установить описание NSLocationWhenInUseUsageDescription
в файле info.plist
.
![info.plist]()
И он отображает приглашение.
![ios output]()
Полный образец кода можно найти по адресу эта ссылка
Оригинальный ответ
В случае Android - вы сможете решить эту проблему, добавив рендеринг для платформы для WebView и реализуйте обработку разрешений добавив пользовательский WebChromeClient.
В случае iOS - вам нужно добавить описание NSLocationWhenInUseUsageDescription в свой информационный план
Ответ 2
Но это приглашение не отображается, когда у меня есть этот веб-сайт в WebView (из приложения).
Если я понял, вы обертываете это в приложении.
Это не ожидаемый пользовательский опыт от мобильного приложения. ваше приложение должно использовать разрешения на размещение платформы (например, iOS, Android), чтобы получить одобрение пользователя.
Xamarin позволит вам получить доступ к местоположению на каждой платформе совершенно по-другому. Если приложение Xamarin имеет доступ к местоположению, а веб-просмотр должен наследовать эти разрешения. Поэтому, возможно, стоит попробовать этот рецепт и попробуйте установить местоположение до открытия самого веб-сайта