2011-02-10 167 views
3

如果我运行一个干净的版本和全新安装,我的应用程序安装并运行得很好,但是,如果我安装以前发布的版本,然后用新版本覆盖该版本,它将崩溃第一次运行。iOS应用程序崩溃升级

步骤来重现

  1. 安装并在iPhone上运行我的应用程序(1.4)的以前版本的4
  2. 关闭应用程序,并杀害的过程。
  3. 结帐最新版本(2.0)
  4. 删除构建目录
  5. 安装和运行
  6. 崩溃

我跑的Xcode 3.2.5,4.2 SDK。我的iPhone 4是4.2.1。

如果你看看崩溃日志,看起来好像我的NIB中有一个坏连接,但没有任何对象试图连接到我的AppController中的'view'属性。有时会发生相同的崩溃,除非它会说此类不是密钥值编码兼容的关键活动指示符。这也是不可靠的,因为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:永远不会被调用。

+0

线索是:“该类不是关键值编码 - 关键活动指示符”这意味着该笔尖告诉框架在AppController上存在(或者是)activityIndi​​cator IBOutlet。你可能已经在XCode中删除它,但从未更新过你的笔尖。打开你的笔尖,并像在InterfaceBuilder中定义的那样检查AppController的属性。 – Cliff 2011-02-10 14:54:45

+0

这不是问题,Cliff。该应用程序在干净的安装中加载和运行完美。 – kubi 2011-02-10 14:58:53

+0

我假设当你从AppStore更新应用程序包被完全删除和替换的应用程序,这将解决这个问题。不过,我不想提交我的二进制文件,直到我确信。 – kubi 2011-02-10 15:01:42

回答

4

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

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

2

问题很明显,旧版本在文件系统上留下了一些数据,而新版本无法正常提取它。如果您保存的是某个文件的位置,请确保它仅存储与应用程序目录相关的路径,而不是整个系统路径,因为内部捆绑包ID在更新过程中发生更改。

1

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