简体   繁体   中英

ios App works while testing but crashes after release

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM