0

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 検索でも見つかりません。

4

0 に答える 0