У меня есть приложение Xamarin.Forms с веб-просмотром, когда я просматриваю веб-страницы и нажимаю на ввод, чтобы открыть «диалоговое окно выбора файла», диалоговое окно не появляется.
Итак, у меня есть создал свой собственный WebViewRenderer, чтобы разрешить некоторые операции, но никак, я не могу найти способ заставить его работать.
Я добавил это, но это не помогает: Control.Settings.AllowFileAccess = true;
У меня вообще нет сообщения об ошибке ... у кого-то есть идея?
PS: Я искал другие сообщения, но, похоже, ничего не помогло.
Вот код WebViewRenderer для Android:
using Foundation;
using SmartPixel.SoCloze.Mobile.Interop;
using SmartPixel.SoCloze.Mobile.iOS.Renderers;
using System.Net;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]
namespace SmartPixel.SoCloze.Mobile.iOS.Renderers
{
public class HybridWebViewRenderer : WkWebViewRenderer, IWKScriptMessageHandler
{
private const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
private WKUserContentController _userController;
public HybridWebViewRenderer() : this(new WKWebViewConfiguration())
{
}
public HybridWebViewRenderer(WKWebViewConfiguration config) : base(config)
{
_userController = config.UserContentController;
var script = new WKUserScript(new NSString(JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
_userController.AddUserScript(script);
_userController.AddScriptMessageHandler(this, "invokeAction");
}
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
//---- Interop
if (e.OldElement != null)
{
_userController.RemoveAllUserScripts();
_userController.RemoveScriptMessageHandler("invokeAction");
HybridWebView hybridWebViewMain = e.OldElement as HybridWebView;
hybridWebViewMain?.Cleanup();
}
if (e.NewElement != null)
{
}
//---- Cookies
if (e.OldElement == null)
{
HybridWebView hybridWebViewMain = this.Element as HybridWebView;
hybridWebViewMain.OnRequestNativeSetCookie += AppCookiesManager_OnSetCookie;
hybridWebViewMain.OnRequestNativeCookieRead += HybridWebView_OnRequestNativeCookieRead;
hybridWebViewMain.OnRequestNativeCookieWrite += HybridWebView_OnRequestNativeCookieWrite;
}
}
public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)
{
((HybridWebView)Element).InvokeAction(message.Body.ToString());
}
private async void AppCookiesManager_OnSetCookie(Cookie cookie)
{
string js = $"document.cookie = '{cookie.Name}={cookie.Value};Secure;path=/'";
this.EvaluateJavaScript(js, null);
}
private void HybridWebView_OnRequestNativeCookieRead(string url, CookieCollection cookies)
{
}
private void HybridWebView_OnRequestNativeCookieWrite(string url, CookieCollection cookies)
{
}
}
}