iOS 7 UIWebView无法渲染

时间:2013-09-28 10:46:14

标签: ios uiwebview ios7

我将我的应用移植到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

感谢您的回复。

10 个答案:

答案 0 :(得分:11)

如@zaplitny所述,我不得不将Crittercism更新到最新版本(4.1.0),以免这个问题消失。

答案 1 :(得分:9)

旧版本的Crittercism库出现了问题。正如其他人在评论中提到的那样,这个错误在Crittercism SDK的4.3.1版本中得到了修复。

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

  

修复:遇到UIWebViews无法加载数据的应用的解决方法   在iOS 7上运行时首次启动。这仅发生在应用程序中   子类UIWebView,Crittercism已经向Apple提交了一份错误报告。   注意 - 请注意,虽然您的应用程序可能不直接子类   UIWebView,这是在许多常见的第三方库中完成的,例如   Google AdMob和Millenial Media SDK。

答案 2 :(得分: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的首次初始化。

答案 3 :(得分:3)

我出现了这个错误,试图显示admob广告,当启用了批评时,我会在日志中出现错误,顺便说一下广告也没有显示。

为了解决这个问题,我禁用了生物仪器,这可能不适合所有人。

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

如果不是简单地按照其他人的建议创建一个webview(你不需要将它添加为子视图)似乎对我有用。

[[UIWebView alloc] initWithFrame:CGRectMake(-1, -1, 1, 1)]
[Crittercism enableWithAppID:@"your_app_id"];

答案 4 :(得分:2)

试试product --> clean。它不会伤害。当您运行应用程序时,它只会replace/compile更改的文件。有时xCode错误并且不编译已更改的文件。产品干净删除旧版本的已编译代码,因此下次构建时,将完全从上次编译开始。再做一次,你没有什么可失去的。

答案 5 :(得分:1)

我看到了同样的问题。我试过了:

  • 将加载请求从viewDidLoad移动到viewWillAppear和viewDidAppear,这对任何事都没有帮助
  • 尝试在加载请求完成后重新加载webview。仍然没有
  • 尝试将URL创建从URLWithString更改为fileURLWithPath,但仍然没有

更奇怪的是,当页面没有加载时,没有任何委托方法触发。几乎就好像Web视图甚至没有尝试加载页面。然而,就像你说的,如果你从多任务视图关闭应用程序并重新打开它,一切正常。

您是否能够找到解决方法或找到解决方案?

答案 6 :(得分:1)

我在IOS7上的PhoneGap应用程序遇到了类似的问题,我不得不使用下面的代码在“viewDidAppear”或“Pageshow”上重绘页面的UI,这对我有用。

 $(".cls_div_page_content").redraw();
 jQuery.fn.redraw = function() {
   return this.hide(0, function(){$(this).show()});
 };

答案 7 :(得分:1)

很多时候,如果您使用的是特定iOS版本中没有的内容,则会出现此错误。 例如

NSString * test = @&#34;测试这个&#34 ;;

[test containsString:@&#34; test&#34;];

在iOS 7.1中使用containsString会给你相同的跟随错误,但它在iOS 8.0中可以正常工作,

void SendDelegateMessage(NSInvocation *):delegate(webView:decisionPolicyForNavigationAction:request:frame:decisionListener :) 等了10秒后没能回来。主运行循环模式:kCFRunLoopDefaultMode

答案 8 :(得分:1)

我也遇到过这个问题。似乎问题是在链接某些第三方库时引起的,但我甚至不确定在我的情况下究竟是哪一个负责。我的应用程序中没有Crittercism。

为我修复的是我发现here on Apple's 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;
}

答案 9 :(得分:0)

对于那些在iOS7 / iOS8和子类UIWebView下使用1.6.x版本的Parse SDK的用户,如果使用PFInstallation saveInBackground方法,则会出现同样的问题。

解决方案是延迟通话saveInBackground,例如:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [currentInstallation saveInBackground];
});