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関数に戻すにはどうすればよいですか?
編集
私はあなたがあなたのPCL(?)またはXamarin.Formsプロジェクト(?)まで値(この場合は結果)をプッシュするプロパティの変更を呼び出すことができるように、プロパティを含むインターフェイスをインプリメントするだろうと思っています – Digitalsa1nt
@ Digitalsa1nt値は既に 'PCL'から' result'プロパティに戻っています。私が抱えている問題は、この 'result'を' Javascript'関数に返すことです。 – user1