首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WKWebView:访问本地文件的远程url

WKWebView:访问本地文件的远程url
EN

Stack Overflow用户
提问于 2018-02-01 21:43:47
回答 1查看 1.8K关注 0票数 6

我使用的是Xamarin.iOS,但是所有东西都很容易翻译成ObjC / Swift。

我有一个WKWebView,它加载一个远程URL (html、js、css),然后加载本地存储在应用程序中的mp4视频。问题是这些视频没有被载入。

该网站使用HTML5视频标记,我通过与Javascript通信C#来设置本地urls。

视频路径是这样的:/var/mobile/Containers/Data/Application/F535FA1C-752B-4B46-B237-6781464EE0E5/Documents/../Library/Vimeo/7b2723fa-b0f1-40c5-bc58-d43949273329.mp4

这是我的WKWebView设置:

代码语言:javascript
运行
复制
var userController = new WKUserContentController();
userController.AddScriptMessageHandler(new iOSSiteWrapper(this.ViewModel, () => this.webView), "iOSWrapper");
var configuration = new WKWebViewConfiguration
{
    AllowsInlineMediaPlayback = true,
    UserContentController = userController
};
configuration.Preferences.JavaScriptCanOpenWindowsAutomatically = true;
configuration.Preferences.JavaScriptEnabled = true;
configuration.Preferences.SetValueForKey(NSObject.FromObject(true), new NSString("allowFileAccessFromFileURLs"));
configuration.AllowsInlineMediaPlayback = true;
configuration.AllowsPictureInPictureMediaPlayback = true;
if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
{
    configuration.MediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypes.None;
}
else
{
    configuration.MediaPlaybackRequiresUserAction = false;
}

this.webView = new WKWebView(
    new CoreGraphics.CGRect(),
    configuration)
{
    WeakNavigationDelegate = this
};

// add to view hierarchy...

// this.ViewModel.HtmlContent is a string which contains the html page
this.webView.LoadHtmlString(this.ViewModel.HtmlContent, NSUrl.FromString(Constants.BASE_URL));

我已经在Info.plist文件中配置了ATS异常。

更新

我尝试加载这个简单的html字符串:

代码语言:javascript
运行
复制
var videoToPlay = "file:///var/mobile/Containers/Data/Application/F535FA1C-752B-4B46-B237-6781464EE0E5/Documents/../Library/Vimeo/7b2723fa-b0f1-40c5-bc58-d43949273329.mp4";
var html = $"<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body  id=\"page\"><div id=\"VideoBean\" style=\"position:relative;\" width=\"305\" height=\"242\"><video id=\"video\" type=\"video/mp4\" controls=\"controls\" role=\"presentation\" width=\"305\" height=\"242\"><source id=\"source\" src=\"{videoToPlay}\"></video></div></body></html>";

this.webView.LoadHtmlString(html, NSUrl.FromString(Constants.BASE_URL));

结果是一样的。视频不播放,我可以在Safari输出中看到这个错误:

不允许加载本地资源: file:///var/mobile/Containers/Data/Application/F535FA1C-752B-4B46-B237-6781464EE0E5/Documents/../Library/Vimeo/7b2723fa-b0f1-40c5-bc58-d43949273329.mp4

第二次更新

如果我加载html片段,将本地路径设置为基url,它会工作:

代码语言:javascript
运行
复制
this.webView.LoadHtmlString(html, NSUrl.FromFilename(videoToPlay));

但是当我试图加载一个远程站点时,我需要基url作为远程基url。因此,一个新的问题是:可以在WKWebView上设置两个基本urls吗?

否则,除了本地加载整个站点之外,我还有其他选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-09 21:32:22

我就是这么做的:

1)将html文件下载到本地存储中。

2)查找html文件中的所有相关url,并在它们上设置基url。我的意思是这样的:src="myvideo.mp4 -> src="https://myhomeurl.com/myvideo.mp4"

3)使用webView.LoadFileUrl而不是LoadHtmlString (我还将第二个参数从NSUrl.FromString改为NSUrl.FromFilename)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48572219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档