UIWebView:链接到包中的文件并设置 baseURL

Posted

技术标签:

【中文标题】UIWebView:链接到包中的文件并设置 baseURL【英文标题】:UIWebView: Link to files in bundle and set a baseURL 【发布时间】:2012-03-29 00:56:24 【问题描述】:

我想将一些 .js 文件包含到我加载到我的UIWebViewhtml 文件中。这些文件在我的app bundle 中。我还想为webView 设置一个不同的baseURL

到目前为止,我正在使用以下内容:

HTML 文件:

... a bunch more html code above
<head>
<script src="%wJQ%" type="text/javascript"></script> 
</head>
... a bunch more html code below

加载我的UIWebView的文件:

NSString *jQ = [[[NSBundle mainBundle] URLForResource:@"myjsfile" withExtension:@"js"] absoluteString];
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"%wJQ%" withString:jQ];

这给了我类似的东西:

<script src="file://localhost/Users/webmaster/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/43C9E1C2-C7FD-4FC1-BF6A-844266920CCD/MyApp.app/myjsfile.js" type="text/javascript"></script>

遗憾的是,当我查看 UIWebView 时,它似乎没有加载 .js 文件。

然后,我想将我的baseURL 设置为远程 URL,因为我需要一些相对链接才能工作:

NSString *webURL = @"http://www.mysite.com";
[self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:webURL]];

我怎样才能让这两种技术一起正常工作?

【问题讨论】:

你正在加载的文件的内容是什么? 如果它只是javascript(即使你称它为htmlString)那么你不能通过加载它来运行它,你需要调用stringByEvaluatingJavaScriptFromString()来执行它。如果它的 JS 嵌入在 html 中,那么我们需要查看它以了解它为什么不起作用。 它只是一个 javascript 文件。但我的包中也有一些 css 文件。但我需要能够将我的UIWebViewbaseURL 设置为域,这就是我尝试这样做的原因。 我不想执行 javascript。我只想将它链接到我的 UIWebView 正在加载的 .html 文件中。 【参考方案1】:

如果由于您必须将基本 url 设置为其他内容而无法访问 javascript 文件,那么也许您可以注入 javascript 文件。

注入 js 的位置取决于它的作用以及它与 dom 的交互方式。如果它独立于 dom,您可以将其注入 viewDidLoad,如果它依赖于您,则需要将其注入 shouldStartLoadWithRequest 或 webViewDidFinishLoad。 像这样注入它:

    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *jsURL = [bundle URLForResource:@"JavaScript" withExtension:@"js"];  
    NSData *jsData = [NSData dataWithContentsOfURL:jsURL];
    NSString *jsScriptAsString = [[NSMutableString alloc] initWithData:jsData encoding:NSUTF8StringEncoding];
    [self.webView stringByEvaluatingJavaScriptFromString:jsScriptAsString];

把你的js文件改成这样:

var script = document.createElement('script');  
script.type = 'text/javascript';  
script.text = your stuff
...
document.getElementsByTagName('head')[0].appendChild(script);

【讨论】:

为什么我不能使用捆绑 URL 将路径(在 .html 文件中)设置为我的 javascript 文件? 那你为什么不试试看是否有效。那么如果是这样,每个设备上的捆绑 URL 是否都相同? 是的,我确实尝试过,但没有成功。猜猜我只是希望有人以前知道这一点......

以上是关于UIWebView:链接到包中的文件并设置 baseURL的主要内容,如果未能解决你的问题,请参考以下文章

iOS:将资源(音频)文件包含到应用程序的应用程序文件夹中,而不是添加到包中

如何将数据集放入 R 包中

UIWebView在Safari中打开链接

如何检测UIWebView中的单击文件链接?

@interface 中的 UIWebView 委托设置

UITableView:单击单元格并使用 UIWebView 打开单元格中的链接