2012-03-28 11 views
2

我面對一個非常奇怪的問題,並且非常難以解決我們在App Store中使用的iPad應用程序的問題。報告稱,在新版本推出後,該應用程序不再工作,在過去幾周內已經成倍增長。現在,我可以在內部新iPad上重現問題,該iPad已從舊版本的備份中恢復,然後通過正常的App Store程序進行更新。在通過iOS App Store更新期間可能會破壞應用程序的是什麼?

問題:如果新應用程序通過App Store安裝或通過XCode運行,應用程序可以正常工作,但它在更新後根本無法按預期工作。一旦應用程序處於「中斷」狀態,我甚至不能通過XCode安裝新版本。在這種情況下,這可能是一件好事,因爲它會幫助我希望解決這個問題。

我們有什麼:

  • 應用都有一套UIWebView期從網頁加載內容。
  • 該網頁加載一個Javascript框架並創建一個全局對象h5,它可以用來調用其中的方法。
  • 從這裏開始通信App - > UIWebView是通過對這個h5對象的[webView stringByEvaluatingJavaScriptFromString]調用完成的。

這裏來的問題:

  • 的HTML在UIWebView的精細設置,但JavaScript的似乎並沒有得到執行,如果應用程序的更新。
  • 我可以通過[webView stringByEvaluatingJavaScriptFromString]運行javascript的東西,我可以通過這種方式檢索呈現的outerHTML,只是爲了發現我的<script>東西丟失,因此沒有執行。

不用說,如果我通過應用商店或XCode進行全新安裝,應用程序運行良好,JavaScript執行並且沒有問題。

我試過到目前爲止:

  • 我們使用Three20庫我們的一些功能,它有一個緩存。該緩存已被清除並檢查它是否真的被清除。
  • <Application root>/Library/caches
  • 刪除一切而不是通過一個單獨的請求加載的URL,然後通過[webView loadData]它推到的WebView的我試圖
    • 負載直接從Web服務器的URL以[webView loadRequest]
    • 轉換NSDataNSString並推送通過[webView loadHTMLString]
    • 有一個NSString持有HTML並推送通過[webView loadHTMLString]而不需要加載的東西雷莫tely。

我有點出的進一步的想法可能是什麼原因在這裏,我想獲得在這個問題上你的意見。我錯過了什麼嗎?

回答

2

前面我可以說我不知道​​爲什麼你的特定系統不工作。不過,我可以提供一些我希望有用的建議。

從你所說的話,我的理解是:

  1. 的應用程序的版本A的工作
  2. 一個乾淨的安裝版本B的的應用程序的工作原理
  3. 以上版本的基礎上安裝版本B軟管應用程序。

對我來說,這表示版本A中存在干擾版本B的內容 - 例如位於優先於新文件的路徑中的舊文件。

我知道你說你清理了緩存,但系統中還有其他地方存儲了未清理的數據嗎?

所以一般來說,我會建議做一些應用程序的深度取證,以追蹤每個版本中所有資產的名稱和位置,並確保它們可以被佔用。

好東西是,當你軟管應用程序,它是永久的。這種錯誤比「有時」發生的事情更容易定位。

+0

你有什麼想法可以在其他地方?我在'/Library/Caches'中找到了一些文件,並清除了它(似乎也清除了Three20的緩存,這應該是所有應用程序直接或間接的地方(有些東西顯然是由iOS自動編寫的)創建文件AFAIK。爲了確保我也檢查了各種其他文件夾(文檔,應用程序支持,下載)文件,可能會給我一個提示,但什麼也沒找到。有沒有辦法列出所有與我的應用程序相關的文件? – mwidmann 2012-03-28 18:34:25

+0

@mwidmann對不起,但我沒有具體的知識可以幫助你,雖然我自己是一個iOS新手,但我一直給出基於故障查找軟件系統一生職業生涯的一般建議。到一個應用程序聽起來像一個偉大的SO問題! – 2012-03-28 18:46:27

0

一些更多的資產,以檢查:

檢查所有的文件名(圖像,HTML,CSS等)的plist項目和設置的資本化。

檢查保存/加載的所有NSDefaults並檢查所有應用程序版本的有效值。

0

在Xcode中添加新的數據導入/導出工具之後,我在去年遇到了同樣的問題!重新編譯和調試問題的最佳方式是安裝舊版本使用Xcode組織者中的數據導出工具導出數據,然後構建並使用Xcode安裝新版本。接下來,停止應用程序,導入之前導出的數據,然後從Xcode構建/轉至嘗試重新創建崩潰。如果你像我一樣幸運,gdb/lldb將停止顯示問題來源的錯誤。你也可以嘗試一種暴力破解的方式來發佈一個新版本,它會刪除以前版本的所有數據,但這可能會留下很多不愉快的用戶。

0

我對此問題有更新。我能夠消除這個問題,但遺憾的是我不能100%確定我刪除了哪些文件,是問題的根源。不過,我想分享我的方法。

我很確定問題必須存在於應用程序文件夾的某處,否則它不會發生該應用程序在全新安裝後工作,但不會在更新時發生。

我決定比較我的應用程序內的文件系統,當做一個乾淨的安裝或更新後的這個損壞的版本。我決定遍歷應用程序的文件夾並打印出文件。清除緩存之前和之後。我下面的代碼添加到我的AppDelegate比較:

NSArray *paths = [NSArray arrayWithObjects: 
         [NSNumber numberWithUnsignedInt:NSApplicationDirectory], 
         [NSNumber numberWithUnsignedInt:NSAutosavedInformationDirectory], 
         [NSNumber numberWithUnsignedInt:NSDesktopDirectory], 
         [NSNumber numberWithUnsignedInt:NSCachesDirectory], 
         [NSNumber numberWithUnsignedInt:NSApplicationSupportDirectory], 
         [NSNumber numberWithUnsignedInt:NSDownloadsDirectory], 
         [NSNumber numberWithUnsignedInt:NSInputMethodsDirectory], 
         [NSNumber numberWithUnsignedInt:NSMoviesDirectory], 
         [NSNumber numberWithUnsignedInt:NSMusicDirectory], 
         [NSNumber numberWithUnsignedInt:NSPicturesDirectory], 
         [NSNumber numberWithUnsignedInt:NSPrinterDescriptionDirectory], 
         [NSNumber numberWithUnsignedInt:NSSharedPublicDirectory], 
         [NSNumber numberWithUnsignedInt:NSPreferencePanesDirectory], 
         [NSNumber numberWithUnsignedInt:NSItemReplacementDirectory], 
         [NSNumber numberWithUnsignedInt:NSAllApplicationsDirectory], 
         [NSNumber numberWithUnsignedInt:NSAllLibrariesDirectory], 
         nil]; 

NSFileManager *manager = [NSFileManager defaultManager]; 
for (NSNumber *directory in paths) { 
    NSArray *tp = NSSearchPathForDirectoriesInDomains([directory unsignedIntegerValue] , NSUserDomainMask, YES); 
    if ([tp count] == 0) 
     continue; 

    NSString *path = [tp objectAtIndex:0]; 

    NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:path]; 
    NSString *filename; 

    NSLog(@"-------------------------------------------------------"); 
    NSLog(@"== path: %@", path); 
    NSLog(@"-------------------------------------------------------"); 

    while (filename = [direnum nextObject]) { 
     NSString *thefile = [NSString stringWithFormat:@"%@/%@", path, filename]; 
     NSLog(@"\t%@, deletable? %d", filename, [manager isDeletableFileAtPath:thefile]); 
    } 

} 

我則比較輸出,並發現該文件只留下住在NSAllLibrariesDirectory。也就是說,他們

Cookies/Cookies.binarycookies 
Preferences/.GlobalPreferences.plist 
Preferences/com.apple.PeoplePicker.plist 
Preferences/com.medienhaus.VOL.plist 

在這裏,我epically失敗並實施了結算方法來刪除,而不是一個會接一個地找出哪個文件導致問題的文件。

所以,現在我有一個工作版本,但我不知道這四個文件中的哪一個會破壞它。最有可能的是Cookies.binarycookies

相關問題