2017-07-20 23 views
1

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関数に戻すにはどうすればよいですか?

編集

私は、彼らが同様のtemplateを持っていますが、end

+0

私はあなたがあなたのPCL(?)またはXamarin.Formsプロジェクト(?)まで値(この場合は結果)をプッシュするプロパティの変更を呼び出すことができるように、プロパティを含むインターフェイスをインプリメントするだろうと思っています – Digitalsa1nt

+0

@ Digitalsa1nt値は既に 'PCL'から' result'プロパティに戻っています。私が抱えている問題は、この 'result'を' Javascript'関数に返すことです。 – user1

答えて

1

に何かを追加XLabsに気づく私のJavaScriptFunctionTemplateを編集する必要がありますあなたができなかった理由何らかの理由で単に「再はあります

void OnCallJavaScriptButtonClicked (object sender, EventArgs e) 
{ 
    ... 
    int number = int.Parse (numberEntry.Text); 
    int end = int.Parse (stopEntry.Text); 

    webView.Eval (string.Format ("printMultiplicationTable({0}, {1})", number, end)); 
} 
0123:あなたの関数はメソッド described here?

彼らの例を使用して「-call

だから、あなたはのようになります。

const string JavaScriptFunctionTemplate = "function {0}(){{window.webkit.messageHandlers.invokeAction.postMessage('{0}|' + JSON.stringify(arguments));}}"; 

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]); 

     webView.Eval(string.Format ("JavaScriptFunctionTemplate({0})", result)); // or however your parameter structure is. 
    } 
} 

EDIT:

はちょうどそれは、Objective-Cの溶液に固体のガイドになりそうだとOPが見つかっLINKをencorporateしたいですXamarin C#に変換するのはかなり簡単です。

+1

これは私のアプリとwebviewの間で 'iOS'の間で通信するために見つけた唯一の方法です。詳細はこちら[こちら](http://www.joshuakehn.com/2014/10/29/using-javascript-with-wkwebview-in-ios-8.html) – user1

関連する問題