TitaniumでiOSのLocalNotification

iOSのLocalNotificationを利用すると指定した時刻にNotificationを出すことができる。
端末がスリープ状態の時やアプリが起動していない(サスペンドでもない)状況でもユーザーに通知を出すことが可能。

利用用途は目覚まし時計とかスケジュール管理ツールの時間通知など。

サンプルコード

起動してから3秒後に通知を出すサンプル。

app.js
var notification;

Ti.API.info("notification schduled");
notification = Ti.App.iOS.scheduleLocalNotification({
    date: new Date(new Date().getTime() + 3000),
	repeat: "daily"
    alertBody: "起動から3秒後",
    alertAction: "アプリを開く",
    badge: (new Date).getSeconds(),
    sound: "default",
    userInfo: { foo: "hoge" }
});

Ti.App.iOS.addEventListener("notification", function(e){
    Ti.API.info(e.userInfo.foo);
});

Ti.App.addEventListener("resume", function(){
    Ti.API.info("notification canceld");
    notification.cancel();
    // Ti.App.iOS.cancelAllLocalNotifications();
});

アプリがフォアグラウンドだと通知はでないので、動作を確認するには素早くアプリを閉じる必要がある。

通知からアプリを開いた場合はTi.App.iOSのnotificationイベントが発火してログにuserInfoの内容を表示。
またrepeatにdailyを指定しているので1日ほおっておくとまた通知が出る。

解説

通知の作成

Ti.App.iOS.scheduleLocalNotificationでLocalNotificationを設定できる。
APIドキュメントにはcreateLocalNotificationというメソッドもあるが、こちらは使えなくなっている模様。

オプションは以下の通り。

Ti.App.iOS.scheduleLocalNotificationのオプション
date 通知を出す時間。
repeat daily,weekly,monthly,yearlyが指定可能。
dateで指定した日時を基準に一定期間ごとに通知を繰り返すことができる。
alertBody 通知メッセージ。
alertAction 通知のアプリを開くボタンに表示されるメッセージ。
端末がスリープ状態の時はロック解除のスライダーに表示される。
alertLaunchImage 通知からアプリを起動したときのスプラッシュ画面を通常起動時とは別に設定できる。
badge 設定すると通知と同時にバッジの表示が更新される。
sound 通知の際のサウンドのファイル名を指定できる。
defaultを指定するとiOSデフォルトの通知音(UILocalNotificationDefaultSoundName)が鳴る。(要実機)
userInfo notificationイベントに渡す変数を定義できる。
通知の消去

notification.cancelでそのnotificationを取り消し。
Ti.App.iOS.cancelAllLocalNotificationsですべてのLocalNotificationを取り消しできる。

repeatを指定しているときは後始末をきちんとしておかないといらない通知が貯まってしまうので注意。
通知が貯まって不要な通知が二重三重に出てきたりするとイメージダウンも甚だしいので後始末には常に気を遣っておいた方が良さそう。

通知によるイベント

Ti.App.iOSのnotificationというイベントがあり、以下のタイミングで呼ばれる。

  • 通知からアプリを開いた場合
  • アプリがフォアグラウンドの時に通知の時間が来た場合

フォアグラウンドの場合通知がポップアップすることはないが、裏でイベントは発火するので注意。

以下の場合は呼ばれない。

  • 通知があっても通知からアプリを開かなかった場合

たとえば通知をいったんクローズして、その後アイコンからアプリを開いた場合は呼ばれない。

その他メモ

dateに過去日時を指定すると

すぐに通知が発生する。
ただしrepeatを指定していた場合は発生せず、その日時を基準としたrepeat間隔が経過した時点で通知が発生する。

repeatにhourly以下を指定する

Titaniumの生成するソースをいじる魔改造かモジュール作成で簡単に実現可能。
興味がある人はgrep weekly -r build/iphone/Classesとかしてみたら該当箇所が見つかるはず。

しかしなんでTitaniumはdailyまでしか対応してないんだろう。
なんかそういうガイドラインみたいなのあったっけ。

Ti.Appのpauseイベントでは通知を設定できない

サスペンド時ではなくレジューム時に設定されてしまう模様。ちょっと残念。

参考