28

アプリを iOS 7 に移植していますが、iOS 7 の UIWebView に問題があります。次のコードを使用して、ローカルの html 文字列をロードします。

NSURL *baseURL = [NSURL fileURLWithPath: DOCUMENTS_DIRECTORY];
[self.descWebView loadHTMLString:html baseURL:baseURL];

iOS 6 以前では完全に動作しますが、iOS 7 ではレンダリングされず、UIWebView はまだ白です。そして、このメッセージがコンソールに表示されます:

void SendDelegateMessage(NSInvocation *): delegate
(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)
failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode

返信ありがとうございます。

4

10 に答える 10

9

これを引き起こした Crittercism ライブラリの古いバージョンに問題がありました。他の人がコメントでほのめかしたように、このバグは Crittercism SDK の 4.3.1 バージョンで修正されました。

https://app.crittercism.com/downloads/release_notes/ios/4.3.1 :

修正: iOS 7 での実行時に UIWebViews が最初の起動時にデータのロードに失敗するアプリの回避策。これは UIWebView をサブクラス化するアプリでのみ発生し、Crittercism は Apple にバグ レポートを提出しました。注 - アプリケーションは UIWebView を直接サブクラス化しない場合がありますが、これは Google AdMob や Millenial Media SDK などの多くの一般的なサードパーティ ライブラリで行われることに注意してください。

于 2014-01-23T19:06:00.883 に答える
7

Crittercism をバージョン 4.1.2 に更新したことで問題が解決することを願っていましたが、解決されませんでした。私は非常に醜いが単純な解決策を提供することができます:UIWebView呼び出す前に作成して初期化します[Crittercism enableWithAppID:@"***...***"];

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    ...
    UIWebView* fakeWebView = [[[UIWebView alloc] initWithFrame:CGRectMake(-1, -1, 1, 1)] autorelease];
    [fakeWebView loadHTMLString:@"<!DOCTYPE HTML><html><body>I need Crittercism</body></html>" baseURL:nil];
    [mainViewController.view addSubview:fakeWebView];

    [Crittercism enableWithAppID:@"***...***"];
    ...
}

このトリックにより、説明されている問題を取り除くだけでなく、実数の最初の初期化をわずかに高速化することができましたUIWebView

于 2013-11-06T17:20:55.210 に答える
3

admob広告を表示しようとすると、このエラーが表示されました.crittercismが有効になっていると、ログにそのエラーが表示されます.ちなみに、広告も表示されませんでした.

これを修正するために、crittercism インストルメンテーションを無効にしました。

[Crittercism enableWithAppID:@"your_app_id" andDelegate:nil andURLFilters:nil disableInstrumentation:YES];

他の人が提案したように、単にWebビューを作成するだけでなく(サブビューとして追加する必要はありません)、私にとってもうまくいくようです。

[[UIWebView alloc] initWithFrame:CGRectMake(-1, -1, 1, 1)]
[Crittercism enableWithAppID:@"your_app_id"];
于 2014-01-09T13:11:24.663 に答える
2

試してみてくださいproduct --> clean。傷つくことはありません。アプリを実行するとreplace/compile、変更されたファイルのみが表示されます。バグが発生し、変更されたxCodeファイルがコンパイルされないことがあります。Product clean は、コンパイルされたコードの古いバージョンを削除するため、次回ビルドするときは、最後のコンパイルからすべてが削除されます。繰り返しますが、それによって失うものは何もありません。

于 2013-09-29T02:01:54.273 に答える
1

IOS7 の PhoneGap アプリケーションで同様の問題が発生しました。以下のコードを使用して、「viewDidAppear」または「Pageshow」でページの UI を再描画する必要がありましたが、これでうまくいきました。

 $(".cls_div_page_content").redraw();
 jQuery.fn.redraw = function() {
   return this.hide(0, function(){$(this).show()});
 };
于 2013-10-15T23:13:09.670 に答える
1

私はあなたと同じ問題を見ています。私が試してみました:

  • 読み込みリクエストをviewDidLoadからviewWillAppearとviewDidAppearに移動しましたが、これは何の助けにもなりませんでした
  • ロード要求が行われた後、webview をリロードしようとしました。まだ何もない
  • URLの作成をURLWithStringからfileURLWithPathに変更しようとしましたが、まだ何もありません

さらに奇妙なのは、ページが読み込まれないときにどのデリゲート メソッドも起動しないことです。Web ビューがページを読み込もうとさえしていないかのようです。それでも、あなたが言ったように、マルチタスク ビューからアプリを閉じて再度開くと、すべて正常に動作します。

これを回避する方法を見つけたり、解決策を見つけたりできましたか?

于 2013-10-09T22:04:58.553 に答える
1

特定のiOSバージョンで利用できないものを使用している場合、このエラーが何度も発生する可能性があります..たとえば

NSString *test=@"これをテスト";

[test containsString:@"test"];

iOS 7.1 で containsString を使用すると、同じ次のエラーが発生しますが、iOS 8.0 では問題なく動作します。

void SendDelegateMessage(NSInvocation *): デリゲート (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) は、10 秒待った後に戻ることができませんでした。メイン実行ループ モード: kCFRunLoopDefaultMode

于 2015-01-22T10:02:26.720 に答える
1

私もこの問題に遭遇しました。特定のサードパーティのライブラリがリンクされているときに問題が発生しているようですが、私の場合はどれが原因だったのか正確にはわかりません. 私のアプリには Crittercism がありませんでした。

私にとってそれを修正したのは、AppleのDev ForumでここでUIWebView見つけた早期にインスタンス化するという提案でした。

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // In a severe case of WTF: some 3rd party libs (exact culprit unknown) can cause webviews to stop
    // showing anything on iOS 7, and instead have console warnings every 10 seconds that look like:
    // void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode
    // Just instantiating an UIWebView before any of the 3rd party libs kick in is enough to fix it.
    // Don't know why, but it works.
    if (SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
        webView.delegate = nil; // Do something with webView to silence warning
    }
    return YES;
}
于 2015-11-30T04:30:16.853 に答える