jarinosuke blog

about software engineering, mostly about iOS

JRNLocalNotificationCenter をつくりました

f:id:jarinosuke0808:20130728174126p:plain

初OSS

週末にほぼ丸一日使って、初めて世に OSS というものを公開してみました。 JRNLocalNotificationCenter という iOS の Library で、 UILocalNotification を簡単に投稿しハンドリングするためのものです。 これを使うことでローカルプッシュを飛ばしたり、プッシュ通通知からのアプリ内ハンドリングやキャンセルが簡単にできるようになります。

この記事では JRNLocalNotificationCenter の簡単な使い方と、リリースまでにしたことなどを書きます。

使い方

  • 投稿

UILocalNotification を投稿するのは以下のコードを書くだけです。 投稿する時に key を指定することで、アプリのプロセスが死んでしまった場合でもキャンセルが可能になります。

[[JRNLocalNotificationCenter defaultCenter] postNotificationOn:[NSDate dateWithTimeIntervalSinceNow:30.0]
                                                            forKey:@"test"
                                                         alertBody:@"This is JRNLocalNotificationCenter sample"
                                                       alertAction:@"Open"
                                                         soundName:nil
                                                       launchImage:nil
                                                          userInfo:@{@"time": @"12"}
                                                        badgeCount:[[UIApplication sharedApplication] applicationIconBadgeNumber] + 1];
  • キャンセル

標準ではスケジューリングされた UILocalNotification をキャンセルするには、以下のようにUILocalNotification オブジェクトが必要になります。

[[UIApplication sharedApplication] cancelLocalNotification:localNotification];

しかしアプリケーション状態が変更されたりすると、その UILocalNotification オブジェクトを識別することが出来ない場合キャンセルができなくなってしまいます。 JRNLocalNotificationCenter ではそれを解決するために、投稿時に key をセットすることでアプリケーション状態が変更されたとしても key で UILocalNotification オブジェクトをキャッシュしています。 なので以下のようなコードで簡単にキャンセルすることが出来ます。

[[JRNLocalNotificationCenter defaultCenter] cancelLocalNotificationForKey:@"test"];
  • ハンドリング

プッシュ通知では userInfo を用いて、プッシュ通知での起動時のアプリケーションの振る舞いをハンドリングすることが良く行われます。 JRNLocalNotificationCenter では UILocalNotification の userInfo に投稿時に指定した key を埋め込みます。なので起動時のハンドリングもそれを用いて行うことが可能になります。 ハンドリング内容に関してはアプリケーションの起動時に JRNLocalNotificationCenter に Blocks で渡すことで指定できます。 最後に didReceiveLocalNotification で受け取る userInfo や launchOptions の UIApplicationLaunchOptionsLocalNotificationKey を JRNLocalNotificationCenter に渡してあげればハンドリングの準備は完了です。

###application:didFinishLaunchingWithOptions:
[[JRNLocalNotificationCenter defaultCenter] setLocalNotificationHandler:^(NSString *key, NSDictionary *userInfo) {
        if ( [key isEqualToString:@"test"] ) {
            //handling code for "test"
        }
    }];

###application:didReceiveLocalNotification:
[[JRNLocalNotificationCenter defaultCenter] didReceiveLocalNotificationUserInfo:notification.userInfo];

CocoaPods

JRNLocalNotificationCenter は CocoaPods に登録しました。 JRNLocalNotificationCenter Reference

公式ページに登録までの方法が載っていますが、簡単に日本語で以下に手順を示します。 pod spec create <YOUR_LIBRARY_NAME>

  • 1.podspec ファイルの作成
pod spec create <YOUR_LIBRARY_NAME>

作成された <YOUR_LIBRARY_NAME>.podspec ファイルに各種内容を加えます。

  • 2.作成した podspec ファイルの検証
 pod spec lint <YOUR_LIBRARY_NAME>.podspec

作成した podspec ファイルに問題が無いかを確認します。無事 pass すれば OK です。

Specs/<YOUR_LIBRARY_NAME>/<VERSION>/

Travis CI

Build Status

また OSS として公開するにあたって、テストも書いた方が良いだろうと思いテストをいくつか書きました。(Notification のテストなのにアプリケーションテストがまだ書けていません…) 自動テストも取り入れたいと思っていたので、ishkawa さんの Travis CI に関するブログを参考にさせて頂きました。とても簡単に出来ました。

ライブラリつくるの楽しい

今までアプリ内で閉じたそこそこ便利なユーティリティクラスだったりは作ってきたのですが、アプリ関係なく使えるライブラリというのは作ってきませんでした。 しかし今回作ってみてると README から始まり、テストやクラス設計などの不特定多数に使ってもらうための工夫があり、普通にアプリを作っているだけでは気付けないことがたくさんあり勉強になりました。 JRN という prefix を付けたので、今後も不定期に週末にライブラリを作って少しでも iOS 開発に貢献していければなと思います。