SnoozeLocalNotificationは擬似的にUILocalNotificationのローカル通知でスヌーズ対応するライブラリです。

UILocalNotificationを使った通知の設定について — ios-practice 0.1 documentationでも書かれていますが、iOSのローカル通知にはスヌーズ機能はありません。

そのため、ユーザーが止める(アプリを立ち上げる)まで何度も繰り返し通知を出すことで擬似的なスヌーズを作成出来ます。
(iOS8以降ならもっと別の手段があるかも)

SnoozeLocalNotification は通知を多重登録 + スヌーズの通知のみをキャンセル機能を持ったライブラリです。

インストール

CocoaPodsからインストールできます。


pod "SnoozeLocalNotification"

使い方

擬似的なスヌーズなので、アプリをユーザーが起動したらスヌーズを解除する必要があります。

この擬似スヌーズには主に2種類の通知があります。

  • メインとなる通知
  • メインとなる通知に紐づくスヌーズ通知

メインの通知からアプリが開かれたら、関連するスヌーズはいらないのでキャンセル。同様にメインの通知が既に通知済みの状態でアプリが起動したら関連するスヌーズはキャンセルするという処理が必要になります。

これらの処理を

AppDelegate

に 書きます。

cancelSnoozeForNotification

ではその通知に関係あるスヌーズ通知(userInfoのkeyを見ます)を解除します。


- (<span class="hljs-built_in" style="color: rgb(38, 139, 210);">BOOL</span>)application:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UIApplication</span> *) application didFinishLaunchingWithOptions:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSDictionary</span> *) launchOptions {
    <span class="hljs-built_in" style="color: rgb(38, 139, 210);">UILocalNotification</span> *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    [[SnoozeLocalNotificationCenter center] cancelSnoozeForNotification:localNotif]
    <span class="hljs-keyword" style="color: rgb(133, 153, 0);">return</span> <span class="hljs-literal">YES</span>;
}

- (<span class="hljs-keyword" style="color: rgb(133, 153, 0);">void</span>)applicationWillEnterForeground:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UIApplication</span> *) application {
    [[SnoozeLocalNotificationCenter center] cancelUnnecessarySnooze];
}

スヌーズ通知の登録はシンプルで、メインとなるUILocalNotificationとスヌーズ感覚を指定すれば、その分だけスヌーズ登録してくれます。


<span class="hljs-comment" style="color: rgb(147, 161, 161);">// Schedule 4 notification.</span>
<span class="hljs-comment" style="color: rgb(147, 161, 161);">// fireDate -&gt; 10min -&gt; 30min -&gt; 60min</span>
<span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSArray</span> *snoozeMinutes = @[@<span class="hljs-number" style="color: rgb(42, 161, 152);">10</span>, @<span class="hljs-number" style="color: rgb(42, 161, 152);">30</span>, @<span class="hljs-number" style="color: rgb(42, 161, 152);">60</span>];
<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UILocalNotification</span> *localNotification = [[<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UILocalNotification</span> alloc] init];
localNotification<span class="hljs-variable" style="color: rgb(181, 137, 0);">.fireDate</span> = [[<span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSDate</span> date] dateByAddingTimeInterval:<span class="hljs-number" style="color: rgb(42, 161, 152);">1000</span>];
localNotification<span class="hljs-variable" style="color: rgb(181, 137, 0);">.alertBody</span> = <span class="hljs-string" style="color: rgb(42, 161, 152);">@"message"</span>;
[[SnoozeLocalNotificationCenter center] schedule:localNotification snoozeMinutes:snoozeMinutes];

API

細かいAPIはヘッダを見るといいと思います。


<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(133, 153, 0);">@interface</span> <span class="hljs-title" style="color: rgb(38, 139, 210);color: rgb(181, 137, 0);">SnoozeLocalNotificationCenter</span> : <span class="hljs-title" style="color: rgb(38, 139, 210);color: rgb(181, 137, 0);">NSObject</span></span>
+ (instancetype)center;

<span class="hljs-comment" style="color: rgb(147, 161, 161);">// schedule notification and snooze</span>
- (<span class="hljs-keyword" style="color: rgb(133, 153, 0);">void</span>)schedule:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UILocalNotification</span> *) localNotification snoozeDateComponents:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSArray</span> *) dateComponentsList;
- (<span class="hljs-keyword" style="color: rgb(133, 153, 0);">void</span>)schedule:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UILocalNotification</span> *) snoozeLocalNotification snoozeMinutes:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSArray</span> *) snoozeMinutes;

<span class="hljs-comment" style="color: rgb(147, 161, 161);">// cancel all snooze notifications</span>
- (<span class="hljs-keyword" style="color: rgb(133, 153, 0);">void</span>)cancelAllSnooze;
<span class="hljs-comment" style="color: rgb(147, 161, 161);">// cancel unnecessary notifications.</span>
<span class="hljs-comment" style="color: rgb(147, 161, 161);">/* e.g) notificationA -&gt; snoozeX -&gt; snoozeY
 * Notify notificationA, then user launch app.
 * snoozeX and snoozeY are unnecessary notifications.
 */</span>
- (<span class="hljs-keyword" style="color: rgb(133, 153, 0);">void</span>)cancelUnnecessarySnooze;
<span class="hljs-comment" style="color: rgb(147, 161, 161);">// cancel notification and snooze</span>
- (<span class="hljs-keyword" style="color: rgb(133, 153, 0);">void</span>)cancelSnoozeForNotification:(<span class="hljs-built_in" style="color: rgb(38, 139, 210);">UILocalNotification</span> *) aNotification;
<span class="hljs-keyword" style="color: rgb(133, 153, 0);">@end</span>

SnoozeLocalNotification はスヌーズのために大量に通知を登録しますが、iOSではローカル通知に登録出来る数に上限があるのであまり数を多くすると溢れて無駄な通知登録処理をすることになるので注意して下さい。

Post Navigation