usakc
usakc

Reputation: 455

iOS 7 UIWebView not rendering

I'm porting my app to iOS 7 and I have a problem with UIWebView in iOS 7. I load local html string in it with this code:

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

It works perfectly on iOS 6 and prior but on iOS 7 it doesn't rendering and the UIWebView is still white. And this message appears in console:

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

Thanks for your replies.

Upvotes: 28

Views: 11554

Answers (10)

Johan Kool
Johan Kool

Reputation: 15927

I ran into this issue too. It seems the problem is caused when certain 3rd party libraries are linked, but I am not even sure exactly which one was responsible in my case. I didn't have Crittercism in my app.

What fixed it for me was the suggestion I found here on Apple's Dev Forum to instantiate a UIWebView early.

- (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;
}

Upvotes: 1

Alex
Alex

Reputation: 2468

For those who are using Parse SDK with the 1.6.x version under iOS7/iOS8 and subclass UIWebView, same problem will appear if you are using PFInstallation saveInBackground method.

Solution is to delay call saveInBackground, e.g.:

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

Upvotes: 0

user2968901
user2968901

Reputation: 87

many times this error can come in case u are using something that is not available in that particular iOS version.. for example

NSString *test=@"test this";

[test containsString:@"test"];

use of containsString in iOS 7.1 will give you the same following error, but it will work fine in iOS 8.0,

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

Upvotes: 1

Jeremiah Edwards
Jeremiah Edwards

Reputation: 171

There was a problem with older version of the Crittercism library which caused this. As others have alluded to in comments, this bug was fixed in the 4.3.1 version of the Crittercism SDK.

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

fix: Workaround for apps experiencing UIWebViews failing to load data on first launch when running on iOS 7. This only occurs in apps that subclass UIWebView, and Crittercism has filed a bug report with Apple. Note - Be aware that while your application may not directly subclass UIWebView, this is done in many common 3rd party libraries such as the Google AdMob and Millenial Media SDKs.

Upvotes: 9

nacross
nacross

Reputation: 2043

I had this error appearing trying to display admob ads, when ever crittercism was enabled I would get that error in the logs, incidentally the ads were not displaying either.

To fix it, I disabled crittercism instrumentation, this might not be an option for everyone.

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

If not simply creating a webview (You don't need to add it as a subview) as suggested by others seems to work for me as well.

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

Upvotes: 3

Andrii Kovalevskyi
Andrii Kovalevskyi

Reputation: 387

For those of us who updated Crittercism to the version 4.1.2 hoping that it would solve the issue but it didn't. I can offer quite an ugly but simple solution: create and initialize UIWebView before calling [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:@"***...***"];
    ...
}

This trick allowed me not only to get rid of a described problem, but also slightly speed up the first initialization of a real UIWebView.

Upvotes: 7

Mrudula Chunduri
Mrudula Chunduri

Reputation: 129

I had similar issues with my PhoneGap application on IOS7, i had to Redraw the UI of the page on "viewDidAppear" or "Pageshow" using the below code and this worked for me.

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

Upvotes: 1

Trunal Bhanse
Trunal Bhanse

Reputation: 1691

As mentioned by @zaplitny, I had to update Crittercism to the latest version (4.1.0) for this problem to go away.

Upvotes: 11

SLEW
SLEW

Reputation: 201

I am seeing the same problem you are. I have tried:

  • moving the load request from the viewDidLoad to the viewWillAppear and viewDidAppear, this did not help anything
  • tried reloading the webview after the load request was made. still nothing
  • tried changing the URL creation from URLWithString to fileURLWithPath and still nothing

What is even more strange is that none of the delegate methods fire when the page doesnt load. it is almost as if the web view doesnt even attempt to load the page. Yet, like you said, if you close the app from the multitask view and reopen it, everything works fine.

were you able to figure out a way around this or found a solution?

Upvotes: 1

Paulpjmmchugh
Paulpjmmchugh

Reputation: 160

Try product --> clean. It can't hurt. When you run an app it will only replace/compile the files that changed. Some times the xCode bugs up and doesn't compile a changed file. Product clean deletes old versions of the compiled code so next time you build it will have been all from the last compile. Again you have nothing to lose by doing it.

Upvotes: 2

Related Questions