で Web サイトを開きたいUIWebView
のですが、アプリの Documents フォルダーから JavaScript ファイルをロードしたくありません (帯域幅のため)。これは可能ですか?
2 に答える
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 コードを挿入できるようになります。
(以下の私の編集を参照してください。カスタム プロトコルを使用することで、ローカル アセットとリモート 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" />
- コメント:
- Web ページにアクセスして編集できることを前提としています。
- ローカルの 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 ファイルで作業していますが、リモートでも動作する可能性があります)。