これは、ターゲットとするプラットフォームとプラットフォームのバージョンによって大きく異なります。
実際にWebView
を使用したい場合は、XLabs Hybrid WebViewをご覧ください。 XLabs'メソッド以外
、あなたは簡単にUIWebView.EvaluateJavascript()
メソッドを使用してiOSのレンダラから文字列を取り戻すことができ、その後、あなたはいつも私が成功したアンドロイドに戻って使用していたXamarinのAndroid WebView
レンダラ(link)、中WebChromClient.OnJsAlert
を上書きすることができます4.1。
のような何か
Xamarinは、フォーム...(何かが動作しないか、欠落している場合、私に教えてください、私はこれを入力したとマイナーな問題があるかもしれないので、余分なコードを削除)
コード:
public class SomethingWebView : WebView { }
UIWebViewDelegate
と
iOSのWebViewのレンダラ:WebViewClient
とWebChromeClient
と
[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文字のようにしかなり得ないため、私のニーズにはうまくいかないという点を除いて、素晴らしい結果でした。
私がXLabsを使用しない場合は、AndroidとiOSのUIを別々に設計する必要がありますか?アプリケーションには実際にはプラットフォーム固有の要件はありませんが、これは唯一の非標準的なものです。 – pikausp
ああ、私たちはフォームプロジェクトでHybridViewを定義してから、プラットフォーム固有のレンダラーを定義するように見えます(ここで示したように、https://developer.xamarin.com/guides/xamarin-forms/custom-renderer/hybridwebview/) )正しいプラットフォームプロジェクトで、正しい? – pikausp
@pikausp Xamarinフォームを使用する場合、両方のプラットフォームで使用される単一のUIを作成できます。また、プラットフォーム固有のコードで高度な機能を定義し、ハイブリッドな 'WebView'を使って、または私が記述した他の方法を使ってあなたの共有プロジェクトで参照することは正しい。 – hvaughan3