URLからファイルの中身を取得する

はじめに

当たり前すぎてあまり記事になってなかったのでまとめます。Custom UTIからの共有でアプリに飛んできたurlをどうすれば良いか分からず結構悩みました。

私が初めに思いついたのはURLSessionで取得する方法でしたがURLSessionはhttpやhttpsではないURLに対してアクセスすることができませんでした。

URLから中身を取得するコード

Data型とString型のinitializerにurlを引数にするものがあったので以下の様にURLの中身を取得できます。

     do {
            let fileData = try Data(contentsOf: url)
            let strData = try String(contentsOf: url)
        } catch {
            print("Conversion failure")
        }

やりたかったこと

個人的にやりたかったことはURLからデータを取得してDocumentフォルダに保存することです。以下のコードで保存することができました。

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
        let documentPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        removeDocumentFiles(path: NSHomeDirectory() + "/Documents")

        let fileName = url.absoluteString.split(separator: "/").last!
        let filePath = documentPath.appendingPathComponent(String(fileName))

        do {
            let fileData = try Data(contentsOf: url)
            try fileData.write(to: filePath)
            print("success")
        } catch {
            print("Conversion failure")
        }
        return true
    }

private func removeDocumentFiles(path: String) {
        guard let fileNames = try? FileManager.default.contentsOfDirectory(atPath: path) else {
            return
        }
        for name in fileNames {
            do {
                try FileManager.default.removeItem(atPath: path + "/\(name)")
            } catch {
                Logger.error("file delition failure", error: error)
            }
        }
    }

参考文献

[iOS] Info.plistにカスタムUTIを追加し、iOSがデフォルトで認識できないタイプのファイルを受け取れるようにする