我尝试通过 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 搜索找到此错误。