LoginSignup
bekoneggu525
@bekoneggu525

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ios端末にpdfを表示させる

解決したいこと

Swiftuiで、pdfファイルを選択し、表示させるアプリをつくっています。
xcodeのシミュレータで実行する際には、問題なくpdfが表示されるのですが、実機(ipad)で実行すると、pdfが表示できなくなります。
解決方法を教えてください。

開発環境

xcode15.0.1
swiftui
ios17.1.1

発生している問題

ファイルが存在しません: 
//ここにファイルが保存されてるURLが表示
エラー: PDFドキュメントの読み込みに失敗しました,

上記のように、実機での実行になると、「ファイルが存在しない」と表示されます。シミュレータで実行した際は、「ファイルが存在します」と表示されます。
また、実機で実行した際も、ファイルを選択する画面までは出てきているので、ファイルは存在していると思います。

該当するソースコード

import SwiftUI
import PDFKit
import UniformTypeIdentifiers

struct ContentView: View {
    @State private var pdfDocument: PDFDocument?
    @State private var isDocumentPickerPresented = false

    var body: some View {

                    VStack {
                        // PDFViewを追加
                        PDFViewContainer(pdfDocument: $pdfDocument)
                            .padding()
                        
                        Button("PDFファイルを選択") {
                            isDocumentPickerPresented = true
                        }
                        .padding()
                        
                    }
        
        .fileImporter(
            isPresented: $isDocumentPickerPresented,
            allowedContentTypes: [UTType.pdf],
            onCompletion: { result in
                switch result {
                case .success(let url):

                    // FileManagerを使用してファイルが存在するか確認
                    let fileManager = FileManager.default
                    if fileManager.fileExists(atPath: url.path) {
                        print("ファイルが存在します: \(url.path)")
                    } else {
                        print("ファイルが存在しません: \(url.path)")
                    }

                    //  PDFDocumentの作成
                    if let document = PDFDocument(url: url) {
                        print("PDFドキュメントが正常に読み込まれました")
                        self.pdfDocument = document
                    } else {
                        let error = NSError(domain: "com.example.PDFApp", code: 1, userInfo: [NSLocalizedDescriptionKey: "PDFドキュメントの読み込みに失敗しました"])
                        print("エラー: \(error.localizedDescription), \(error.localizedFailureReason ?? "")")
                    }


                case .failure(let error):
                    print("ファイル選択時にエラーが発生しました:\(error.localizedDescription)")
                }
            }
        )
    }
}

struct PDFViewContainer: UIViewRepresentable {
    @Binding var pdfDocument: PDFDocument?

    func makeUIView(context: Context) -> PDFView {
        let pdfView = PDFView()
        //pdfの拡大率を調整
        pdfView.autoScales = true
        //表示モード
        pdfView.displayMode = .singlePage
        
        return pdfView
    }

    func updateUIView(_ uiView: PDFView, context: Context) {
        uiView.document = pdfDocument
    }
}

自分で試したこと

複数のpdfファイルで試しましたが、すべて表示できませんでした。また、appleIDの設定やファイルのアクセス権限は確認しました。

0

1Answer

セキュリティが一層厳しくなったようです。
とりあえず、startAccessingSecurityScopedResource / stopAccessingSecurityScopedResourceで囲むことで表示できました。

中略
                switch result {
                    case .success(let url):
                        
                        guard url.startAccessingSecurityScopedResource() else {
                            // Handle the failure here.
                            print("startAccessingSecurityScopedResource error")
                            return
                        }
                        
                        // FileManagerを使用してファイルが存在するか確認
                        let fileManager = FileManager.default
                        if fileManager.fileExists(atPath: url.path) {
                            print("ファイルが存在します: \(url.path)")
                        } else {
                            print("ファイルが存在しません: \(url.path)")
                        }
                        
                        //  PDFDocumentの作成
                        if let document = PDFDocument(url: url) {
                            print("PDFドキュメントが正常に読み込まれました")
                            self.pdfDocument = document
                        } else {
                            let error = NSError(domain: "com.example.PDFApp", code: 1, userInfo: [NSLocalizedDescriptionKey: "PDFドキュメントの読み込みに失敗しました"])
                            print("エラー: \(error.localizedDescription), \(error.localizedFailureReason ?? "")")
                        }
                        
                        url.stopAccessingSecurityScopedResource()
                        
中略
1Like

Comments

  1. @bekoneggu525

    Questioner

    できました!ありがとうございます。

Your answer might help someone💌