Xamarin 表单:用于播放视频的 Webview 在 iPhone 中不起作用?
Xamarin forms: Webview for playing video is not working in iPhone?
我正在使用 Webview
播放视频和音频,它在 android 和 iPhone 模拟器上运行良好。但在真实 iPhone 上,视频播放效果不佳。
为了在 iPhone 上播放视频,我需要多次点击视频播放按钮。之后播放视频也需要很长时间。另一件重要的事情是我的视频 link 没有视频格式 (.mp4,.mkv)。
XAML
<WebView
x:Name="web_view"
HeightRequest="200"
WidthRequest="200"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"/>
XAML.cs
web_view.Source = "https://player.vimeo.com/video/303543322";
我试过Plugin.MediaManager.Forms
,但link中需要视频格式(.mp4,.mkv),否则无法使用。那么有什么方法可以解决 webview
本身的这个问题,还是我应该选择支持播放无视频格式的视频的任何其他播放器(视频和音频)?
首先,在您的 PCL 中创建一个继承自 WebView 的新 class。并定义一个可绑定的 属性 指向 url 应该加载到 iOS 上的内容。
public class MyWebView : WebView
{
public static readonly BindableProperty UrlProperty = BindableProperty.Create(
propertyName: "Url",
returnType: typeof(string),
declaringType: typeof(MyWebView),
defaultValue: default(string));
public string Url
{
get { return (string)GetValue(UrlProperty); }
set { SetValue(UrlProperty, value); }
}
}
此 class 在 iOS 上的自定义渲染器:
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace xxx.iOS
{
public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
{
WKWebView _wkWebView;
protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var config = new WKWebViewConfiguration();
_wkWebView = new WKWebView(Frame, config);
SetNativeControl(_wkWebView);
}
if (e.NewElement != null)
{
Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
}
}
}
}
对于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<WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var customWebView = Element as MyWebView;
Control.Settings.AllowUniversalAccessFromFileURLs = true;
Control.Settings.JavaScriptEnabled = true;
Control.LoadUrl(customWebView.Url);
}
}
}
}
终于可以在PCL的页面中使用这个自定义控件了,用法如下:
<StackLayout>
<local:MyWebView Url="https://www.microsoft.com" VerticalOptions="FillAndExpand"/>
</StackLayout>
我正在使用 Webview
播放视频和音频,它在 android 和 iPhone 模拟器上运行良好。但在真实 iPhone 上,视频播放效果不佳。
为了在 iPhone 上播放视频,我需要多次点击视频播放按钮。之后播放视频也需要很长时间。另一件重要的事情是我的视频 link 没有视频格式 (.mp4,.mkv)。
XAML
<WebView
x:Name="web_view"
HeightRequest="200"
WidthRequest="200"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"/>
XAML.cs
web_view.Source = "https://player.vimeo.com/video/303543322";
我试过Plugin.MediaManager.Forms
,但link中需要视频格式(.mp4,.mkv),否则无法使用。那么有什么方法可以解决 webview
本身的这个问题,还是我应该选择支持播放无视频格式的视频的任何其他播放器(视频和音频)?
首先,在您的 PCL 中创建一个继承自 WebView 的新 class。并定义一个可绑定的 属性 指向 url 应该加载到 iOS 上的内容。
public class MyWebView : WebView
{
public static readonly BindableProperty UrlProperty = BindableProperty.Create(
propertyName: "Url",
returnType: typeof(string),
declaringType: typeof(MyWebView),
defaultValue: default(string));
public string Url
{
get { return (string)GetValue(UrlProperty); }
set { SetValue(UrlProperty, value); }
}
}
此 class 在 iOS 上的自定义渲染器:
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace xxx.iOS
{
public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
{
WKWebView _wkWebView;
protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var config = new WKWebViewConfiguration();
_wkWebView = new WKWebView(Frame, config);
SetNativeControl(_wkWebView);
}
if (e.NewElement != null)
{
Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
}
}
}
}
对于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<WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var customWebView = Element as MyWebView;
Control.Settings.AllowUniversalAccessFromFileURLs = true;
Control.Settings.JavaScriptEnabled = true;
Control.LoadUrl(customWebView.Url);
}
}
}
}
终于可以在PCL的页面中使用这个自定义控件了,用法如下:
<StackLayout>
<local:MyWebView Url="https://www.microsoft.com" VerticalOptions="FillAndExpand"/>
</StackLayout>