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

时间:2012-03-29 00:56:25

标签: objective-c ios cocoa-touch uiwebview nsbundle

我想在我加载到UIWebView的HTML文件中包含一些.js文件。这些文件位于我的app bundle内。我还想为baseURL设置不同的webView

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

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]];

如何让这两种技术同时正常工作?

1 个答案:

答案 0 :(得分:0)

如果无法访问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);