1

現在、ユーザーインターフェイスの一部にHTMLファイルを使用しています。これらのファイルをWebView経由で表示します。これは、Xcodeのデバッグモードで期待どおりに機能します。残念ながら、アプリをアーカイブした後、HTMLリソースは表示されなくなりました。

これは多くの理由で奇妙です。ファイルがアプリ内の正しいリソースフォルダーに確実にあることがわかります。WebViewが消えたり非表示になったりすることはなく、何もロードされていないかのように白い背景が表示されます。

この観察は、私のプロジェクト内のすべてのHTMLファイルに当てはまります。UIに使用しなくても、共有可能なHTMLファイル内の一部のデータをエクスポートするために、(リリースモードで)機能しません。

私はこの問題について調査しましたが、興味のあるものは何も見つかりませんでした。私は今アイデアを使い果たしています...

4

2 に答える 2

1

あなたは質問にあなたのコードを与えなかったので、それをデバッグするのは非常に難しいです…しかしあなた自身の答えから、私は問題を知っているとかなり確信しています。パス文字列とURL文字列を交換可能として扱っていますが、そうではありません。

あなたはこれを提案します:

[[inspectorView mainFrame] 
  loadRequest:[NSURLRequest 
        requestWithURL:[NSURL 
                URLWithString:
                   [[NSBundle mainBundle]
                 pathForResource:@"inspectorView" 
                      ofType:@"html"
                     inDirectory:@"HTML/inspectorView"]]]];

(読みやすくするために改行をいくつか追加しました。)

+ [NSURL URLWithString:]を呼び出すには、パスを表す文字列ではなく、URLを表す文字列が必要です。ただし、-[NSBundle pathForResource:ofType:inDirectory:]はパスを返します。必要に応じて、パス+ [NSURL fileURLWithPath:isDirectory:]からURLを作成する関数があります。

ただし、10.5以前をサポートする必要がない限り、-[NSBundle pathForResource:]の代わりに-[NSBundle URLForResource:withExtension:subdirectory:]を使用すると、最初にURLを取得するだけで、前後に変換する必要がなくなります。 ofType:inDirectory:]。

それで:

[[inspectorView mainFrame] 
  loadRequest:[NSURLRequest 
        requestWithURL:[[NSBundle mainBundle]
                 URLForResource:@"inspectorView" 
                  withExtension:@"html"
                   subdirectory:@"HTML/inspectorView"]]];

コードが機能する場合と機能しない場合があるのはなぜか疑問に思われる場合は、「/ Applications / MyApp.app / Contents /」を検討してください(簡潔にするために「Resources / HTML / inspectorView/inspectorView.html」は省略しています。 、ここでは関係ないため)は、URLとして読み取る場合を意味します。これは相対URLです。それを解釈するには、現在のベースを取得し、パス部分をノックオフして、文字列に置き換えます。+ [NSURL URLWithString:]は、たまたま「file:// localhost」をベースとして使用します。つまり、次のようになります。

file://localhost/Applications/MyApp.app/Contents/

これはたまたま有効なURLであり、実際には、必要なファイルの有効なURLです。それが機能するように文書化されていませんが、それは起こります。この場合。しかし、そこにスペースを入れるとどうなりますか?次に、次のようになります。

file://localhost/Applications/MyApp X.app/Contents/

これは有効なURLではありません。あなたが欲しいのはこれです:

file://localhost/Applications/MyApp%20X.app/Contents/

そしてもちろん、+ [URLWithString:]の代わりに+ [fileURLWithPath:isDirectory:]を呼び出すと、まさにそれが得られます。

(ここで少しごまかしています。実際、NSURLは内部で相対URLとベースを別々に追跡し、URLにアクセスしようとするとそれらを構成します。ただし、今のところ無視できます。)

于 2012-07-02T20:09:30.207 に答える
1

わお。それは面白い。解決策はありますが、なぜそのように機能するのかわかりません。誰かが同じ問題を抱えている場合にのみ: HTMLへのパスをハードコードしませんでしたが

[[inspectorView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"inspectorView" ofType:@"html" inDirectory:@"HTML/inspectorView"]]]];

たとえば、 inspectorView がWebViewの場合、アプリの名前にスペースが含まれていると機能しません。偶然にも、「MyAppsName.app」は機能するのに、「MyAppsName 2.2.app」や「MyAppsName x.app」は機能しないことがわかりました。

アプリのタイトルにバージョン情報を入れるべきではないと誰かが不満を言っているのを聞いたことがあります。それは本当だ。これは、その後のテスト プロセスで一部のビルド状態を特定するためだけのものです。

于 2012-07-02T18:14:52.097 に答える