Titanium

Titanium mobileアプリで起動時にURL Schemeを受け取る

More than 1 year has passed since last update.

Titanium mobile "early" Advent Calendar 2012-12日目

他のアプリとのやり取りに使われるURL Schemeですが、Titanium側からTi.Platform.openURLを使って開くことは多いと思います。
逆に他のアプリからURL Schemeを使ってTitanium mobileのアプリを開いた時に引数を受け取る方法を紹介します。

まずはおさらいとしてTitanium側から開く場合。

foo.js
// iOSのChromeブラウザでわんこそばのキーワード検索をYahooで調べる。    
var app = 'googlechrome://'
var url = 'search.yahoo.co.jp/search?p='
var keyword = 'わんこそば'

// パラメータを渡す必要がある場合はエンコードしておきましょう。
var scheme = encodeURI(app + url + keyword)

// Ti.Platform.openURLは開けなくてもエラーにならないので事前にcanOpenURLで確認しておく。
if (Ti.Platform.canOpenURL(scheme)) {
    Ti.Platform.openURL(scheme);
} else {
    alert('Chromeがインストールされてませんよ');
}

ポイントとしては単純にアプリを起動するときは気にすることもないのですが引数を渡す場合はencodeURI(str)をしておくほうが良いこと。
それと Ti.Platform.openURL(scheme)は起動に失敗してもエラーにならないので事前にTi.Platform.canOpenURL(scheme)で開くかどうか確かめておいたほうが良いです。

さて、本題の受け取る方ですが、

app.js
// 最後に受け取ったURL
var lastUrl = null

// 引数を処理する関数
var _parseArguments = function() {

    // アプリ起動時の引数の中から呼び出された際のURL schemeを取得
    var url = Ti.App.getArguments()['url'];

    // バックグラウンドから復帰した時に前回のURLがそのまま残っているので
    // 同じ処理を何度もしないようにurlとlastUrlを比較する
    if (url && lastUrl !== url) {
        lastUrl = url;

        // 受け取ったURLの処理の例
        // ここではyourappname://?action=post&title=Hello&body=Worldを受け取ったとして
        var array = url.replace('yourappname://?', '').split('&');

        // ['action=post', 'title=Hello', 'body=World']
        var params = {};
        for (var _i = 0, var _len = array.length; _i < _len; _i++) {
            var kv = array[_i].split('=')
            if (kv.length > 1) {
                params[kv[0]] = decodeURIComponent(kv.shift().join(''));
            }
        }
        //受け取ったparamsの処理
    }
};

// 起動時に実行
_parseArguments();

// バックグラウンドから復帰した時にも実行 
Ti.App.addEventListener('resumed', function() {
    _parseArguments();
});

URLはTi.App.getArguments()['url'];で簡単に受け取ることができます。
あとは受け取ったURLを解析して必要なデータを取り込むだけですが、受け取るときの状態が起動時もしくはバックグラウンドからの復帰の2パターンあるので注意が必要です。

とくにバックグラウンドからの復帰時は前回受け取ったURLをそのまま保持しています。
そのため復帰するたびに同じ処理を繰り返すことになるので、回避できるようにしておきましょう。