Help us understand the problem. What is going on with this article?

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

More than 5 years have 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をそのまま保持しています。
そのため復帰するたびに同じ処理を繰り返すことになるので、回避できるようにしておきましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away