2011-02-10 165 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。