You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift读取PDF功能模拟器正常 真机无输出如何解决

问题根因

真机上通过fileImporter获取的外部文件URL属于安全范围URL(Security-scoped URL),必须显式申请访问权限才能读取内容,模拟器没有这类严格沙箱限制所以可以正常运行,你之前添加的Info.plist配置和该访问权限无关。

修复方案

拿到选中的文件URL后,首先调用startAccessingSecurityScopedResource()申请临时访问权限,访问完成后必须配对调用stopAccessingSecurityScopedResource()释放权限,避免资源泄漏。

修改后可正常运行的代码如下:

import PDFKit

@State var openFile = false

Button(action:{
    openFile.toggle()
}){
    Image(systemName: "exclamationmark.circle.fill")
}
.fileImporter(isPresented: $openFile,
              allowedContentTypes: [.pdf],
              onCompletion: {result in
    if let fileURL = try? result.get() {
        print(fileURL)
        // 真机必须先申请安全范围URL访问权限
        let canAccess = fileURL.startAccessingSecurityScopedResource()
        defer {
            // 无论读取结果如何,最后都要释放权限
            if canAccess {
                fileURL.stopAccessingSecurityScopedResource()
            }
        }
        guard canAccess else {
            print("无法获取文件访问权限")
            return
        }
        if let pdf = PDFDocument(url: fileURL) {
            print(pdf)
            let pageCount = pdf.pageCount
            print(pageCount)
            let documentContent = NSMutableAttributedString()

            for i in 0 ..< pageCount {
                guard let page = pdf.page(at: i) else { continue }
                guard let pageContent = page.attributedString else { continue }
                documentContent.append(pageContent)
            }
           
            print(documentContent.string)
        }
    }
})
额外说明
  • 如果你需要长期持有该文件URL后续访问,不能直接存储原始URL,需要将URL转换为书签数据持久化,下次使用时再把书签转回URL并申请权限即可
  • 你之前添加的Supports opening documents in place和Application supports iTunes file sharing配置是用来将你的App自身文档目录暴露给用户和iTunes的,和读取外部选中文件的权限无关,无对应需求可以直接移除

内容的提问来源于stack exchange,提问作者LeonardoXUI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 05:54:04