PSPDFKit and UIWebView doesn't work together - ios

I use PSPDFKit into a static framework linked to a main project which uses another static framework with a UIWebView.
After the loading of the main project, when I launch the UIWebView and call the request, I have this error:
void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode
and nothing appends in the webview.
If I doesn't load PSPDFKit into my first framework, the issue doesn't appear and all is ok.
I also found that if I link all the frameworks needed by PSPDFKit but not the PSPDFKit, I have the same bug. I must remove the MessageUI framework to have the right behaviour.
But when I include PSPDFKit even without MessageUI, the bug occurs.
Someone have an idea to solve it or find a workaround?
The bug occurs on iOS 7 versions, only on devices not on simulator. And all works fine in iOS 6.
I found this post UIWebView: decidePolicyForNavigationAction? but the resolution is not very clear!
Thanks

So I solve this bug. I don't know why this bug appeared and I don't know why my fix work.
In fact, I remove old code for the compatibility with iOS 5. This code used the objc/runtime.h library and its goal was to inject into all our UIViewController subclasses if they don't implement shouldAutorotateToInterfaceOrientation:
We used this code to do that
Method shouldAutorotateToInterfaceOrientation = class_getInstanceMethod([self class], #selector(shouldAutorotateToInterfaceOrientation:));
class_addMethod(class, #selector(shouldAutorotateToInterfaceOrientation:), method_getImplementation(shouldAutorotateToInterfaceOrientation), method_getTypeEncoding(shouldAutorotateToInterfaceOrientation));

Related

WKWebView causing Bad Syntax before iOS 11

I have a project with iOS8.0+ support. I am using a WKWebView to load payment page; the page is working fine on iOS 11.0+ but it is showing bad Syntax for iOS 9 and 10. The info inside the loaded request are fetched from the server so there is no possibility that the error is in the request information.
Can anyone help me with issues known about WKWebView or any other similar issue?
There is a bug in WKWebView before iOS 11 that requires programmatic creation of the WKWebView instance (so you cannot do it from Storyboard).
A discussion & resolution of this issue can be found here:
Xcode 9 GM - WKWebView NSCoding support was broken in previous versions

Google Cast SDK for iOS crash with DCIntrospect

On my app, when I add the googleCast SDK, the app crash at launching, on this method [[DCIntrospect sharedIntrospector] start];. But when I don't have GoogleCast SDK, everything is working fine.
Here is the assertion log :
*** Assertion failure in -[GCKPB_PBFieldDescriptor initWithFieldDescription:rootClass:], /Volumes/BuildData/pulse-data/agents/wpye22.hot/recipes/415961027/base/googlemac/iPhone/Chromecast/SDKv2/Protos/../../../../ThirdParty/ProtocolBuffers/objectivec/Classes/PBDescriptor.m:409
This works fine if I run the project on an iPhone 5C, but crashing on the simulator (32-bit simulator).
Any idea on how to solve this crash, and still continue to use DCIntrospect ?
I had the same issue.
I was able to reproduce this issue, so I filed this bug.
Introspection triggers the +initialize method of the GCKPB_PBGeneratedMessage class.
This method apparently makes some bad assumptions about when +initialize will get triggered.
While waiting for a fix you can always use the workaround suggested here and mock GCKPB_PBGeneratedMessage's +initialize method.

XCode setting to see code which won't work on previous OS versions

I've written an app specifically for iOS7, and am now attempting to make it work for iOS6.
I'd really like a setting to enable warnings which highlight lines of code which won't work on iOS6. i.e. any calls to code which ONLY work on iOS7.
That way I can immediately identify any lines of code which I need to attend to before catching them during debugging.
Does this even exist?
There is two option to deal with this.
Use MJGAvailability, a drop in header file and it will make warnings if a selector is "too new".
Buy Delpoymate, it can scan your Xcode project and show you any incompatible calls.
If you use an older Xcode next to the newest, than use this snippet:
if ([self respondsToSelector:#selector(newSelector)]){
#if __IPHONE_7_0
[self newSelector];
#endif
} else {
[self oldSelector];
}
There is no way of getting a warning to appear and even if there was how would the IDE now that you would have done something to handle it like the below
if([myObject respondsToSelect:#selector(myiOS7SelectorOnly)]) {
[myObject myiOS7SelectorOnly];
}
It works the other way if you where developing an app for iOS7 and you used a deprecated method that iOS7 API doesn't use any more it would give you a warning but not the other way you will have to wait for it to turn around and crash and throw an unrecognised selector exception.
At some point I had 2 Xcode installed - Xcode 4 and Xcode 5. Xcode 4 did not have API for ios7 and it was showing all incompatibilities.
But I don't know where can you find XCode4 now and will it still show errors in ios7 code or not?
At least you can try this way.

UIWebView webCore crashes in iOS7.1 (example: www.latimes.com)

I have being seeing crashes in my iOS app, when opening LA Times (www.latimes.com). The crash happens in WebCore somewhere and I have no clue where. Profiling with both "Zombie" or "leaks" do not return anything for this "EXE_BAD_ADDRESS" error.
I also checked with a small, bare UIWebView app and I could reproduce the effects.
Right now, I see this happening only with LA times, but I am not sure if there are other sites as well.
Can someone check on and guide me in what could be the possible error/source for this crash?
EDIT: I have added a small UIWebView project demonstrating this bug at
github
EDIT 2: The app (include the demo at github) works perfectly fine on iOS 7.0, but crashes in iOS 7.1 ... seems a recent bug with iOS 7.1. I have issued a bug report to Apple and will keep updated.
Thanks in advance,
Nikhil
I happened to bump into that same issue with one of my apps in iOS>7.0 only.
It seems to be a sync issue which can be fixed by creating the webview from the main thread only.
As a fix I just wrapped my UIWebView creation in a dispatch_sync(dispatch_get_main_queue(), ^{ ... });
And it solved the problem.
Of course if your code is running on the main thread you shouldn't wrap it this way ;)

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.
As mentioned by #zaplitny, I had to update Crittercism to the latest version (4.1.0) for this problem to go away.
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.
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.
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"];
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.
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?
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()});
};
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
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;
}
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];
});

Resources