2016-09-20 9 views
1

私は、Webプロジェクトに接続されたモバイルアプリケーションの開発を開始しています。ウェブ上で、ユーザは、少数の人物の上の特定の場所をクリックして選択することができる。いくつかの選択の一つのは、このWebViewとホストアプリケーションの間でデータを渡す

enter image description here

のように見える私は本当にこれが標準コントロールを使用して達成するのは簡単だろう(?)はないと思うので、私はそれがホストするWebViewを使用するのが最も簡単だろうと思いました選択を処理するコード部分。

古い出血を編集したい場合などの場所を設定するには、C#からJSを呼び出す方法についてXamarinのガイドに従うことができますが、戻り値は無効です。私はXamarin.Forms.WebViewからデータを取得する方法を見つけることができませんでした。助言がありますか?

答えて

0

これは、ターゲットとするプラットフォームとプラットフォームのバージョンによって大きく異なります。

実際にWebViewを使用したい場合は、XLabs Hybrid WebViewをご覧ください。 XLabs'メソッド以外

、あなたは簡単にUIWebView.EvaluateJavascript()メソッドを使用してiOSのレンダラから文字列を取り戻すことができ、その後、あなたはいつも私が成功したアンドロイドに戻って使用していたXamarinのAndroid WebViewレンダラ(link)、中WebChromClient.OnJsAlertを上書きすることができます4.1。

のような何か

Xamarinは、フォーム...(何かが動作しないか、欠落している場合、私に教えてください、私はこれを入力したとマイナーな問題があるかもしれないので、余分なコードを削除)

コード:

public class SomethingWebView : WebView { } 
UIWebViewDelegate

iOSのWebViewのレンダラ:WebViewClientWebChromeClient

[assembly: Xamarin.Forms.ExportRenderer(typeof(SomethingWebView), typeof(Your.Droid.Namespace.SomethingWebViewRenderer))] 

namespace Your.Droid.Namespace.Renderer { 

public class SomethingWebViewRenderer : WebViewRenderer { 

    protected override void OnElementChanged(VisualElementChangedEventArgs e) { 
     base.OnElementChanged(e); 

     if(e.OldElement == null) { 
      Delegate = new SomethingWebViewDelegate(); 
     } 
    } 
} 

internal class SomethingWebViewDelegate : UIWebViewDelegate { 

    public override void LoadingFinished(UIWebView webView) { 
     string something = webView.EvaluateJavascript("(function() { return 'something'; })()"); 
    } 
} 
} 

AndroidのWebViewのレンダラ:

[assembly: Xamarin.Forms.ExportRenderer(typeof(SomethingWebView), typeof(Your.iOS.Namespace.SomethingWebViewRenderer))] 

namespace Your.iOS.Namespace.Renderer { 

public class SomethingWebViewRenderer : WebViewRenderer { 

    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) { 

     base.OnElementChanged(e); 

     if(e.OldElement == null) { 

      Control.Settings.JavaScriptEnabled = true; 

      Control.SetWebViewClient(new SomethingWebViewClient()); 

      Control.SetWebChromeClient(new SomethingWebChromeClient()); 
     } 
    } 
} 

internal class SomethingWebViewClient : WebViewClient { 

    public override void OnPageFinished(Android.Webkit.WebView view, string url) { 
     base.OnPageFinished(view, url); 

     view.LoadUrl("javascript:{(function() { window.alert('something'); })()};"); 
    } 
} 

public class SomethingWebChromeClient : WebChromeClient { 

    public override bool OnJsAlert(Android.Webkit.WebView view, string url, string message, JsResult result) { 

     if(message.StartsWith("something") { //This is where you would look for your magic string, anything starting with your magic string is what you would extract and/or act on 
      //Do something.... 

      result.Cancel(); //This cancels the JS alert (there are other talked about methods of doing this but this works for me) 
      return true; //This tells the WebView "we got this" 
     } 

     return base.OnJsAlert(view, url, message, result); //Let the WebView handle this since we did not find out special string 
    } 
} 
} 

最後に、もう一つの方法は、私はそれはあなたが引っ張って、リダイレクトを進める必要があるかどうかのWebViewを伝えるために使用されている場合には、新しいURLにページをリダイレクトするために、JavaScriptを使用して関与を見てWebViewの現在のURLを出力し、あなたの魔法の文字列を見つけたら、何かします。これは、URLが255文字のようにしかなり得ないため、私のニーズにはうまくいかないという点を除いて、素晴らしい結果でした。

+0

私がXLabsを使用しない場合は、AndroidとiOSのUIを別々に設計する必要がありますか?アプリケーションには実際にはプラットフォーム固有の要件はありませんが、これは唯一の非標準的なものです。 – pikausp

+0

ああ、私たちはフォームプロジェクトでHybridViewを定義してから、プラットフォーム固有のレンダラーを定義するように見えます(ここで示したように、https://developer.xamarin.com/guides/xamarin-forms/custom-renderer/hybridwebview/) )正しいプラットフォームプロジェクトで、正しい? – pikausp

+0

@pikausp Xamarinフォームを使用する場合、両方のプラットフォームで使用される単一のUIを作成できます。また、プラットフォーム固有のコードで高度な機能を定義し、ハイブリッドな 'WebView'を使って、または私が記述した他の方法を使ってあなたの共有プロジェクトで参照することは正しい。 – hvaughan3

関連する問題