2

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

4

2 回答 2

4

是的,您需要NSURLProtocol像这篇文章一样创建自定义:https ://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 代码。

于 2013-06-22T15:25:05.697 回答
-1

(请在下面查看我的编辑 - 通过使用自定义协议,可能可以使用本地资产和远程 html 文件)

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

您可以做的是调用您网站的页面,将响应的 html 保存为本地 html 文件(在您的文档文件夹中),并将 js url 也更改为本地。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'

type='text/javascript'%3E%3C/script%3E")); }

希望有帮助!

编辑

查看这篇文章后,您可能能够从远程 html 文件访问本地文件(在他的示例中,他正在使用本地 html 文件,但它也可能与远程一起使用)

于 2013-06-22T21:02:08.330 回答