2017-07-20 39 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函數?

編輯

我需要修改我的JavaScriptFunctionTemplate我在XLabs注意到他們有一個類似的template但附加一些東西到end

+0

我懷疑你會補充一個包含屬性的接口,所以你可以調用一個屬性改變,將值推到你的PCL(?)或Xamarin.Forms項目(?) – Digitalsa1nt

+0

@ Digitalsa1nt值已經從'PCL'回到上面代碼中的'result'屬性中。我遇到的問題是將這個'result'返回到'Javascript'函數。 – user1

回答

1

是否有任何理由,你爲什麼不能簡單地「重新 - 呼叫」使用方法described here?

他們的榜樣你的函數:

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

所以你會是這樣的:

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. 
    } 
} 

編輯:

只想encorporate的LINK的OP發現,因爲它看起來是一個堅實指導在Objective-C的解決方案這是相當直接轉換爲Xamarin C#。

+1

這是我發現在iOS上的應用程序和webview之間進行通信的唯一方式。更多信息[這裏](http://www.joshuakehn.com/2014/10/29/using-javascript-with-wkwebview-in-ios-8.html) – user1

相關問題