2013-10-24 39 views
5

我想加載一個大的Keynote文件(〜150MB)到一個UIWebView,我不斷收到內存警告和我的應用程序崩潰。iOS - SDK - 如何在UIWebView中打開大型基調文件?

有沒有辦法解決這個問題?

如何在不打開其他應用程序的情況下打開這麼大的文件的正確方法是什麼?

+1

嗨,我也面臨同樣的問題。你有沒有找到解決方案? – Ilanchezhian

回答

1

當您直接從url打開UIWebView中的文件時,下載的內容會臨時存儲在RAM中。 RAM是整個設備的共享空間,它必須執行其他與操作系統相關的任務。因此,由於內存壓力&資源緊縮,您的應用正在被iOS殺死。

建議您直接將您的內容寫入NSDocumentsDirectory後臺的文件&稍後加載文件UIWebView

以我的知識,我可以建議你以下。

下載部分

預覽部分

希望有所幫助。

+0

感謝您的回答。實際的問題是,該文件已被下載到docs目錄。使用該文件路徑,我創建了url請求並在webview中加載了該文件。只有它在崩潰。 – Ilanchezhian

+0

我會在這裏說,用100 + mb的其他文件來測試這個用例。檢查是否打開。可能是PDF或一些文檔。它可能是損壞的文件,導致崩潰。 –

+0

爲了測試這個用例,我已經用一個doc文件進行了測試。它正在崩潰。更重要的是,文件沒有被破壞。 – Ilanchezhian

0

如果它是一個大文件,你不能/不應該使用UIWebView

爲什麼?我試圖用一些圖像顯示一個文檔文件(docx),並且在拋出內存警告後我的應用程序崩潰了。原因很簡單。儘管文件大小爲〜2.5 MB,但設備沒有足夠的RAM /內存來顯示所有位圖圖像(嵌入在文檔中)。使用儀器調試問題表明應用程序內存從30 MB增加到230 MB。我想你正在經歷類似的事情。

可能的解決方案:

  1. 不要讓用戶打開其移動設備上的大文件。要麼,要麼在收到內存警告時正常停止/暫停加載過程。

    - (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,您必須先下載文件。

希望這會有所幫助。