web-dev-qa-db-ja.com

WebView内のリソースへのリンク-iPhone

IPhoneアプリケーションにWebビューがあり、Resourcesフォルダー内にいくつかのhtmlファイルもあります。アプリが読み込まれると、リソースからWebビューにページが読み込まれます。ただし、他のリソース(画像、その他のhtmlファイルなど)を指すリンクをWebビュー内に作成する必要があります。相対リンクを実行するだけでは機能しません。

<a href="OtherPage.html">Doesn't work</a>
18
Isaac Waller

これらのリソースをロードするときは、ベースURLを設定する必要があります。次の方法を使用してこれを行うことができます。

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL

...ここで、baseURLはリソースフォルダのファイルURLになります。

14
August

iPhone OS3.0用のiPhoneSDKリリースノート によると、どうやらちょっとした落とし穴があります:

問題:UIWebViewは、3.0に対してビルドされたアプリにローカルリソースを読み込めません。

[UIWebView loadHTMLString:baseURL:]を使用する場合、HTML文字列はfile://スキームでローカルリソースを参照しないでください。代わりに、NULLまたはfile://のURLをbaseURL:に渡すか、<style>および<script>タグを使用してリソースをHTMLに直接含めます。

けっこうだ。しかし、baseURLの標準的な問題のfile://URLを渡すことは完全には機能しません。ただし...///に変更し、スペースを%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:が関係するiPhoneOS3.0でうまくいくはずです。

26
Joe D'Andrea

私はそれを修正しました:8月が言ったように私はこれをBaseURLに使用しました:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];

ありがとうございました!

7
Isaac Waller

このコードは、バンドルのリソースディレクトリにある「OtherPage.html」という名前のファイルのURLを含む文字列を返します。

[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
3
Chris Lundie

これは私のために働いた。私の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];
2
Michael Gaylord

最初にOtherPage.htmlを読み込んでみてください。それができない場合、それはそこになく、プロジェクトに追加することの一部を見逃しています。可能であれば、リンクにタイプミスがあるか、8月に述べられているようにbaseURLが正しくない可能性があります。リソースファイルにある画像を含むhtmlファイルを作成したとき、それを使用するだけで正常に機能しました

<img src="file.png">
1
Ed Marty

たぶんそれはbaseurlと関係があります:私がリソースをロードするとき、私はこの行を使用します:

[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

最後に、baseURL: ""と表示されています。これを取り出すと動作しません(クラッシュ)が、リソースへのパスがわかりません。誰かが.....?

0
Isaac Waller

私にとっての問題は、jsファイルがバンドルに含まれていないことでした。必ず確認してください。

0
kolyuchiy

OK、ここで3。5年後:) ...上記のMichaelGaylordの提案を正確に試しましたが、5.0、5.1、6.0、6.1のシムでも、同じように動作する実際のデバイスでも機能しませんでした。 ただしthis SOリソースがバンドルされている場所の明確化( ビルド出力はどこに行くのですか? )このように私のためにそれを機能させるのに役立ちました:

  1. プロジェクトにFinderフォルダを作成します(Michaelが示唆しているように-そして私も 'group'を試しませんでした)
  2. finderを使用してそのフォルダにHTMLを配置します
  3. xcodeではfile->プロジェクトにファイルを追加を使用します
  4. プロジェクトがバンドルに含まれるべきであることを次の方法で認識していることを確認します。

    1. ナビゲーターウィンドウでメインプロジェクトターゲットを右クリックし、
    2. tARGETSが選択されていることを確認し、Build Phasesタブ、
    3. バンドルリソースのコピー三角形をクリックします|>
    4. そして-これがMichaelのものとの違いです-それはすでにあなたのhtmlファイルとパスを示しているはずです。 (おそらく、XCodersはファイルの追加AIを改善しました:)

だから私がしなければならなかったのはコピーすることだけでした-マイケルのコードを上に貼り付けてverbatumそしてこの1行を変更してください:

                     inDirectory:@"html"] 

に:

                     inDirectory:nil]

およびShaazam!出来た :)

0
Howard Pautz

Phonegapがどのようにそれを行うかを見てください。 iPhoneのローカルリソースに関するチュートリアルです 。ステップ11はあなたが無視していることかもしれません。

0
ceejayoz