【问题标题】:ios App works while testing but crashes after releaseios App 在测试时工作,但在发布后崩溃
【发布时间】:2012-11-18 12:29:50
【问题描述】:

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

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

但是!适用于: -iPhone 4 (iOS 5.0) ?!?

因为从 xcode 启动时它可以正常工作,所以我们无法重现此错误,有什么想法吗?

这是来自崩溃日志的 sn-p,您需要更多详细信息吗?

谢谢!

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

@安东尼奥 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];
    }
}

【问题讨论】:

  • 你能粘贴[CDVViewController viewDidLoad]的代码吗
  • 为什么不用 iOS6 而用 iOS5 测试呢?
  • 我们确实使用 iOs5 和 iOs6 对其进行了测试 - 并且在使用 xcode 进行测试时它工作正常。崩溃仅在发布后发生。
  • 调试和发布设置可能有所不同。在设备上分析应用程序(使用仪器),这将运行发布版本。您也可以通过这种方式更轻松地追踪崩溃。
  • 添加这些符号断点。然后运行它。它可能会到达崩溃的地方。
     malloc_error_break -[NSException raise] objc_exception_throw 
    或尝试启用
    NSZombieEnabled

标签: ios xcode cordova crash release


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    确保存档并运行应用程序

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

    另外,我感觉您使用的是 iOS 6 中已弃用的方法。(您显然收到“未定义选择器”错误,提示您访问了您不应该访问的方法)检查您使用的方法在 iOS 6 中可用。

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

    【讨论】:

    • 你说得对,我们收到 3 个警告:“'invokeString is deprecated: Deprecated in Cordova 2.0. Use window.handleOpenUrl instead. 当应用程序通过自定义方案 url 启动时调用。”会不会是这个原因?
    • 我对此表示怀疑。您可以毫无问题地使用许多不推荐使用的方法(尽管不建议),它们仍然会运行。但是有一些特定的方法会在 iOS6 上被阻止。我认为您遇到了其中之一,以我自己的经验访问 ivars 是一个常见问题。您是否尝试过使用 iOS SDK 6 编译您的代码,并在 iPhone 5 上存档并运行它(如果您可以使用它)我会尝试从 CDViewController 中的 viewDidLoad 方法中注释掉一些东西,以找出有问题的
    猜你喜欢
    • 2018-09-13
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多