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

11

正如@zaplitny 所提到的,我必须将 Crittercism 更新到最新版本(4.1.0)才能解决这个问题。

于 2013-10-11T23:41:03.257 回答
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,但这是在许多常见的 3rd 方库中完成的,例如 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];

如果不是像其他人建议的那样简单地创建一个 webview(您不需要将其添加为子视图)似乎也对我有用。

[[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

我看到了同样的问题。我努力了:

  • 将加载请求从 viewDidLoad 移动到 viewWillAppear 和 viewDidAppear,这没有任何帮助
  • 发出加载请求后尝试重新加载 webview。依然没有
  • 尝试将 URL 创建从 URLWithString 更改为 fileURLWithPath 仍然没有

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

您是否能够找到解决此问题的方法或找到解决方案?

于 2013-10-09T22:04:58.553 回答
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

很多时候,如果您使用的是该特定 iOS 版本中不可用的东西,则可能会出现此错误。例如

NSString *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

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

为我解决的问题是我在 Apple 的开发论坛上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 回答
0

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

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

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [currentInstallation saveInBackground];
});
于 2015-03-14T15:06:00.367 回答