5

我正在尝试将一个大型 Keynote 文件(~150MB)加载到 a 中UIWebView,并且我不断收到内存警告并且我的应用程序崩溃。

有没有解决的办法?

打开这么大的文件而不在另一个应用程序中打开它们的正确方法是什么?

4

2 回答 2

1

当您直接从 url 打开文件时UIWebView,下载的内容会临时存储在 RAM 中。RAM 是整个设备的共享空间,它必须执行其他与操作系统相关的任务。因此,由于内存压力和资源紧缩,您的应用程序正在被 iOS 杀死。

NSDocumentsDirectory建议在后台直接将您的内容写入文件并UIWebView稍后加载文件。

据我所知,我可以向您推荐以下内容。

下载部分

预览部分

希望有帮助。

于 2014-05-12T07:33:25.750 回答
0

如果它是一个大文件,你不能/不应该使用UIWebView.

为什么?我试图显示一个包含几张图像的文档文件(docx),但在引发内存警告后,我的应用程序崩溃了。原因很简单。尽管文件大小约为 2.5 MB,但设备没有足够的 RAM/内存来显示所有位图图像(嵌入在文档中)。使用 Instruments 调试问题显示应用程序内存从 30 MB 飙升至 230 MB。我想你正在经历类似的事情。

可能的解决方案:

  1. 不允许用户在其移动设备上打开大文件。要么,要么UIWebView在收到内存警告时优雅地停止/停止加载过程。

    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    
        if ([self.webView isLoading]) {
            [self.webView stopLoading];        
        }
    }
    
  2. 尝试改用[UIApplication sharedApplication] openURL:]方法。

  3. 尝试UIDocumentInteractionController改用。

    UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:targetURL];
    documentInteractionController.delegate = self;
    
    BOOL present = [documentInteractionController presentPreviewAnimated:YES];
    
    if (!present) {
        // Allow user to open the file in external editor
        CGRect rect = CGRectMake(0.0, 0.0, self.view.frame.size.width, 10.0f);
        present = [documentInteractionController presentOpenInMenuFromRect:rect inView:self.view animated:YES];
    
        if (!present) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                message:@"Cannot preview or open the selected file"
                                                               delegate:nil
                                                      cancelButtonTitle:NSLocalizedString(@"OK", nil)
                                                      otherButtonTitles:nil, nil];
            [alertView show];
        }
    }
    

注意:我没有尝试使用上述方法打开主题文件。为了使用UIDocumentInteractionController,您必须先下载文件。

希望这可以帮助。

于 2015-06-11T07:16:22.543 回答