开启NSAllowsArbitraryLoadsInWebContent后AVPlayer无法播放视频的原因
哈哈,这个ATS配置的坑我之前也踩过!让我给你拆解一下原因和解决办法:
问题原因分析
当你添加NSAllowsArbitraryLoadsInWebContent = true后,AVPlayer无法播放HTTP视频的核心原因是ATS配置的优先级和范围规则:
- 最初你设置
NSAllowsArbitraryLoads = true是全局禁用ATS限制,所有网络请求(包括AVPlayer的媒体请求)都能绕过HTTPS要求,所以播放正常。 - 但
NSAllowsArbitraryLoadsInWebContent是专门针对WKWebView/UIWebView的ATS例外配置——它只会放宽WebView内的HTTP加载限制,完全不影响AVPlayer这类非WebView的媒体请求。 - 更关键的是:当存在这类特定场景的ATS例外键时,苹果会默认忽略
NSAllowsArbitraryLoads的全局宽松设置,转而对非WebView的请求严格执行ATS规则(即要求HTTPS)。你的视频是HTTP协议,自然就被ATS拦截了。
解决办法
根据你的需求,有几个可行的方案:
方案1:针对媒体请求添加ATS例外
如果你需要保留NSAllowsArbitraryLoadsInWebContent(比如未来可能会加入WebView),只需在NSAppTransportSecurity字典中添加NSAllowsArbitraryLoadsForMedia = true——这个键专门用来放宽媒体播放的ATS限制,完美适配AVPlayer的场景:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> <key>NSAllowsArbitraryLoadsForMedia</key> <true/> <!-- 这里可以把NSAllowsArbitraryLoads设为false,更符合苹果的推荐规范 --> <key>NSAllowsArbitraryLoads</key> <false/> </dict>
方案2:移除多余的WebView配置
既然你的应用目前没有任何WebView实例,NSAllowsArbitraryLoadsInWebContent对你来说完全没用,直接删掉这个键,恢复原来的ATS配置即可:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
方案3:更安全的域名级例外(推荐)
全局禁用ATS(NSAllowsArbitraryLoads = true)其实不符合苹果的安全规范,更稳妥的做法是针对你的视频域名单独设置ATS例外,这样既不会影响其他请求的安全性,也能正常播放视频:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <!-- 替换成你的视频实际域名 --> <key>some-video-domain.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> <!-- 如果之后需要WebView支持,再添加这个键 --> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict>
内容的提问来源于stack exchange,提问作者Roman Podymov
相关产品推荐
相关产品推荐

