0

我尝试通过 iOS 共享表使用 CSV 数据。我的问题:共享表不提供应用程序“Apple Numbers”或“Microsoft Excel”进行导入!如果我先在共享表中使用“保存到文件”并稍后通过文件应用程序共享此保存的文件,Excel 和 Numbers 将显示为可能的目标并接受数据。

我已经尝试了许多不同的方法来提供我的数据,但我无法让 Numbers 和 Excel 在共享表中显示为目标。

知道如何实现吗?

我尝试提供数据的三种方式如下所示:

提供 CSV 作为数据:

private var dataItem:NSItemProvider?{
    guard let data = csvData else {return nil}
    let item = NSItemProvider(item: data as NSSecureCoding, typeIdentifier: UTType.commaSeparatedText.identifier)
    item.suggestedName = "Test" + ".csv"

    return item
}

将 CSV 保存到临时文件并提供 URL:

private var fileURLItem:NSItemProvider?{
    let name = "Test" + Date().description

    let fileManager = FileManager.default
    guard let cacheDirectory = try? fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true),
    let data = csvData else {
        return nil
    }
    let fileLocation = cacheDirectory.appendingPathComponent("\(name).csv")
    try? data.write(to: fileLocation, options: .atomicWrite)

//  return NSItemProvider(item: fileLocation as NSSecureCoding, typeIdentifier: UTType.fileURL.identifier) // either way doesn't work
    return NSItemProvider(contentsOf: fileLocation)
    }

两者的结合,试图模仿“文件”应用程序提供给共享表的类型:

class Exporter:NSObject, NSItemProviderWriting{
    static var writableTypeIdentifiersForItemProvider: [String] = [UTType.commaSeparatedText.identifier, UTType.fileURL.identifier]
    
    func loadData(withTypeIdentifier typeIdentifier: String,
                  forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress?{
        
        switch typeIdentifier{
        case UTType.commaSeparatedText.identifier:
            completionHandler(sampleCSV.data(using: .utf8)!, nil)
        case UTType.fileURL.identifier:
            completionHandler(fileURL!.dataRepresentation, nil)
        default:
            completionHandler(nil, ExporterError.unknownUTI)
        }
        
        return nil
    }

第三种方式根本不起作用并导致

无法实例化类 NSURL。错误:错误域 = NSCocoaErrorDomain 代码 = 4864 “即使将 URL 视为字符串,也无法从“public.url”类型的表示中实例化 URL。” UserInfo={NSDebugDescription=即使将其视为字符串,也无法从“public.url”类型的表示中实例化 URL。NSUnderlyingError=0x6000018c20d0 {Error Domain=NSCocoaErrorDomain Code=4864 ““public.url 类型的 URL 存档” ” 包含无效数据。” UserInfo={NSDebugDescription=“public.url”类型的 URL 存档包含无效数据。}}}

打印到控制台。甚至无法通过 Google 搜索找到此错误。

4

0 回答 0