【问题标题】:Is there a way i can use the webview.postURL on xamarin.forms?有没有办法可以在 xamarin.forms 上使用 webview.postURL?
【发布时间】:2019-09-18 07:41:14
【问题描述】:

我正在创建一个使用 Xamarin.forms 包装我的网站的应用。我想在我的移动应用程序上实现登录页面,该页面将通过使用 webview.postURL 在网站上进行登录。 postURL 适用于 iOS 和 android 吗?还是只有安卓?如果它只适用于 android,有没有办法在这两个平台上都做到这一点?

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

【问题讨论】:

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


    【解决方案1】:

    你可以使用CustomRenderer来实现它。

    在Forms中,定义一个Webview的子类

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

    在内容页面中

    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

    【讨论】:

      【解决方案2】:

      通过 Web 视图发布请求 对于 WkWebview

      [程序集:ExportRenderer(typeof(PaymentWebview), typeof(PaymentWebViewRenderer))] 命名空间 MMFInvestorApp.iOS.Utils { 公共类 PaymentWebViewRenderer : WkWebViewRenderer { 受保护的覆盖无效 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 { 受保护的覆盖无效 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);
              }
      
          }
      
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 2018-04-08
        • 2016-04-24
        • 2022-10-06
        • 1970-01-01
        相关资源
        最近更新 更多