2017-08-24 5 views
0

ファイルを永続的に保存することはできませんが、別のアプリに保存したりどこかに送信したい場合は、お客様が自分で決定することができます。 UIDocumentInteractionControllerの仕事のようですが、持続性の部分はありません。UIDocumentInteractionControllerでメモリからファイルを開くにはどうすればよいですか?

は、ドキュメントの内部Appleは述べている:

「[...]あなたは アプリのDocuments /共有ディレクトリに同期されたファイルを使用して文書の相互作用コントローラを使用することができます」

ファイルをUIDocumentInteractionControllerのファイルとして保存せずに直接開くことはできますか?

すでにデータとしてPDF /画像があります。データをURLにエンコードし、それを使用してインタラクションコントローラを開く方法はありますか?

+0

、使用してみてください。私はかなりの時間のための解決策を探しました。問題は、UIDocumentInteractionControllerがローカルファイルURLだけを受け入れることです。 –

+0

しかし、あなたがNSTemporaryDirectoryを使用することは許されていますか? –

答えて

1

これは実行できません。ローカルリソースのみを共有できます。

あなたができることは、一時フォルダにファイルを保存してアクセスすることです。以下は、これを達成する方法のコードです。説明のコメントをチェックアウトしてください:

import UIKit 

class ViewController: UIViewController { 
    let sharingController = UIDocumentInteractionController() 
    override func viewDidAppear(_ animated: Bool) { 
        super.viewDidAppear(animated) 
        if let pdfURL = Bundle.main.url(forResource: "yourPDF", withExtension: "pdf") { 
            do { 
                let pdfData = try Data(contentsOf: pdfURL) 
                // create a destination url to save your pdf data 
                let destURL = FileManager.default.temporaryDirectory.appendingPathComponent("tempFile.pdf") 
                // write your pdf data to the destinastion url 
                do { 
                    try pdfData.write(to: destURL) 
                    // share your url using UIDocumentInteractionController 
                    shareURL(url: destURL) 
                } catch { 
                    print(error) 
                } 
            } catch { 
                print(error) 
            } 
        } 
         
    } 
    func shareURL(url: URL){ 
        sharingController.url = url 
        sharingController.uti = "public.data, public.content" 
        sharingController.name = url.lastPathComponent 
        sharingController.presentOptionsMenu(from: view.frame, in: view, animated: true) 
    } 
} 

一時ディレクトリにあるので、ファイルを削除する必要はありません。

+1

それは唯一の解決策かもしれないという印象を持っていました。アプリケーションを閉じたり開いたりするときはいつでも、tmpをクリーンアップして終了すると思います。コード共有ありがとう。 – BennX

+0

アイデアありがとう。ログアウト時にtmpディレクトリをクリアして、それと組み合わせて、互換性のためにiOS <10実装を使用しました。それがガイドラインを通過するかどうかを見てみましょう。 – BennX

+1

@BennX、npさん、お世話になりました。レビューと幸運! –

0

は、悲しいことに、それは不可能です

import UIKit 
    import QuickLook 
    class YourViewController:UIViewController,QLPreviewControllerDataSource, QLPreviewControllerDelegate { 

     func openFile(){ 

     let objURL = "file URL " 
     let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String 
     let url = URL(fileURLWithPath: path) 
     let theFileName = (objURL as NSString).lastPathComponent 
     let filePath = url.appendingPathComponent("\(theFileName)").path 
     let fileManager = FileManager.default 
     if fileManager.fileExists(atPath: filePath) { 
      print("FILE AVAILABLE") 
      self.pathString = filePath 
      let viewPDF = QLPreviewController() 
      viewPDF.dataSource = self 
      viewPDF.delegate = self 
      self.item.previewItemTitle = self.previewFileTitle 
      self.item.previewItemURL = URL.init(fileURLWithPath: filePath) 
      self.present(viewPDF, animated: true, completion: nil) 
     } else { 
      print("FILE NOT AVAILABLE") 
      previewFileTitle = theFileName 
      self.downloadPDF(objURL) 
     } 


    } 

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int { 
     return 1 
    } 

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { 

     let url = URL(fileURLWithPath: pathString) 

     return item as QLPreviewItem 
    } 

    func previewController(_ controller: QLPreviewController, shouldOpen url: URL, for item: QLPreviewItem) -> Bool { 
     return true 
    } 
    func downloadPDF(_ url:String){ 
     let requestURL: URL = URL(string: url)! 
     let urlRequest: URLRequest = URLRequest(url: requestURL) 
     let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 
      if let httpResponse = response as? HTTPURLResponse { 
       let statusCode = httpResponse.statusCode 
       if (statusCode == 200) { 
        print("Downloaded Successfully") 
        let documentsDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first 
        let sourceUrl = URL(string:url)! 
        //Get the file name and create a destination URL 
        let fileName = sourceUrl.lastPathComponent 
        let destinationURL = documentsDirectoryUrl!.appendingPathComponent(fileName) 

        //Hold this file as an NSData and write it to the new location 
        if let fileData = try? Data(contentsOf: sourceUrl) { 
         try? fileData.write(to: destinationURL, options: []) // true 
         print(destinationURL.path) 
         self.pathString = destinationURL.path 
         let viewPDF = QLPreviewController() 
         viewPDF.dataSource = self 
         viewPDF.delegate = self 
         self.item.previewItemTitle = self.previewFileTitle 
         self.item.previewItemURL = destinationURL 
         self.present(viewPDF, animated: true, completion: nil) 
        } 

       }else{ 
       } 
      } 
     } 
     task.resume() 

    } 
} 

class PreviewItem: NSObject, QLPreviewItem { 
    var previewItemURL: URL? 
    var previewItemTitle: String? 
} 

Developer documentation
See this tutorial

関連する問題