はじめに
Google Apps Script で作成したプログラムを、他のユーザに配付することができました。
[Google Apps Scripit で書いたプログラムを配付できるようにしてみた - Qiita] (https://qiita.com/tinymouse/items/352aa8582b6c2ef1ddf0)
このプログラムを、Cordova を利用して作ったアプリから呼出したいと思いました。
InAppBrowser でプログラムを呼出する
InAppBrowser を使えるようにする
[PhoneGap/Cordova で InAppBrowser を使う - Qiita]
(https://qiita.com/tsunet111/items/5bad52c6344fc33c73a0)
呼出するプログラムを用意する
呼出されるプログラムは、HTML と JavaScript で書かれた、いわゆるウェブアプリです。
<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>
var result = "N/A";
document.querySelector('#ok').addEventListener('click', function(){ result = "OK"; });
document.querySelector('#ng').addEventListener('click', function(){ result = "NG"; });
InAppBrowser でプログラムを呼出する
呼出したい HTML ファイルを、InAppBrowser
オブジェクトの open
メソッドを使って開きます。
var win = cordova.InAppBrowser.open('./child.html', '_blank', 'location=yes');
呼出先プログラムの結果を呼出元プログラムで取得する
呼出先プログラム(上記の child.js
)の結果(例えば、変数 result
の値)を、呼出元プログラム(上記の index.js
)で取得するには、どうしたらいいでしょうか。
InAppBrowser
オブジェクトのリファレンスを見ても、できそうなプロパティやメソッドは見つかりません。
呼出先プログラムを呼出元プログラムから操作する
かろうじて executeScript
メソッドを使って、呼出先プログラムを呼出元プログラムから操作できそうです。
win.executeScript({
code: "(function(){ return result; })();"
},
function(values) {
if (values) {
result = values[0];
}
});
code
に指定したプログラムに返値があれば、executeScript
メソッドのコールバック関数で受取できるようです。
呼出先プログラムが終了するときに実行する
上記のコードを、呼出元プログラムが終了するときに、実行すればいいでしょうか。
win.addEventListener('exit', function() {
// 上記のコード
});
残念ながら、これは上手く行きません。
exit
イベントのタイミングでは、呼出先プログラムは既に破棄されているようです。実行しようとしたコードはエラーになっているようですが、executeScript
メソッドはエラーにならないし、コールバック関数も実行されません。
呼出先プログラムの結果を呼出元プログラムで取得する
結局のところ、次のようにするしかないようです。
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); // 最終的に取得できた値
});