質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

iOS端末で、Cordovaのプラグインが使用できない。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,679

y_oota

score 14

Monaca(Cordova)を用いてアプリの開発をしているのですが、iOS端末にて下記コードを実行したところ、
以下のログが出力されます。
Androidでは正常に動作するのですが、どのようにすれば解決できますでしょうか?
よろしくお願いいたします。

出力ログ

deviceready has not fired after 5 seconds
Channel not fired: onCordovaReady
Channel not fired: onPluginReady

使用プラグイン

・File (zipの中身のファイルを端末に保存するために使用)

使用ライブラリ

・zip.js (zip解凍に使用)

バージョン

・Fileプラグイン:4.3.3
・cordova : 6.2.0

ソースコード

//index.js
var zipUrl = "http://example.com/target.zip": //zipがおかれている場所を示すurl
const ZIP_EXTRACTION_DIRECTORY = "zip/temp/"; //zipファイル展開先

//端末の準備が完了でき次第、zip解凍を行う。
ons.ready(function(){
    unzipAndExpansion(zipUrl, ZIP_EXTRACTION_DIRECTORY, function () {
        alert("zip解凍完了!");
    }
    , function () {
        //zipファイルの解凍に失敗した時の処理。
        alert("zipファイルの展開に失敗しました");
    });
});
//zipExpansion.js
/**
 * ZIPファイルをサーバーから取得し、展開します。
 * @param {string} url...ZIPファイルの格納先
 * @param {string} pathBase...ZIPファイルの展開先
 * @param {function} successCallback...成功時のコールバック関数(任意)
 * @param {function} faildCallback...失敗時のコールバック関数(任意)
 */
function unzipAndExpansion(url, pathBase, successCallback, faildCallback) {
    //ディレクトリ構成に応じて、適宜変更
    zip.workerScriptsPath = "lib/zip_js/";

    if (pathBase.slice(-1) != '/') {
        pathBase = pathBase + '/';
    }

    zip.createReader(new zip.HttpReader(url), function (reader) {
        reader.getEntries(function (entries) {
            console.log("go to sendEntry");
            sendEntry(entries, entries.length);
        });
    }, function (onerror) {
        // onerror callback
        console.log("zip get error.");
    });

    function sendEntry(entryArray, target) {
        if (target <= 0) {
            //すべてのファイルの作成が完了した。
            //コールバック関数(任意)を呼び出す
            if (successCallback != null) {
                successCallback();
            }
            return;
        }

        entryArray[target - 1].getData(new zip.BlobWriter(), function (text) {

            var fileName = entryArray[target - 1].filename;
            var fileContent = text;

            getDirectory(pathBase, function (directoryEntry) {
                //取得したファイル名からディレクトリ部分を切り取る
                var fileNameInDir = fileName.substring(0, fileName.lastIndexOf('/'));
                //取得したファイル名からファイル名部分を切り取る
                var pathinName = fileName.substring(fileName.lastIndexOf('/') + 1);
                //ファイル作成メソッド呼び出し
                createFile(pathBase + fileNameInDir + "/", pathinName, fileContent, function () {
                    var nextTarget = target - 1;
                    //ファイルの作成が完了し次第、次のファイルを作成する。
                    sendEntry(entryArray, nextTarget);
                });

            }, function (error) {
                console.log("get directory error");
                if (faildCallback != null) {
                    faildCallback();
                }
            });
        });
    }
}

/**
 * ファイルを新規作成・上書きします。
 * @param {string} savePath
 * @param {string} fileName
 * @param {string} content.
 */
function createFile(saveDirectoryPath, fileName, content, successCallback) {
    console.log("request file system....(createFile method)");
    requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
        console.log("get file system....(createFile method)");
        //保存場所のディレクトリを作成する
        getDirectory(saveDirectoryPath, function (directoryEntry) {
            //ディレクトリが完成し次第、ファイルの作成を行う。
            directoryEntry.getFile(fileName, { create: true }, function (fileEntry) {
                fileWriter = fileEntry.createWriter(function (fileWriter) {

                    //ファイル書き込み
                    fileWriter.write(content);
                    //ファイルの作成に成功した時のコールバック関数を呼び出す。
                    console.log("file write success : " + fileName);
                    successCallback();
                }, function (error) {
                    console.log("file write error");
                });
            });
        });
    }
    , function (error) {
        //ファイル作成エラー
        console.log("create file error");
    });
}

function string_to_buffer(src) {
    return (new Uint16Array([].map.call(src, function (c) {
        return c.charCodeAt(0)
    }))).buffer;
}


/**
 * ディレクトリを取得または新規作成します。
 * 成功時のコールバック関数の引数には directoryEntry が入ります。
 * @param {string} createDirectoryPath…作成するディレクトリのパス
 * @param {function} successCallback…作成成功時のコールバック関数
 */
function getDirectory(createDirectoryPath, successCallback) {
    console.log("request file system....(getDirectory method)");

    //※iOS端末では、ここのrequestFileSystemメソッドのコールバック関数が実行されていない、、、。
    requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
        console.log("get file system....(createFile method)");

        fileSystem.root.getDirectory(createDirectoryPath, { create: true }, function (directoryEntry) {
            //この時点で成功した場合は成功時のコールバック関数を呼び出す
            successCallback(directoryEntry);
        }, function (error) {
            //失敗した場合はディレクトリ作成を行う
            var directoryAry = createDirectoryPath.split('/');
            _creteDirectoryInner(directoryAry, -1, 0, successCallback);
        })
    }, function(error) {
        console.log("request file system error.(get directory method)");
    });

    function _creteDirectoryInner(dirAry, parentIndex, childIndex, successCallback) {

        if (dirAry.length <= childIndex) {
            //ディレクトリの作成が正常に終了。ファイル作成のためのdirectoryEntryを取得し、コールバック関数を呼び出す。
            requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {

                //directoryEntryの対象のディレクトリのパスを作成。
                var createdDirectory = "";
                for (var i = 0; i < dirAry.length; i++) {

                    if (i > 0) {
                        createdDirectory += "/";

                    }
                    createdDirectory += dirAry[i];
                }

                fileSystem.root.getDirectory(createdDirectory, { create: false }, function (directoryEntry) {
                    //directoryEntryが取得でき次第、コールバック関数を呼び出す。
                    successCallback(directoryEntry);
                });
            });
            return;
        }

        requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
            //new directory path
            var newDirectory = "";
            if (parentIndex == -1) {
                newDirectory = dirAry[childIndex];
            } else {
                for (var i = 0; i <= childIndex; i++) {
                    newDirectory += dirAry[i];
                    if (i != childIndex) {
                        newDirectory += "/";
                    }
                }
            }

            fileSystem.root.getDirectory(newDirectory, { create: true }, function (directoryEntry) {
                //next dir
                parentIndex++;
                childIndex++;
                _creteDirectoryInner(dirAry, parentIndex, childIndex, successCallback);
            }, function (error) {
                //ディレクトリ作成エラー
                console.log("create directory error");
            });
        }, function (error) {
            //ファイルシステムアクセスエラー
            console.log("file system access error");
        });
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

MonacaLocakkitにてFileプラグインのバージョンを変更したところ、期待通りの動作となりました。
どうやら、Monacaデバッガーで使用しているFileプラグインのバージョンが悪く、iOSでは動作しないようです。(2017/06/09時点)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る