WKWebView 中 playsinline 默认不生效,必须初始化时设 allowsInlineMediaPlayback = true 且 mediaTypesRequiringUserActionForPlayback = [],并使用 https 或本地 HTTP 服务加载页面。

playsinline 在 WKWebView 中**默认不启用**,必须显式配置 allowsInlineMediaPlayback = true,否则即使 HTML 元素带 playsinline 属性,视频仍会全屏播放。
WKWebView 默认禁用内嵌播放的原因
iOS 系统对媒体播放行为做了严格限制,尤其在 WebView 场景下,默认强制视频进入全屏模式(尤其在 iOS 10+),这是为了防止网页滥用自动播放、节省资源并统一用户交互预期。WKWebView 继承了这一保守策略,allowsInlineMediaPlayback 默认为 false,且不会因 HTML 中写了 playsinline 就自动生效。
必须设置 allowsInlineMediaPlayback = true 才生效
这个配置只能在 WKWebViewConfiguration 初始化阶段设置,创建 WKWebView 实例后无法动态修改。
-
allowsInlineMediaPlayback必须设为true,否则<video playsinline>被完全忽略 - 该配置仅影响
<video>元素,对<audio>无作用 - 需配合 HTML 中的
playsinline属性使用,二者缺一不可 - 如果同时设置了
webkit-playsinline(旧版 Safari 属性),现代 iOS 仍只认标准playsinline
mediaTypesRequiringUserActionForPlayback 不配会导致 autoplay 失效
即使开了 allowsInlineMediaPlayback,若没清空 mediaTypesRequiringUserActionForPlayback,带 autoplay 的视频仍会静音暂停、等待用户点击——这对广告视频是致命问题。
- 正确做法是设为
[](空数组),表示所有媒体类型都允许免用户操作播放 - 仅设
allowsInlineMediaPlayback = true而不改此项,autoplay依然被拦截 - 注意:此配置在 iOS 15+ 对
playsinline + autoplay组合更敏感,漏配时控制台可能不报错但行为静默失败
加载本地 HTML 时 playsinline 可能无效
WKWebView 加载 file:// 协议内容(如 bundle 内 HTML)时,playsinline 和 autoplay 均大概率失效,系统直接拒绝内嵌播放权限。
- 官方明确建议:为保障广告效果,**必须使用
https://远程 URL 加载内容** - 本地调试可用简易 HTTP server(如 Python 的
python3 -m http.server),再用http://localhost:8000/xxx.html加载 - 哪怕只是测试页面,也别用
Bundle.main.url(forResource:...)直接 loadFileURL,否则内嵌播放永远不工作
playsinline 不是开关,而是“申请许可”的凭证;真正管用的是那两个配置项是否在初始化时写对、写全,以及加载方式是否符合系统信任模型。

















