We just released a new iPhone App using xcode 4.5.2, cordova-2.2.0 Everything worked fine while testing. But after the release today it crashes instantly. The start screen is flickering for a second, then it crashes.
Crashes with: -iPhone 5 (iOs 6.0.1) -iPhone 4s (iOs 6.0.1) -iPhone 4 (iOs 6.0.1)
BUT! Works with: -iPhone 4 (iOs 5.0) ?!?
Because it's working when starting from xcode we can't reproduce this error, any ideas?
This is a snippet from crash log, do you need more details?
Thanks!
Last Exception Backtrace:
0 CoreFoundation 0x39e0b3e2 __exceptionPreprocess + 158
1 libobjc.A.dylib 0x38e6495e objc_exception_throw + 26
2 CoreFoundation 0x39e0ef2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 180
3 CoreFoundation 0x39e0d648 ___forwarding___ + 388
4 CoreFoundation 0x39d65204 _CF_forwarding_prep_0 + 20
5 myapp 0x0003dff4 -[CDVViewController viewDidLoad] + 1352
6 myapp 0x000114dc -[MainViewController viewDidLoad] (MainViewController.m:62)
7 UIKit 0x3363a544 -[UIViewController loadViewIfRequired] + 360
8 UIKit 0x3367ad2c -[UIWindow addRootViewControllerViewIfPossible] + 60
9 UIKit 0x33676ac8 -[UIWindow _setHidden:forced:] + 360
10 UIKit 0x336b819c -[UIWindow makeKeyAndVisible] + 56
11 myapp 0x00011260 -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:108)
12 UIKit 0x3367ba74 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 248
13 UIKit 0x3367b5f8 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1164
14 UIKit 0x33673806 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 694
15 UIKit 0x3361bcea -[UIApplication handleEvent:withNewEvent:] + 1006
16 UIKit 0x3361b778 -[UIApplication sendEvent:] + 68
17 UIKit 0x3361b1ba _UIApplicationHandleEvent + 6194
18 GraphicsServices 0x39eaf5f2 _PurpleEventCallback + 586
19 CoreFoundation 0x39de08f2 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 10
20 CoreFoundation 0x39de0158 __CFRunLoopDoSources0 + 208
21 CoreFoundation 0x39ddef2a __CFRunLoopRun + 642
22 CoreFoundation 0x39d52238 CFRunLoopRunSpecific + 352
23 CoreFoundation 0x39d520c4 CFRunLoopRunInMode + 100
24 UIKit 0x33672440 -[UIApplication _run] + 664
25 UIKit 0x3366f28c UIApplicationMain + 1116
26 myapp 0x00010e92 main (main.m:32)
27 myapp 0x00010e44 start + 36
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x39b75350 __pthread_kill + 8
1 libsystem_c.dylib 0x3310dfb2 pthread_kill + 54
2 libsystem_c.dylib 0x3314a366 abort + 90
3 libc++abi.dylib 0x33205dda abort_message + 70
4 libc++abi.dylib 0x33203094 default_terminate() + 20
5 libobjc.A.dylib 0x38e64a58 _objc_terminate() + 144
6 libc++abi.dylib 0x33203118 safe_handler_caller(void (*)()) + 76
7 libc++abi.dylib 0x332031b0 std::terminate() + 16
8 libc++abi.dylib 0x33204626 __cxa_rethrow + 90
9 libobjc.A.dylib 0x38e649b0 objc_exception_rethrow + 8
10 CoreFoundation 0x39d5229c CFRunLoopRunSpecific + 452
11 CoreFoundation 0x39d520c4 CFRunLoopRunInMode + 100
12 UIKit 0x33672440 -[UIApplication _run] + 664
13 UIKit 0x3366f28c UIApplicationMain + 1116
14 myapp 0x00010e92 main (main.m:32)
15 myapp 0x00010e44 start + 36
@Antonio Here comes the viewDidLoad
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void) viewDidLoad
{
[super viewDidLoad];
NSString* startFilePath = [self pathForResource:self.startPage];
NSURL* appURL = nil;
NSString* loadErr = nil;
if (startFilePath == nil) {
loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage];
NSLog(@"%@", loadErr);
self.loadFromString = YES;
appURL = nil;
} else {
appURL = [NSURL fileURLWithPath:startFilePath];
}
//// Fix the iOS 5.1 SECURITY_ERR bug (CB-347), this must be before the webView is instantiated ////
BOOL backupWebStorage = YES; // default value
if ([self.settings objectForKey:@"BackupWebStorage"]) {
backupWebStorage = [(NSNumber*)[settings objectForKey:@"BackupWebStorage"] boolValue];
}
if (backupWebStorage) {
[CDVLocalStorage __verifyAndFixDatabaseLocations];
}
//// Instantiate the WebView ///////////////
[self createGapView];
///////////////////
NSNumber* enableLocation = [self.settings objectForKey:@"EnableLocation"];
NSString* enableViewportScale = [self.settings objectForKey:@"EnableViewportScale"];
NSNumber* allowInlineMediaPlayback = [self.settings objectForKey:@"AllowInlineMediaPlayback"];
BOOL mediaPlaybackRequiresUserAction = YES; // default value
if ([self.settings objectForKey:@"MediaPlaybackRequiresUserAction"]) {
mediaPlaybackRequiresUserAction = [(NSNumber*)[settings objectForKey:@"MediaPlaybackRequiresUserAction"] boolValue];
}
self.webView.scalesPageToFit = [enableViewportScale boolValue];
/*
* Fire up the GPS Service right away as it takes a moment for data to come back.
*/
if ([enableLocation boolValue]) {
[[self.commandDelegate getCommandInstance:@"Geolocation"] getLocation:nil];
}
/*
* Fire up CDVLocalStorage on iOS 5.1 to work-around WebKit storage limitations, or adjust set user defaults on iOS 6.0+
*/
if (IsAtLeastiOSVersion(@"6.0")) {
// We don't manually back anything up in 6.0 and so we should remove any old backups.
[CDVLocalStorage __restoreThenRemoveBackupLocations];
[[NSUserDefaults standardUserDefaults] setBool:backupWebStorage forKey:@"WebKitStoreWebDataForBackup"];
} else {
if (backupWebStorage) {
[self.commandDelegate registerPlugin:[[CDVLocalStorage alloc] initWithWebView:self.webView] withClassName:NSStringFromClass([CDVLocalStorage class])];
} else {
[CDVLocalStorage __restoreThenRemoveBackupLocations];
}
}
/*
* This is for iOS 4.x, where you can allow inline <video> and <audio>, and also autoplay them
*/
if ([allowInlineMediaPlayback boolValue] && [self.webView respondsToSelector:@selector(allowsInlineMediaPlayback)]) {
self.webView.allowsInlineMediaPlayback = YES;
}
if (mediaPlaybackRequiresUserAction == NO && [self.webView respondsToSelector:@selector(mediaPlaybackRequiresUserAction)]) {
self.webView.mediaPlaybackRequiresUserAction = NO;
}
// UIWebViewBounce property - defaults to true
NSNumber* bouncePreference = [self.settings objectForKey:@"UIWebViewBounce"];
BOOL bounceAllowed = (bouncePreference==nil || [bouncePreference boolValue]);
// prevent webView from bouncing
// based on UIWebViewBounce key in Cordova.plist
if (!bounceAllowed) {
if ([ self.webView respondsToSelector:@selector(scrollView) ]) {
((UIScrollView *) [self.webView scrollView]).bounces = NO;
} else {
for (id subview in self.webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
}
}
///////////////////
if (!loadErr) {
NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
[self.webView loadRequest:appReq];
} else {
NSString* html = [NSString stringWithFormat:@"<html><body> %@ </body></html>", loadErr];
[self.webView loadHTMLString:html baseURL:nil];
}
}
It seems that you call a method inside viewDidLoad that the CDVViewController can't handle. Is better that you check all the messages that you are sending to the instance of that class inside that method(most probably self.property or [self something]).
Make sure you archive and run the application
When you run it in debug mode, you'd get different compilation and hence possibly different outcome. (Debug mode = when you run from within XCode clicking Run)
Also, I get the feeling you're using a method deprecated in iOS 6. (You're clearly getting a 'undefined selector' error, which hints at accessing a method that you shouldn't be accessing) Check that the methods you use are available in iOS 6.
Furthermore, make sure you're not accessing ivars. Accessing private ivars are disabled from iOS 6 as far as I know.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.