有什么方法可以在xamarin.forms上使用webview.postURL吗?

时间:2019-04-29 16:32:56

标签: c# xamarin.forms webview http-post

我正在创建一个使用Xamarin.forms包装我的网站的应用程序。我想在我的移动应用程序上实现登录页面,该页面将通过使用webview.postURL在网站上传递登录信息。 postURL是否适用于iOS和android?或仅Android?如果只能在android上使用,有没有办法在两个平台上都使用它?

我是xamarin和C#的新手,示例代码或github链接对我有很大帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用CustomRenderer来实现它。

  

在表单中,定义Webview的子类

using Xamarin.Forms;

namespace xxx
{
    public class MyWebview:WebView
    {
        public string data; //Parameters that you want to pass
        public string url;
        public MyWebview()
        {

        }
    }
}

在contentPage

public MainPage()
{
   InitializeComponent();

   Content = new StackLayout
     {
        Children =
          {
            new MyWebview()
             {
               url="your url",
               WidthRequest = 300,
               HeightRequest = 500,
               data = "userName=xxx"
              },
          },
          VerticalOptions = LayoutOptions.FillAndExpand,
          HorizontalOptions=LayoutOptions.FillAndExpand

      };
}

  

在iOS项目中

using Foundation;
using UIKit;


using xxx;
using xxx.iOS;

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly:ExportRenderer(typeof(MyWebview),typeof(MyWebViewRenderer))]
namespace xxx.iOS
{
    public class MyWebViewRenderer:WebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if(NativeView!=null)
            {

                var mywebview = Element as MyWebview;

                var request = new NSMutableUrlRequest(new NSUrl(new NSString(mywebview.url)));
                request.Body = mywebview.data;
                request.HttpMethod = "POST";
                LoadRequest(request);

            }
        }        

    }
}

注释

对于iOS 9及更高版本和MacOS,如果您希望访问不安全的网站,则可能需要配置或禁用ATS

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
  

在Android项目中

using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Webkit;
using Android.Widget;

using xxx;
using xxx.Droid;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(MyWebview), typeof(MyWebViewRenderer))]
namespace xxx.Droid
{
    public class MyWebViewRenderer:WebViewRenderer
    {
        public MyWebViewRenderer(Context context):base(context)
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if(Control!=null)
            {
                var mywebview = Element as MyWebview;

                var postData = Encoding.UTF8.GetBytes(mywebview.data);
                Control.PostUrl(mywebview.url, postData);

            }

        }

    }
}

有关自定义渲染器的更多详细信息,请参阅here

答案 1 :(得分:0)

通过网络视图发布请求 对于WkWebview

[程序集:ExportRenderer(typeof(PaymentWebview),typeof(PaymentWebViewRenderer))] 命名空间MMFInvestorApp.iOS.Utils { 公共类PaymentWebViewRenderer:WkWebViewRenderer { 受保护的重写void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e);

        if (NativeView != null)
        {
            var request = new NSMutableUrlRequest(new NSUrl(new NSString(paymentwebview.url))); //Your Url
            request.HttpMethod = "POST";
            request.Body = NSData.FromString(paymentwebview.data); //Data for POST
            request["Content-Length"] = req.Body.Length.ToString();
            request["Content-Type"] = "application/x-www-form-urlencoded charset=utf-8";
            LoadRequest(request);
        }

    }


}

}

用于UIWebview(自2020年4月起废弃

[程序集:ExportRenderer(typeof(PaymentWebview),typeof(PaymentWebViewRenderer))] 命名空间MMFInvestorApp.iOS.Utils { 公共类PaymentWebViewRenderer:WebViewRenderer { 受保护的重写void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e);

        if (NativeView != null)
        {
            var paymentwebview = Element as PaymentWebview;
            var request = new NSMutableUrlRequest(new NSUrl(new NSString(paymentwebview.url)));//Your Url
            request.Body = paymentwebview.data; //Data for POST
            request.HttpMethod = "POST";
            LoadRequest(request);
        }

    }


}

}