ios App在测试时有效,但在发布后崩溃

时间:2012-11-30 09:47:59

标签: ios xcode cordova crash release

我们刚刚发布了一款使用xcode 4.5.2,cordova-2.2.0的新iPhone应用程序 测试时一切正常。但在今天发布后,它立即崩溃。开始屏幕闪烁一秒钟,然后崩溃。

崩溃: -iPhone 5(iOs 6.0.1) -iPhone 4s(iOs 6.0.1) -iPhone 4(iOs 6.0.1)

BUT!适用于: -iPhone 4(iOs 5.0)?!?

因为它从xcode开始工作时我们无法重现这个错误,有什么想法吗?

这是崩溃日志的一个片段,您需要更多详细信息吗?

谢谢!

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 这是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];
    }
}

2 个答案:

答案 0 :(得分:0)

似乎你在viewDidLoad中调用CDVViewController无法处理的方法。最好检查您在该方法中发送给该类实例的所有消息(很可能是self.property或[self something])。

答案 1 :(得分:0)

确保归档并运行应用程序

当您在调试模式下运行它时,您将得到不同的编译,因此可能会有不同的结果。 (调试模式=从XCode中单击运行时运行)

另外,我感觉你在iOS 6中使用了一种不推荐使用的方法。(你明显得到一个'未定义的选择器'错误,它提示你访问一个你不应该访问的方法)检查​​一下您使用的方法在iOS 6中可用。

此外,请确保您没有访问ivars。据我所知,iOS 6禁用访问私人ivars。