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
相关产品推荐
相关产品推荐

