6月
8

iOSのローカル通知・UILocalNotificationの設定まとめ

Written by takashings posted on 6月 8, 2014 in Objective-C

objectivec-uilocalnotification-setting-01

@takashingsです。
普段の仕事はiPhoneのアプリを開発しています。

今回、仕事でローカル通知の機能を使ったアプリを作りました。
そのまとめを残しておきたいと思います。

これさえ読めば、基本的にはローカル通知の設定はバッチリだと思います。

まず、プッシュ通知とローカル通知の違いを把握しておく

iOSにはプッシュ通知ローカル通知の2つの通知があります。

プッシュ通知は外部のサーバから届く通知です。そのため、通知を受け取るためには通信ができることが大前提です。
例としては、TwitterのメンションやDMが届いた場合の通知のようなものです。
ローカル通知は外部との通信ができなくても、通知することができます。
例としては、カレンダー、リマインダーアプリのように決まった時間になると知らせてくれる通知のようなものです。

今回はローカル通知の設定です。

詳しくはApple公式のプログラミングガイドをご覧下さい。

LocalおよびPush Notificationプログラミングガイド

ローカル通知は「UILocalNotification」を使う

さて、早速ローカル通知の設定について。

まずは通知の登録から。
例として、5分後に通知を出すように登録します。

// インスタンス生成
UILocalNotification *notification = [[UILocalNotification alloc] init];
// 5分後に通知をする(設定は秒単位)
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:(60 * 5)];
// タイムゾーンの設定
notification.timeZone = [NSTimeZone defaultTimeZone];
// 通知時に表示させるメッセージ内容
notification.alertBody = @"5分経ちました";
// 通知に鳴る音の設定
notification.soundName = UILocalNotificationDefaultSoundName;

// 通知の登録
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

通知の削除をしてみる

次に登録した通知の削除してみます。

なお、登録した通知を編集することはできません。
内容を変更したい場合は、登録している通知を削除して、新しい通知内容を登録します。

// ピンポイントで通知を削除する
// アプリに登録されている通知を洗い出し
for(UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
		// 通知に登録されているキーで検索
        if([[notification.userInfo objectForKey:@"id"] integerValue] == id) {
			// キーが一致したら、対象の通知を削除
            [[UIApplication sharedApplication] cancelLocalNotification:notification];
        }
}

// アプリに登録されている全ての通知を削除
[[UIApplication sharedApplication] cancelAllLocalNotifications];

カレンダーアプリのように、予定の30分前に通知するなど通知する内容が多岐に渡る場合は通知に固有のキーを持たせておいて、削除する時には登録しておいたキーで検索して削除します。

ほとんどの場合、通知の種類は1つぐらいだと思うので、下の方法で削除することでいいと思います。

通知からアプリを起動した時の処理

通知からアプリを起動する時には大きく分けて3つのパターンがあります。

  • アプリ起動中(フォアグラウンド)に通知が届いた場合
  • アプリがバックグラウンドにある状態で通知が届いた場合
  • アプリのプロセスが終了した状態で通知が届いた場合

アプリ起動中(フォアグラウンド)に通知が届いた場合アプリがバックグラウンドにある状態で通知が届いた場合
AppDelegate内のapplication:didReceiveLocalNotificationで設定します。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
	// アプリ起動中(フォアグラウンド)に通知が届いた場合
    if(application.applicationState == UIApplicationStateActive) {
		// ここに処理を書く
    }

	// アプリがバックグラウンドにある状態で通知が届いた場合
	if(application.applicationState == UIApplicationStateInactive) {
		// ここに処理を書く
	}

	// 通知領域から削除する
	[[UIApplication sharedApplication] cancelLocalNotification:notification];
}

注意する点としては、アプリが起動中の時には画面上には通知表示はされません。つまり、アプリ起動中は通知が届いたかどうかがわからないということです。
そのためにアプリ起動中に通知が届いた場合は上記の部分でUIAlertViewなどでアラートを出したりして、通知が届いたことをユーザーに知らせましょう。

そして、アプリのプロセスが終了した状態で通知が届いた場合は同じくAppDelegate内の
application:didFinishLaunchingWithOptionsで内に処理を実装します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
	// UIApplicationLaunchOptionsLocalNotificationKeyをキーにして、情報を取り出す
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

	// nilでなければ、通知の情報が格納されている
    if(notification != nil) {
		// ここに処理を書く

		// 通知領域から消す
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
    }
	
    return YES;
}

UILocalNotificationクラスのプロパティ

プロパティの数は少ないので、紹介したいと思います。

通知時間の設定:fireDate

通知する時間の設定です。
通知する時間が今の時間よりも前の場合はすぐに通知されるようになります。

@property(nonatomic,copy) NSDate *fireDate;

タイムゾーンの設定:timeZone

通知時間のタイムゾーンの設定。
特に指定がない場合は「[NSTimeZone defaultTimeZone]」でいいかと思います。

@property(nonatomic,copy) NSTimeZone *timeZone;

繰り返し周期の設定:repeatInterval

repeatIntervalは通知の繰り返しの周期設定です。
例えば、毎日この時間に通知をしたい。毎週の○曜日に必ず通知をしたい、という時に設定します。
デフォルトは0(繰り返し設定はなし)になっています。

@property(nonatomic) NSCalendarUnit repeatInterval;

繰り返し設定のために参照するカレンダーの設定:repeatCalendar

繰り返し設定のために参照するカレンダーの設定を行うことができます。

@property(nonatomic,copy) NSCalendar *repeatCalendar;

通知に表示する本文:alertBody

通知に表示する本文は「alertBody」で設定します。
デフォルトはnilになっています。ほとんどのアプリは本文が入っているので、ここで設定しましょう。

本文は直接NSStringで指定もできますし、NSLocalizedStringでローカライズでの表記をすることもできます。

@property(nonatomic,copy) NSString *alertBody;

通知からアプリを起動するかしないか:hasAction

通知をタップした場合にアプリを起動するかしないかの設定をすることもできます。
デフォルトはYES(アプリを起動する)になっています。

NOにする場合は「alertBody」がnilでない必要があります。

@property(nonatomic) BOOL hasAction;

通知された時のボタン、スライダーに表示させる文字:alertAction

通知が届いた場合にボタン表示にしている場合や、ロック画面に表示させる文字を指定することができます。

iOS6ではこの部分ですね。

Objectivec uilocalnotification setting 02

iOS7ではロック画面では「スライドでロック解除」で文言統一しているので、この文言が表示されるのは通知の設定をダイアログ表示にしているときだけになります。

もちろん、この部分もNSStringで指定もできますし、ローカライズで多言語対応もできます。
細かいところにこだわりたいという人はここを設定しておくといいと思います。

@property(nonatomic,copy) NSString *alertAction;

通知から起動した時に表示される画像:alertLaunchImage

通知からアプリを起動した時に表示される画像のファイル名を設定します。

画像はアプリに格納されている画像を指定する必要があります。
デフォルトではシステムが最後に取得したスナップショットか、Info.plistのUILaunchImageFileキーで指定された画像、もしくはDefault.pngが使用されます。

@property(nonatomic,copy) NSString *alertLaunchImage;

通知時のサウンド:soundName

通知時に鳴るサウンドの指定ができます。

指定はアプリ内に格納されているサウンドファイル名を指定します。

デフォルトはnil(通知なし)となっているので、
特に指定がない場合は「UILocalNotificationDefaultSoundName」を指定しましょう。

ただし、30秒を超える音は鳴らすことができません。
30秒を超える音が指定された場合はその音は鳴らずに、デフォルトのシステム音が鳴ります。

@property(nonatomic,copy) NSString *soundName;

アプリに表示させるバッヂの値:soundName

通知と一緒にアイコンの右上に表示させるバッヂの設定です。
デフォルトは0(表示させない)となっています。

バッヂを消す時には0を指定することで消すことができます。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

@property(nonatomic) NSInteger applicationIconBadgeNumber;

通知の付加される情報:userInfo

通知に付加情報を付けることができます。
前述した特定の通知を消す場合にはuserInfoにキーとなるものを指定しておきます。

例えば、このように指定しておきます。

notification.userInfo = [NSDictionary dictionaryWithObject:@"1" forKey:@"NOTIFICATION_ID"];

複数の通知内容、設定がある場合にはここで指定をしておきます。

@property(nonatomic,copy) NSDictionary *userInfo;

ローカル通知を有効に使うことでより便利なアプリになりますし、
ユーザーにアプリを起動してもらうきっかけにもなります。

iOSのバージョンに左右されないものだと思いますので、覚えておくとずっと使えると思います。



この記事をシェアする

  • このエントリーをはてなブックマークに追加