【问题标题】:What could possibly break an app during update through the iOS App Store?在通过 iOS App Store 更新期间,有什么可能会破坏应用程序?
【发布时间】:2012-03-28 18:09:20
【问题描述】:

我在 App Store 中的 iPad 应用程序中遇到了一个非常奇怪且极难解决的问题。有关该应用程序在推出新版本后不再工作的报告在过去几周内成倍增加。现在,我能够在内部新 iPad 上重现该问题,该 iPad 已从旧版本的备份中恢复,然后通过正常的 App Store 程序进行更新。

问题:虽然应用程序在通过 App Store 新安装或通过 XCode 运行时运行良好,但在更新后它根本无法按预期运行。但是,一旦应用程序处于“损坏”状态,我什至无法通过有效的 XCode 安装新版本。在这种情况下,这可能是一件好事,因为它可以帮助我解决这个问题。

我们有什么:

  • 该应用有一组UIWebViews,用于从网页加载内容。
  • 网页加载一个 Javascript 框架并创建一个全局对象h5,该对象可用于调用其中的方法。
  • 从这里在通信应用程序上 -> UIWebView 是通过对这个 h5 对象的 [webView stringByEvaluatingJavaScriptFromString] 调用完成的。

问题来了:

  • 在 UIWebView 中设置了 html,但如果更新应用,JavaScript 似乎不会执行。
  • 我可以通过 [webView stringByEvaluatingJavaScriptFromString] 运行 javascript 内容,并且可以通过这种方式检索呈现的 outerHTML,只是为了发现我的 <script> 内容丢失,因此未执行。

不用说,如果我通过应用商店或 XCode 进行全新安装,应用运行良好,JavaScript 被执行并且没有问题。

到目前为止我尝试了什么:

  • 我们使用 Three20 库来实现我们的一些功能,它有一个缓存。此缓存已被清除,并检查是否真的被清除。
  • 我删除了<Application root>/Library/caches中的所有内容
  • 我没有通过单独的请求加载 URL,然后通过 [webView loadData] 将其推送到 WebView,而是尝试
    • 使用[webView loadRequest]直接从网络服务器加载URL
    • NSData 转换为NSString 并将其推入[webView loadHTMLString]
    • 有一个 NSString 持有 html 并将其推送到 [webView loadHTMLString] 而无需远程加载内容。

我有点想不通这可能是什么原因,我想听听您对这个问题的看法。我错过了什么吗?

【问题讨论】:

    标签: ios app-store


    【解决方案1】:

    我可以说我不知道​​为什么您的特定系统无法正常工作。不过我可以提供一些我希望有用的建议。

    从你所说的,我明白:

    1. A 版应用正常
    2. 应用 B 版的全新安装工作正常
    3. 将版本 B 安装在版本 A 的顶部会软管应用程序。

    对我来说,这表明版本 A 遗留了一些干扰版本 B 的东西 - 例如位于优先于新文件的路径中的旧文件。

    我知道你说你清理了缓存,但是系统中是否还有其他地方存储了未清理的数据?

    因此,总的来说,我建议对应用程序进行一些深入的取证,以追踪每个版本中所有资产的名称和位置,并确保它们可以被解释。

    好处是,当您使用该应用程序时,它是永久性的。这种错误比“有时”发生的事情更容易找到。

    【讨论】:

    • 您知道其他地方可能在哪里吗?我在<Application root>/Library/Caches 中找到了一些文件并将其清除(似乎也清除了 Three20 的缓存。这应该是应用程序直接或间接创建文件的所有地方(某些东西显然是由 iOS 自动编写的)AFAIK。只是为了确定我还检查了各种其他文件夹(文档、应用程序支持、下载)以查找可能给我提示的文件,但一无所获。有没有办法列出与我的应用程序相关的所有文件?
    • @mwidmann 很抱歉,我没有可以帮助您的具体知识。虽然我自己是一名 iOS 新手,但我是根据终生的故障查找软件系统职业生涯提供一般性建议。顺便说一句,属于应用程序的列表文件听起来像是一个很棒的 SO 问题!
    【解决方案2】:

    还有一些资产要检查:

    检查所有文件名(图像、HTML、CSS 等)、plist 项和设置的大小写。

    检查所有保存/加载的 NSDefaults 并检查所有应用版本的有效值。

    【讨论】:

      【解决方案3】:

      去年他们在 Xcode 中添加了新的数据导入/导出工具后,我也遇到了同样的问题!重现和调试问题的最佳方法是安装旧版本,使用 Xcode 管理器中的数据导出工具导出数据,然后构建并使用 Xcode 安装新版本。接下来,停止应用程序,导入您之前导出的数据,然后从 Xcode 构建/运行以尝试重新创建崩溃。如果你像我一样幸运,gdb/lldb 将在错误时停止,揭示问题的根源。您还可以尝试使用蛮力发布新版本的方法,该方法会删除先前版本中的所有数据,但这可能会留下很多不满意的用户。

      【讨论】:

        【解决方案4】:

        我有关于这个问题的更新。我能够解决这个问题,但遗憾的是我不能 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
        

        这里我彻底失败了,并实施了清除方法来删除文件,而不是一个一个地找出导致问题的文件。

        所以现在我有了一个工作版本,但我不知道这四个文件中的哪一个破坏了它。最有可能是Cookies.binarycookies

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 1970-01-01
          • 2017-10-02
          相关资源
          最近更新 更多