WKWebview非全屏自动播放h5视频
本文首发于公众号【一个老码农】
WKWebview
加载一个视频播放的h5页面时,默认是需要用户点击一下才能播放视频,且视频播放时会全屏播放。如果想要h5页面视频非全屏自动播放该怎么做呢?
Swift实现
这个时候就需要设置WKWebview
的configuration
参数,我们先来看一下Swift的实现,代码如下:
let configuration = WKWebViewConfiguration()
configuration.allowsInlineMediaPlayback = true
if #available(iOS 9.0, *){
configuration.requiresUserActionForMediaPlayback = false
}else{
configuration.mediaPlaybackRequiresUserAction = false
}
h5WebView = WKWebView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height, configuration: configuration)
非全屏播放比较简单,设置configuration
的allowsInlineMediaPlayback
属性为true就可以了。当然h5端同样也要支持非全屏播放,否则客户端设置此属性没有任何作用。关于h5非全屏设置我们放最后单独说。
要想实现自动播放视频,在iOS8.0需要设置configuration
的mediaPlaybackRequiresUserAction
属性为false,但是从iOS 9.0开始此属性被废弃。改为了requiresUserActionForMediaPlayback
,所以iOS9.0 需要设置requiresUserActionForMediaPlayback
为false
,即可实现H5视频自动播放。但是此属性在10.0之后又被废弃了。系统api说明:
extension WKWebViewConfiguration {
//ios 9.0被废弃
@available(iOS, introduced: 8.0, deprecated: 9.0)
open var mediaPlaybackRequiresUserAction: Bool
//ios 10.0被废
@available(iOS, introduced: 9.0, deprecated: 10.0)
open var requiresUserActionForMediaPlayback: Bool
}
在iOS 10.0及之后系统版本苹果又引入了mediaTypesRequiringUserActionForPlayback
属性。在Swift中,此属性是一个WKAudiovisualMediaTypes
结构体。此结构体为我们提供了三个静态值,分别为audio
、video
、all
。audio
则代表不自动播放音频,video
代表不自动播放视频,all则代表音视频都不自动播放,不设置则代表都自动播放。
WKAudiovisualMediaTypes
结构体系统代码如下:
@available(iOS 10.0, *)
public struct WKAudiovisualMediaTypes : OptionSet {
public init(rawValue: UInt)
public static var audio: WKAudiovisualMediaTypes { get }
public static var video: WKAudiovisualMediaTypes { get }
public static var all: WKAudiovisualMediaTypes { get }
}
OC实现
讲完了Swift
,我们来讲objective-c
。
oc与Swift的参数区别不大,iOS 8.0需要设置configuration的mediaPlaybackRequiresUserAction
属性,iOS 9.0需要设置configuration
的requiresUserActionForMediaPlayback
属性。
iOS 10.0版本以后也是同swift一样,需要设置mediaTypesRequiringUserActionForPlayback
属性,以上三个属性名字与Swift中完全一样。
但是与swift
不同的是,在objective-c
中,mediaTypesRequiringUserActionForPlayback
的属性是一个枚举。且比Swift中多一个值,如下系统代码:
typedef NS_OPTIONS(NSUInteger, WKAudiovisualMediaTypes) {
WKAudiovisualMediaTypeNone = 0,
WKAudiovisualMediaTypeAudio = 1 << 0,
WKAudiovisualMediaTypeVideo = 1 << 1,
WKAudiovisualMediaTypeAll = NSUIntegerMax
} API_AVAILABLE(macos(10.12), ios(10.0));
在此枚举中,WKAudiovisualMediaTypeAudio
、WKAudiovisualMediaTypeVideo
、WKAudiovisualMediaTypeAll
三个枚举值分别对应swift
中的audio
、video
、all
。且与Swift
中功能完全一致。只是此枚举比Swift
中的WKAudiovisualMediaTypes
结构体多了一个值:WKAudiovisualMediaTypeNone
。在oc
中如果mediaTypesRequiringUserActionForPlayback
的值设置为WKAudiovisualMediaTypeNone
,则代表无论音视频都会自动播放。
oc中设置非全屏自动播放代码如下:
WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc] init];
//设置非全屏播放
configuration.allowsInlineMediaPlayback = YES;
//不同系统版本适配可自行判断
configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
_webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) configuration:configuration];
H5非全屏播放
如果想要在App端的WKWebView
中支持非全屏播放,h5端和app端都必须做相应的设置。上面我们讲了App端非全屏播放的方法,最后我们来讲一下在h5端怎么设置。
在h5中非全屏播放被称之为内联播放。如果要支持内联播放,需要在video
标签设置playsinline
属性为true
。但是playsinline
仅支持iOS 10版本以上的系统。iOS 10以前版本则需要设置webkit-playsinline
属性。代码:
<video playsinline="true" webkit-playsinline="true" controls="controls">
<source src="http://xxx.mp4" type="video/mp4">
</video>
关注公众号【一个老码农】免费获取iOS进阶学习视频
原文地址:WKWebview非全屏自动播放h5视频