LoginSignup
1
3

More than 3 years have passed since last update.

Cordova の InAppBrowser の呼出先プログラムの結果を呼出元プログラムで取得してみた

Last updated at Posted at 2019-09-16

はじめに

Google Apps Script で作成したプログラムを、他のユーザに配付することができました。

Google Apps Scripit で書いたプログラムを配付できるようにしてみた - Qiita

このプログラムを、Cordova を利用して作ったアプリから呼出したいと思いました。

InAppBrowser でプログラムを呼出する

InAppBrowser を使えるようにする

PhoneGap/Cordova で InAppBrowser を使う - Qiita

呼出するプログラムを用意する

呼出されるプログラムは、HTML と JavaScript で書かれた、いわゆるウェブアプリです。

child.html
<html>
    <head>
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    </head>
    <body>
        <button id="ok"></button>
        <button id="ng"></button>
    </body>
    <script type="text/javascript" src="js/child.js"></script>
</html>
child.js
var result = "N/A";
document.querySelector('#ok').addEventListener('click', function(){ result = "OK"; });
document.querySelector('#ng').addEventListener('click', function(){ result = "NG"; });

InAppBrowser でプログラムを呼出する

呼出したい HTML ファイルを、InAppBrowser オブジェクトの open メソッドを使って開きます。

index.js
var win = cordova.InAppBrowser.open('./child.html', '_blank', 'location=yes');        

呼出先プログラムの結果を呼出元プログラムで取得する

呼出先プログラム(上記の child.js)の結果(例えば、変数 result の値)を、呼出元プログラム(上記の index.js)で取得するには、どうしたらいいでしょうか。

InAppBrowser オブジェクトのリファレンスを見ても、できそうなプロパティやメソッドは見つかりません。

呼出先プログラムを呼出元プログラムから操作する

かろうじて executeScript メソッドを使って、呼出先プログラムを呼出元プログラムから操作できそうです。

index.js
    win.executeScript({
        code: "(function(){ return result; })();"
    },
    function(values) {
        if (values) {
            result = values[0];
        }
    });

code に指定したプログラムに返値があれば、executeScript メソッドのコールバック関数で受取できるようです。

呼出先プログラムが終了するときに実行する

上記のコードを、呼出元プログラムが終了するときに、実行すればいいでしょうか。

index.js
win.addEventListener('exit', function() {
    // 上記のコード
});

残念ながら、これは上手く行きません。
exit イベントのタイミングでは、呼出先プログラムは既に破棄されているようです。実行しようとしたコードはエラーになっているようですが、executeScript メソッドはエラーにならないし、コールバック関数も実行されません。

呼出先プログラムの結果を呼出元プログラムで取得する

結局のところ、次のようにするしかないようです。

index.js
var result = null;
var loop = null;
win.addEventListener('loadstop', function() {    // 呼出先プログラムが開始したとき
    loop = setInterval(function() {
        win.executeScript({
            code: "(function(){ return result; })();"
        },
        function(values) {
            if (values) {
                result = values[0];
            }
        });
    }, 1000);    // 1 秒ごとに値を取得し続ける
});
win.addEventListener('exit', function() {    // 呼出先プログラムが終了したとき
    clearInterval(loop);    // 値の取得を停止する
    console.log(result);    // 最終的に取得できた値
});
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3