TitaniumでiOSのバックグラウンド処理

10分間だけ待ってやる!ってiOSさんにバックグラウンド処理の時間をもらえます。

app.js
var service = Ti.App.iOS.registerBackgroundService({
    url: 'badge.js', 
    foo: "hoge",
    bar: "fuga"
});

Ti.App.addEventListener("resume", function(){
    service.stop();
    // service.unregister();でもよい
});

アプリを閉じると(バックグラウンドになると)Ti.App.iOS.registerBackgroundServiceにurlで指定したスクリプトが実行される。
url以外にプロパティを指定するとスクリプトに変数として渡せる。

バックグラウンドになるまでバックグラウンド処理は動き出さないので注意。

またバックグラウンド処理はバックグラウンドになるたびに実行される。
必要がなくなったらstopもしくはunregisterしておくと再度実行されることはない。

実際はTi.AppのpauseイベントでregisterBackgroundServiceするケースが多いかも。

badge.js
Ti.API.info(Ti.App.currentService.foo);
var s = setInterval(function(){
        var number = (new Date).getSeconds();
        Ti.UI.iPhone.appBadge = number;
        Ti.API.info(Ti.App.currentService.bar);
        Ti.API.info(number);

        if (number == 59) {
            clearInterval(s);
            Ti.App.currentService.stop();
        }
}, 1000);

アプリのバッジがピコンピコンと毎秒更新されて59になったところでストップする。

Ti.App.currentServiceで実行中の処理にアクセスできる。
それを使ってregisterBackgroundServiceを呼び出したときに渡した変数を呼び出せる。

処理を停止させたい場合はstopする。
バックグラウンド処理の最中にunregisterを呼び出しても処理は停止しない。再度実行されることはなくなる。
stopした場合は停止と同時にunregisterもされる。

バックグラウンド処理の中でsetIntervalしたらclearIntervalしておかないと、フォアグラウンドになったときにも繰り返し処理が再開されるので注意。
バグかと思ったが、よく考えるとバックグラウンド処理のスレッドとは非同期で動き出すためか。

getMinutesにするとバックグラウンド処理の有効時間が10分間であることがわかりやすく確認できる。(iOSのバックグラウンド処理の仕様)

参考