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

iOS:使用本地javascript文件打开UIWebView,javascript,ios,objective-c,uiwebview,Javascript,Ios,Objective C,Uiwebview,我想在UIWebView中打开一个网站,但我不想从应用程序的文档文件夹加载javascript文件(因为带宽)。这可能吗?是的,您需要创建一个自定义的NSURLProtocol,如本文所示:。在canInitWithRequest:中进行适当的签入,并根据示例交付具有适当内容类型的Javascript 更新: 下面是一个示例实现的快速快照: @interface LocalJSURLProtocol : NSURLProtocol @end @implementation LocalJ

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

是的,您需要创建一个自定义的
NSURLProtocol
,如本文所示:。在
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代码。

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

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

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

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

<script src="scripts.js" />

  • 评论:
  • 我假设您可以访问和编辑该网页
  • 如果没有下载本地js文件,您可以做一个很好的回退。与jQuery的cdn回退到本地文件类似,我们可以做相反的事情,并回退到服务器的文件(例如,jQuery就是一个例子。只需测试名称空间的存在性,就可以对任何js文件进行回退:

if(typeof jQuery==“未定义”){
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文件,但也可能与远程html文件一起使用)

这非常有效。我使用了
[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:jsFile]
获取localFilePath。我将
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'