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

SwiftUI .fileImporter在真实iPhone设备上无法正常工作的问题

SwiftUI .fileImporter 在真实iPhone设备上失效的问题

SwiftUI的.fileImporter功能已出现问题长达一年:该功能在iPhone模拟器、Mac Catalyst及真实iPad设备上均能正常工作,但在真实iPhone设备测试时,文件选择器无法选中文件,弹窗完全无法关闭,回调函数也不会触发。而使用UIKit的UIDocumentPickerViewController时,无论在Mac Catalyst、模拟器、iPad还是真实iPhone上,所有功能均正常运行。

复现步骤

  • 创建一个基于SwiftUI的新Xcode项目。
  • 替换ContentView.swift中的代码为以下内容:
import SwiftUI

struct ContentView: View {
    @State var sShowing = false
    @State var uShowing = false
    
    @State var showAlert = false
    @State var alertText = ""
    var body: some View {
        VStack {
            VStack {
                Button("Test SWIFTUI") {
                    sShowing = true
                }
            }
            .fileImporter(isPresented: $sShowing, allowedContentTypes: [.item]) {result in
                alertText = String(describing: result)
                showAlert = true
            }
            VStack {
                Button("Test UIKIT") {
                    uShowing = true
                }
            }
            .sheet(isPresented: $uShowing) {
                DocumentPicker(contentTypes: [.item]) {url in
                    alertText = String(describing: url)
                    showAlert = true
                }
            }
            .padding(.top, 50)
        }
        .padding()
        .alert(isPresented: $showAlert) {
            Alert(title: Text("Result"), message: Text(alertText))
        }
    }
}
  • 创建新文件DocumentPicker.swift,并粘贴以下代码:
import SwiftUI
import UniformTypeIdentifiers

struct DocumentPicker: UIViewControllerRepresentable {
    let contentTypes: [UTType]
    let onPicked: (URL) -> Void

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
        let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: contentTypes, asCopy: true)
        documentPicker.delegate = context.coordinator
        documentPicker.modalPresentationStyle = .formSheet
        return documentPicker
    }

    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {}

    class Coordinator: NSObject, UIDocumentPickerDelegate {
        var parent: DocumentPicker

        init(_ parent: DocumentPicker) {
            self.parent = parent
        }

        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            print("Success!", urls)
            guard let url = urls.first else { return }
            parent.onPicked(url)
        }

        func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
            print("Picker was cancelled")
        }
    }
}
  • 在Mac Catalyst上运行项目,确认功能正常。
  • 在真实iPhone设备上测试,即可复现问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:43:16