我正在创建一个使用Xamarin.forms包装我的网站的应用程序。我想在我的移动应用程序上实现登录页面,该页面将通过使用webview.postURL在网站上传递登录信息。 postURL是否适用于iOS和android?或仅Android?如果只能在android上使用,有没有办法在两个平台上都使用它?
我是xamarin和C#的新手,示例代码或github链接对我有很大帮助。
答案 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);
}
}
}
}