IOS application works during testing, but crashes after release

We just released a new iPhone app using xcode 4.5.2, cordova-2.2.0 During testing, everything worked fine. But after leaving today, it instantly falls. The initial screen flickers for a second, then it falls.

Failure: -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)?!?

Since it works on startup with xcode, we cannot reproduce this error, any ideas?

This is a fragment from the crash log, do you need 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 is 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]; } } 
+4
source share
2 answers

It seems that you are calling a method inside viewDidLoad that the CDVViewController cannot handle. It is better to check all the messages that you send to an instance of this class inside this method (most likely, self.property or [self something]).

0
source

Make sure you archive and run the application

When you run it in debug mode, you will get a different compilation and possibly a different result. (Debug mode = when you start from Xcode by clicking Run)

In addition, I get the feeling that you are using a method that is deprecated in iOS 6. (Obviously, you get an "undefined selector" error that indicates access to a method that you should not access). that the methods you use are available in iOS 6.

Also, make sure you are not accessing ivars. As far as I know, access to personal ivars is disabled from iOS 6.

0
source

All Articles