iOS App在升级时崩溃

时间:2011-02-10 12:46:00

标签: iphone xcode ios

如果我运行干净的构建和全新安装,我的应用程序安装并运行得很好,但是,如果我安装以前发布的版本,然后用新版本覆盖该版本,它将在首次运行时崩溃。

重现步骤

  1. 在iPhone 4上安装并运行我的应用程序的先前版本(1.4)。
  2. 关闭应用并终止进程。
  3. 结帐最新版本(2.0)
  4. 删除构建目录
  5. 安装并运行
  6. 崩溃
  7. 我正在运行Xcode 3.2.5,4.2 SDK。我的iPhone 4是4.2.1。

    如果您查看崩溃日志,我的其中一个NIB中的连接似乎很糟糕,但没有对象尝试连接到AppController中的“视图”属性。有时会发生相同的崩溃,除非它会说此类不是密钥值编码兼容的关键activityIndi​​cator 。这也很糟糕,因为grep已经确认我的项目中没有任何内容,名为 activityIndi​​cator

    我有三个问题:

    • 为什么我的应用程序崩溃?
    • 有人对我能做的进一步调试有任何想法吗?我已经没有关于如何解决这个问题的想法了。
    • 可能(可能?)当Xcode在您的设备上安装构建时,它需要从商店安装应用程序时不会采用的快捷方式。有谁知道是否是这种情况,如果是这样,你知道一种方法来模拟确切的应用程序商店安装过程,所以我可以确保我没有杀死我的所有升级程序的应用程序?

    崩溃日志

    2011-02-10 06:58:32.115 TheApp[132:307] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AppController 0x14d680> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.'
    *** Call stack at first throw:
    (
        0   CoreFoundation                      0x33ac0987 __exceptionPreprocess + 114
        1   libobjc.A.dylib                     0x3347b49d objc_exception_throw + 24
        2   CoreFoundation                      0x33ac0705 -[NSException dealloc] + 0
        3   Foundation                          0x3367db4f -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 182
        4   Foundation                          0x3367d03b _NSSetUsingKeyValueSetter + 90
        5   Foundation                          0x3367eda3 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 194
        6   Foundation                          0x33630b17 -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 130
        7   UIKit                               0x3224c60f -[UIRuntimeOutletConnection connect] + 66
        8   CoreFoundation                      0x33a63fc7 -[NSObject(NSObject) performSelector:] + 18
        9   CoreFoundation                      0x33a6cd51 -[NSArray makeObjectsPerformSelector:] + 388
        10  UIKit                               0x3224b577 -[UINib instantiateWithOwner:options:] + 586
        11  UIKit                               0x3224cb39 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 92
        12  UIKit                               0x3209e871 -[UIApplication _loadMainNibFile] + 96
        13  UIKit                               0x3209a1fd -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 180
        14  UIKit                               0x3206648b -[UIApplication handleEvent:withNewEvent:] + 1114
        15  UIKit                               0x32065ec9 -[UIApplication sendEvent:] + 44
        16  UIKit                               0x32065907 _UIApplicationHandleEvent + 5090
        17  GraphicsServices                    0x33b0ef03 PurpleEventCallback + 666
        18  CoreFoundation                      0x33a556ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
        19  CoreFoundation                      0x33a556c3 __CFRunLoopDoSource1 + 166
        20  CoreFoundation                      0x33a47f7d __CFRunLoopRun + 520
        21  CoreFoundation                      0x33a47c87 CFRunLoopRunSpecific + 230
        22  CoreFoundation                      0x33a47b8f CFRunLoopRunInMode + 58
        23  UIKit                               0x32099309 -[UIApplication _run] + 380
        24  UIKit                               0x32096e93 UIApplicationMain + 670
        25  TheApp                              0x00002781 main + 88
        26  TheApp                              0x00002724 start + 40
    )
    

    -

    我应该补充一点,应用程序在进入我的任何代码之前就会崩溃,即永远不会调用application:didFinishLaunchingWithOptions:applicationDidFinishLaunching:

3 个答案:

答案 0 :(得分:4)

终于弄明白了问题所在。我的应用程序的先前版本未本地化,因此所有NIB都位于应用程序包的顶层。我的应用的最新版本已已本地化,因此所有NIB都位于en.lproj目录中。当Xcode将应用程序部署到设备(和模拟器)时,替换整个软件包,它只是将构建文件复制到现有软件包中。这导致我的NIB的两个版本,我的应用程序包顶层的过时版本和子文件夹中的当前版本。

当应用程序设置时,它会拉动最顶层的NIB,这是不正确的NIB,导致崩溃。因此,我需要实际将.ipa部署到我的手机上以测试升级。

答案 1 :(得分:2)

问题显然是旧版本在文件系统上留下了一些数据,而新版本无法正确地获取它。如果要保存文件位置之类的内容,请确保它只存储相对于应用程序目录的路径,而不是整个系统路径,因为内部包ID在更新期间会发生变化。

答案 2 :(得分:1)

这与文件系统位置无关。您的笔尖和应用程序逻辑不一致。我的猜测是你已经完成了改变你的项目中使用的AppController的类型,而没有更新你的笔尖或更改了一个IBOutlets而没有更新你的笔尖。发生的事情是在nib的反序列化过程中,框架尝试连接类似于以前存在于旧控制器类型但不再存在于新AppController类型中的IBOutlet。