Показать подсказку, чтобы узнать местоположение

Я использую контроллер 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 имеет доступ к местоположению, а веб-просмотр должен наследовать эти разрешения. Поэтому, возможно, стоит попробовать этот рецепт и попробуйте установить местоположение до открытия самого веб-сайта