Swift

[Swift] iOS 기기 내 PDF 혹은 파일 첨부 하는 방법

웰코발 2023. 3. 24. 20:52

일하다가 요건으로 pdf 파일을 넘겨줘야하는 상황이 있었다.

애플에서 미리 만들어 놓은 함수를 통해 간단히 파일을 끌어올 수 있었다.

나의 기억력은 나쁘기 때문에 까먹으면 다음에 써먹으려고 적는다...

import UniformTypeIdentifiers
import PDFKit

class VC: UIViewController {

    let filePickerViewController = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.pdf], asCopy: true)
    
    ...
    
    func someThingEvent() {
    	filePickerViewController.delegate = self
        filePickerViewController.allowsMultipleSelection = false
        filePickerViewController.shouldShowFileExtensions = true
        self.present(filePickerViewController, animated: true)
    }

}


extension VC: UIDocumentPickerDelegate {
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        
        let bookmarkData = try? urls.first?.bookmarkData()
        
        if let data = bookmarkData {
            var stale = false
            
            if let url = try? URL(resolvingBookmarkData: data, bookmarkDataIsStale: &stale),
               stale == false,
               url.startAccessingSecurityScopedResource() {
                var error: NSError?
                
                NSFileCoordinator().coordinate(readingItemAt: url, error: &error) { readUrl in
                    
                    if let data = try? Data(contentsOf: readUrl) {
                        
                        guard let doc = PDFDocument(data: data) else {
                            
                            url.stopAccessingSecurityScopedResource()
                            return
                        }
                        // 파일 명은 url.lastPathComponent
                        // pdf파일은 doc
                        ... pdf 데이터로 할 것들...
                            
                        
                        
                    }
                }
                
                url.stopAccessingSecurityScopedResource()
                
            }
            
        }
    }
    
}