【问题标题】:UIWebview javascript failing only in Release buildUIWebview javascript 仅在发布版本中失败
【发布时间】:2013-08-19 03:07:49
【问题描述】:

我正在尝试将我的 Backbone 应用程序的 javascript 手动注入 UIWebview(以便在应用程序启动时避免客户端下载 1MB JS 文件)。

下面的代码在应用程序的 DEBUG 版本中运行良好,但一旦构建了 Ad Hoc 版本并对其进行测试,应用程序就无法正确加载。我认为这是某个地方的 JS 错误,但我不知道如何调试在发布版本中运行的 UIWebview(据我所知,Safari 开发工具只能在 Debug 中工作)。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    // Inject the JS
    NSLog(@"Injecting JS 1 from disk");
    NSString *path = [[NSBundle mainBundle] pathForResource:@"backbone_application" ofType:@"js"];
    NSString *code = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSString *jsCode = [NSString stringWithFormat:@"var script=document.createElement('script'); script.type='text/javascript'; script.text=\"%@\"; document.head.appendChild(script);", code];
    [self.webPortal stringByEvaluatingJavaScriptFromString:jsCode]
}

关于为什么这会在 RELEASE 模式下失败的任何想法? 关于如何在发布版本中测试 UIWebview javascript 错误的任何建议?

【问题讨论】:

    标签: javascript ios objective-c uiwebview


    【解决方案1】:

    尝试删除以下行:

    NSString *jsCode = [NSString stringWithFormat:@"var script=document.createElement('script'); script.type='text/javascript'; script.text=\"%@\"; document.head.appendChild(script);", code];
    

    所以你会得到这个:

    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        // Inject the JS
        NSLog(@"Injecting JS 1 from disk");
        NSString *path = [[NSBundle mainBundle] pathForResource:@"backbone_application" ofType:@"js"];
        NSString *code = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        [self.webPortal stringByEvaluatingJavaScriptFromString:code]
    }
    

    【讨论】:

      【解决方案2】:

      对于每种构建模式,您的代码的项目和目标都有设置​​。在我看来,您有一个或多个 DEBUG 模式设置与 RELASE 模式不同。仔细检查是否有任何设置不同,其他证明这一点的方法是在 DEBUG 模式下为 Ad Hoc 分发创建存档(您可以在 Scheme Editing Dialog 上编辑它。)如果这个新的 .IPA 按预期运行,那么肯定DEBUG/RELEASE 有不同的设置。

      希望对你有帮助,

      【讨论】:

      • 到目前为止我尝试了 2 件事:1) 将运行应用程序的构建配置设置为发布,但我收到 Xcode 错误:“无法启动 'MyApp';未能获得进程 4910 的任务” ; 2) 将 Archive 的 Build Config 设置为 Debug,并通过 iTunes 在设备上创建和安装 IPA 文件。它开始安装,然后弹出“iTunes Sync:'MyApp' 安装失败。”所以运行“相反”的构建配置似乎是不可能的。
      • 听到这个消息很难过。为了更好地了解可能是什么问题,您说它在 DEBUG 版本上运行良好您如何测试它?使用模拟器还是直接连接到设备?然后你正在生成一个带有 RELEASE 模式的 .IPA,当尝试通过 iTunes 在同一设备上安装它失败时,应用程序是否运行但似乎没有加载 JS 或者它根本不工作?
      • 感谢您的快速回复!是的,它在调试版本中运行良好。我的意思是,在应用程序启动时,我加载主页(不包含任何 JS),加载完成后,我注入 JS(包括 JS 库 + 我们自己的函数等),然后调用 App. start() 启动主干应用程序。这一切都在开发中。当我在发布模式下生成 .IPA 并通过 iTunes 安装时,我正常运行应用程序,它执行相同的操作(加载页面、注入 JS 并调用 App.start())但没有任何反应。由于是发布版本,无法调试 JS。
      • PS,我只是一一检查了所有的构建设置,并从 RELEASE 复制了值并在 DEBUG 部分使用它。希望 RELEASE 中的值之一导致了问题,但没有运气。
      • 我明白了。可能导致此问题的其他原因是您调用“backbone_application”文件的方式。请记住,文件系统区分大小写,因此请检查文件名是否拼写正确。您可能会检查的另一件事是资源的路径。如果您正在使用子目录,则应该使用更精确的方法,例如 NSString * path = [[NSBundle mainBundle] pathForResource:@"backbone_application" ofType:@"js" inDirectory:@"directory/subdirectory"];
      【解决方案3】:
      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 2020-12-16
      • 2016-04-30
      • 2011-09-23
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多