在 iOS 应用程序 运行 中的 Mac Catalyst 中的 DropInteraction 中接收 JSON 文件

Receive JSON file in DropInteraction in iOS app running in Mac Catalyst

tl;dr:无法在 iOS 应用程序 运行ning 中加载通过 DropInteraction 接收的 JSON 文件 Mac Catalyst。

我目前正在 Mac Catalyst 下将我现有的 (Swift) iOS 代码库重构为 运行,但在读取、加载甚至查看时遇到问题我的 UIDropInteractionDelegate.

收到的 JSON 个文件

我正在按照此处的示例进行操作:https://appventure.me/guides/catalyst/how/drag_and_drop.html

我正在尝试删除一个文件 snse.json,它是一个普通的印刷精美的 JSON 文本文件,但在 func 3 (performDrop)、session.items 中是一个没有任何用处的单项数组。

当我在 performDrop 中设置断点时,我得到以下调试输出:

(lldb) po session.items.first?.itemProvider
▿ Optional<NSItemProvider>
  - some : <NSItemProvider: 0x600003876ca0> {types = (
    "public.json",
    "com.apple.finder.node"
)}

(lldb) po session.items.first?.itemProvider.suggestedName
▿ Optional<String>
  - some : "snse.json"

(lldb) po session.items.first?.localObject
nil

(lldb) po session.items.first?.previewProvider
nil

(lldb) po session.items.first?.itemProvider.canLoadObject(ofClass: URL.self)
▿ Optional<Bool>
  - some : false

(lldb) po session.items.first?.itemProvider.canLoadObject(ofClass: String.self)
▿ Optional<Bool>
  - some : false

这是我目前的代码:

class SentimentViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.interactions.append(UIDropInteraction(delegate: self))
    }
}


extension SentimentViewController: UIDropInteractionDelegate {
    
    static let JSONTypeIdentifier = "public.json"
    
    // 1
    func dropInteraction(_ interaction: UIDropInteraction,
                         canHandle session: UIDropSession) -> Bool {
        return session.hasItemsConforming(toTypeIdentifiers: [JSONTypeIdentifier])
    }

    // 2
    func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
        return UIDropProposal(operation: .copy)
    }

    // 3
    func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
        // This is called with an array of NSURL
        let _ = session.loadObjects(ofClass: URL.self) { urls in
            for url in urls {
                self.importJSONData(from: url)
                print(url)
            }
        }
    }
    
    private func importJSONData(from url: URL) {
        print("I would love to load data from \(url).")
    }
}

我确定我做错了什么,但我不知道是什么。 我需要请求权限才能读取本地文件吗? 我错过了一步吗? 非常感谢任何帮助!

你不需要URL,因为drop item已经有JSON数据的item provider,所以只需要从NSItemProvider中提取数据并解码。

这里是固定部分(用Xcode 12.1测试过)

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
    session.items.forEach { item in
        guard item.itemProvider.hasItemConformingToTypeIdentifier(SentimentViewController.JSONTypeIdentifier) else { return }
        item.itemProvider.loadDataRepresentation(forTypeIdentifier: SentimentViewController.JSONTypeIdentifier) { data, error in
            if let data = data {
                self.importJSONData(from: data)
            }
        }
    }
}

private func importJSONData(from data: Data) {
    print("Decode JSON from \(data.description).")
}