Code Lab

CakePHP/Python/Swiftを勉強中... 好きなことで生きて行く!

【Cordova/Phonegap】Canvasで表示しているものを保存する iOS/Android

teratail.com

Cordovaでアプリを開発している時に、Canvasで画像を保存する必要が出てきました。
そこで、「Canvas2ImagePlugin」というプラグインを使おうということになったのです。

ただ、問題が発生。
Androidでは保存先のパスが取得できるのですが、iOSが取得できない!
保存できたかどうかだけしか取得できませんでした。


こうなったら、プラグイン改造してやんよとプラグインのファイルを見たらびっくり。
objective-c なんですね...
わからないですね....
試しに他のプラグインものぞいて見たら....- (viod)....おまえもか

僕はSwiftの登場の時にiOSの開発を始めたので「objective-c」は本当にわからない。
一応、プラグインを直さなきゃって思っていろいろいじってたんですけど、解読できませんでした。
ちょっとだけわかった気にはなりましたが...。

仕方がないので、teratailで質問をしました....が回答なし。
teratail.com

プラグインのプルリクにも同じようなことを書いている人がいて、直したからプルしておくれよ的なこと書いてたと思うんですけど
今、それも動かないんですねぇ....


仕方がないので、Swiftで書いてみることにしました。
もしかしたら、間違えてたりしてるかもしれませんが。
ここにメモしておきます。

func saveFile(_ command: CDVInvokedUrlCommand) {

        // base64から画像を生成 -> Pathを返す

        let callbackId = command.callbackId // コールバックするときのためにとっておきます

        let imageString: String = String(describing: command.arguments[0]) // Base64の画像を取得(file://は消してあります)
        let decodeBase64:NSData? = NSData(base64Encoded:imageString, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) // Base64をデコードします

        // 保存先のパス生成
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String // ドキュメントのパス
        let uuid = NSUUID().uuidString as NSString // 画像の名前がかぶることがあったので、UUIDで回避させています。
        let filePath = docDir + (uuid as String) + ".png" // 保存場所 このパスがが欲しかった!帰ってきて欲しかった!

        do {
            // 保存処理
            try decodeBase64?.write(toFile: filePath, atomically: true) // ここで、画像を指定した場所に保存します

            // 成功したときのコールバック しっかりと「filePath」を返します
            self.commandDelegate!.send(
                CDVPluginResult(
                    status: CDVCommandStatus_OK,
                    messageAs: filePath),
                callbackId: callbackId
            )

        } catch {
            // 失敗したときのコールバック
            self.commandDelegate!.send(
                CDVPluginResult(
                    status: CDVCommandStatus_ERROR,
                    messageAs: "エラー:ファイルの保存に失敗しました"),
                callbackId: callbackId
            )
        }
    }

これで、しっかりとBase64を保存しつつfileのパスもゲットできます。
teratailで適当にプラグイン作ったので解決しましたって回答したからマイナス評価つけられてしまいました...
申し訳ないことしちゃったなぁ...


ということで、これで解決しました。
これではだめだという部分がありましたら教えてください!!