iOS:使用本地javascript文件打开UIWebView

时间:2013-06-22 15:00:23

标签: javascript ios objective-c uiwebview

我想在UIWebView打开一个网站,但我不想从应用的Documents文件夹中加载javascript文件(因为带宽)。这可能吗?

2 个答案:

答案 0 :(得分:4)

是的,您需要在此帖子中创建自定义NSURLProtocolhttps://stackoverflow.com/a/5573155/244160。在canInitWithRequest:中进行适当的检查,并根据示例为您的Javascript提供正确的内容类型。

更新

以下是示例实施的快速镜头:

@interface LocalJSURLProtocol : NSURLProtocol    
@end

@implementation LocalJSURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{

    return [request.URL.scheme caseInsensitiveCompare:@"http"] == NSOrderedSame && [request.URL.lastPathComponent hasSuffix:@"js"]);
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
{
    return request;
}

- (void)startLoading
{
    NSURLRequest *request = self.request;

    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL]
                                                        MIMEType:@"text/javascript"
                                           expectedContentLength:-1
                                                textEncodingName:nil];

    NSString *localFilePath = [[NSBundle mainBundle] pathForResource:@"sample.js" ofType:nil];
    NSData *data = [NSData dataWithContentsOfFile:localFilePath];

    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [self.client URLProtocol:self didLoadData:data];
    [self.client URLProtocolDidFinishLoading:self];

}

- (void)stopLoading
{
}

@end

在开始加载之前注册协议,如[NSURLProtocol registerClass:[LocalJSURLProtocol class]];。这将拦截UIWebView中的请求,您有机会为请求文件注入自己的Javascript代码。

答案 1 :(得分:-1)

(请参阅下面的编辑 - 可以使用自定义协议处理本地资源和远程html文件)

无法在Internet文件上使用本地js文件(或任何本地文件)。它类似于您无法从常规桌面浏览器在网站上打开本地javascript文件的事实。

您可以做的是调用您网站的页面,将响应的html保存为本地html文件(在您的文档文件夹中),并将js url更改为本地。网址应该是相对的。 例如:

documents
- myapp
-- index.html
-- scripts.js

在index.html中,您可以将js src更改为:

<script src="scripts.js" />
  • 注释:
    1. 我假设您可以访问和编辑网页。
    2. 如果没有下载本地js文件,你可以做一个很好的后备。类似于jQuery的cdn回退到本地文件,我们可以做相反的事情并回退到服务器的文件(例如jQuery。可以通过测试命名空间的存在来完成任何js文件:
    <script src="jquery-2.0.0.min.js"></script>
<script>
if (typeof jQuery == 'undefined') {
    document.write(unescape("%3Cscript src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min.js'
     

类型= '文本/ JavaScript的' %3E%3C /脚本%3E“));       }       

希望有所帮助!

修改

在查看了这个post之后,您可能能够从远程html文件访问本地文件(在他的示例中,他正在使用本地html文件,但它也可以使用远程html文件)