iPhone アプリケーションに webview があり、Resources フォルダー内にいくつかの html ファイルもあります。アプリが読み込まれると、リソースから Web ビューにページが読み込まれます。しかし、他のリソース (画像や他の html ファイルなど) を指すリンクを webview 内に作成する必要があります。相対リンクを実行するだけでは機能しません。
<a href="OtherPage.html">Doesn't work</a>
どうやらiPhone OS 3.0 の iPhone SDK リリース ノート によると、ちょっとした問題があるようです。
問題: UIWebView は、3.0 に対してビルドされたアプリでローカル リソースを読み込めません。
を使用する場合
[UIWebView loadHTMLString:baseURL:]
、HTML 文字列はfile://
スキームを使用してローカル リソースを参照しないでください。代わりに、NULL
または のfile://
URL を渡すか、およびタグbaseURL:
を使用して HTML にリソースを直接含め ます。<style>
<script>
けっこうだ。しかし、標準発行のfile://
URL を渡してbaseURL
もうまくいきません。しかし... に変更し、スペースを に変更/
すると、設定されることがわかりました! (使用することは非常に理にかなっていますが、二重スラッシュの部分には驚きました。)//
%20
%20
NSString *markup
すでに設定しているとしましょう。これですべてです。(読みやすくするためにここでコードをラップしました。好みに合わせてリファクタリング/調整したい場合があります。)
NSString *resourcePath = [[[[NSBundle mainBundle] resourcePath]
stringByReplacingOccurrencesOfString:@"/" withString:@"//"]
stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
[webView loadHTMLString:markup baseURL:[NSURL URLWithString:
[NSString stringWithFormat:@"file:/%@//", resourcePath]]];
CSS、JavaScript、および画像がファイル名だけで参照されているloadHTMLString:baseURL:
限り、iPhone OS 3.0 では問題なく動作するはずです!
これらのリソースをロードするときは、ベース URL を設定する必要があります。次のメソッドを使用してこれを行うことができます。
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL
...ここで、baseURL はリソース フォルダーのファイル URL になります。
私はそれを修正しました:Augustが言ったように、これをBaseURLに使用しました:
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
ありがとうございました!
このコードは、バンドルのリソース ディレクトリにある「OtherPage.html」という名前のファイルの URL を含む文字列を返します。
[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
これは私にとってはうまくいきました。私の HTML ファイルは、プロジェクトのサブフォルダー (グループではありません) にありました。私の html ページは page01 と呼ばれ、サブフォルダーは html です。
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *pathToHtml = @"html";
NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:pathToHtml isDirectory:YES];
NSString *html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"page01" ofType:@"html"
inDirectory:@"html"]
encoding:NSUTF8StringEncoding error:nil];
[webview loadHTMLString:html baseURL:baseURL];
最初に OtherPage.html をロードしてみてください。できない場合は、そこになく、プロジェクトへの追加の一部を見逃しています。可能であれば、8月に述べたように、リンクにタイプミスがあるか、baseURLが正しくない可能性があります. リソースファイルにある画像を含むhtmlファイルを作成すると、使用するだけで正常に機能しました
<img src="file.png">
私にとっての問題は、js ファイルがバンドルに含まれていなかったことです。必ず確認してください。
OK、ここで3.5年後:) ...上記のMichael Gaylordの提案を正確に試しましたが、5.0、5.1、6.0、6.1のsimでは機能しませんでした-同じように実行されている実際のデバイスでも機能しませんでした。ただし、リソースがバンドルされている場所に関するこの SO の明確化 (ビルド出力はどこに行くのですか? ) は、次のように機能するのに役立ちました。
次の方法で、プロジェクトがバンドルに含まれている必要があることを認識していることを確認します。
だから私がしなければならなかったのは、Michael のコードを逐語的にコピーして貼り付け、この 1 行を変更することだけでした。
inDirectory:@"html"]
に:
inDirectory:nil]
そしてシャザム!出来た :)
Phonegap がどのようにそれを行うかを見てみましょう。これは、iPhone のローカル リソースに関するチュートリアルです。ステップ11はあなたが無視しているものかもしれません。
多分それは baseurl と関係があります: リソースをロードするとき、私はこの行を使用します:
[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
最後に、baseURL: "" と表示されています。これを取り出しても機能しません (クラッシュします) が、自分のリソースへのパスがわかりません。誰かがそうしたら……?