我已經使用HybridWebView from XLabs構建一個可以與C#代碼進行通信的HybridWebView。我已經構建了自定義渲染器來執行此操作。簡單來說,我有:是否有可能使用Xamarin.iOS從C#返回一個字符串到JavaScript?
的iOS
public class HybridWebViewRenderer : ViewRenderer<HybridWebView, WKWebView>, IWKScriptMessageHandler
{
const string JavaScriptFunctionTemplate = "function {0}(){{window.webkit.messageHandlers.invokeAction.postMessage('{0}|' + JSON.stringify(arguments));}}";
protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
userController = new WKUserContentController();
foreach (var f in Element.RegisteredFunctions.Where(ff => !ff.IsInjected))
{
var script = new WKUserScript(new NSString(string.Format(JavaScriptFunctionTemplate, f.Name)), WKUserScriptInjectionTime.AtDocumentEnd, false);
userController.AddUserScript(script);
f.Injected();
}
userController.AddScriptMessageHandler(this, "invokeAction");
var config = new WKWebViewConfiguration { UserContentController = userController };
var webView = new WKWebView(Frame, config)
{
NavigationDelegate = new CustomWKNavigationDelegate(this.Element)
};
SetNativeControl(webView);
}
if (e.OldElement != null)
{
userController.RemoveAllUserScripts();
userController.RemoveScriptMessageHandler("invokeAction");
var hybridWebView = e.OldElement as HybridWebView;
hybridWebView.Cleanup();
}
if (e.NewElement != null)
{
Load(Element.Uri);
}
}
public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)
{
var bits = message.Body.ToString().Split('|');
if (bits.Count() == 2)
{
var result = Element.InvokeFunction(bits[0], bits[1]);
//How do I return result back to Javascript function?
}
}
的InvokeFunction
方法返回一個值result
它是一個字符串。
如何將此字符串result
返回給注入的javascript函數?
編輯
我需要修改我的JavaScriptFunctionTemplate
我在XLabs注意到他們有一個類似的template但附加一些東西到end
我懷疑你會補充一個包含屬性的接口,所以你可以調用一個屬性改變,將值推到你的PCL(?)或Xamarin.Forms項目(?) – Digitalsa1nt
@ Digitalsa1nt值已經從'PCL'回到上面代碼中的'result'屬性中。我遇到的問題是將這個'result'返回到'Javascript'函數。 – user1