2

で Web サイトを開きたい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 ファイルを操作できる可能性があります)

インターネット ファイルでローカル js ファイル (または任意のローカル ファイル) を使用することはできません。これは、Web サイト上のローカルの JavaScript ファイルを通常のデスクトップ ブラウザから開くことができないのと似ています。

できることは、Web サイトのページを呼び出し、応答の html をローカルの html ファイルとして (ドキュメント フォルダーに) 保存し、js の URL もローカルに変更することです。URL は相対 URL にする必要があります。例えば:

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

index.html 内で、js src を次のように変更できます。

<script src="scripts.js" />
  • コメント:
    1. Web ページにアクセスして編集できることを前提としています。
    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 に答える