iOS 共有シート経由で CSV データを使用しようとしています。私の問題: 共有シートには、インポート用のアプリ「Apple Numbers」または「Microsoft Excel」がありません。最初に共有シートで「ファイルに保存」を使用し、後でこの保存したファイルをファイル アプリで共有すると、Excel と Numbers が対象として表示され、データが受け入れられます。
データを提供するためにすでにさまざまな方法を試しましたが、Numbers と Excel を共有シートのターゲットとして表示することはできませんでした。
これをどのように達成できるか考えていますか?
データを提供しようとした 3 つの方法を以下に示します。
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
}
3 番目の方法はまったく機能せず、結果として
クラス NSURL をインスタンス化できませんでした。エラー: エラー ドメイン = NSCocoaErrorDomain コード = 4864 「URL を文字列として処理した後でも、型「public.url」の表現から URL をインスタンス化できません。」UserInfo={NSDebugDescription=文字列として処理した後でも、タイプ「public.url」の表現から URL をインスタンス化することはできません。 「無効なデータが含まれています。」UserInfo={NSDebugDescription=「public.url」タイプの URL アーカイブに無効なデータが含まれています。}}}
コンソールに出力されます。このエラーは、Google 検索でも見つかりません。