【Swift】ローカル通知の基本的な使い方を学んでみた

swift

最近になったふたたびXcodeに触れる機会ができました。ちょっとしたアプリを作る際に通知機能を付けたくて、でもサーバーがまだ無いのでローカル通知を実装することにしました。

単純なアラームくらいだったら結構簡単に作れちゃうんですね。使い方をまとめてみました。

ローカル通知

iOSには通知の方法が2種類あって、1つはリモート通知と呼ばれるサーバー側から各端末に情報をプッシュする方式。LINEみたいにメッセージが飛んできたら画面に表示されたりします。

もう1つがローカル通知で、こっちはアプリからiOSの画面に情報を表示できるようになる方法で、サーバーも要らずプログラムだけで実現できます。カレンダーを作って予定のある日を教えてくれるようなアプリなどに使えそうです。

今回はサーバーが無いのでローカル通知をやってみることにしました。

 

ローカル通知の使い方

プロジェクトの作成

まずは新しいプロジェクトを作成します。テンプレートは「Single View App」を選択してください。LanguageをSwiftにして「Use Core Data」のチェックは不要です。

 

AppDelegateへの初期設定

先にローカル通知を使うための設定をAppDelegateの中に書いてしまいます。最初にUserNotificationsをインポートします。

 

次に通知機能を使いますよ、という許可のダイアログを表示する部分をdidFinishLaunchingWithOptionsに追加します。もちろん許可しないと通知も出ません。次のコードを書くまではエラーが表示されますが、そのままで大丈夫です。

 

最後は通知を受け取ったときの処理をAppDelegateクラスの後ろにExtensionとして足してあげます。AppDelegateクラスのカッコが閉じた後に追加するので気をつけてくださいね。これだけでアプリが起動中でも、他のアプリを使っている最中でも通知が飛んでくるようになります。便利。

 

画面側の作成(事前準備)

通知機能を使うための下準備が終わったので、今度はViewControllerに画面側の処理を書いていきます。通知を使うのでこちらもUserNotificationsをインポートします。

 

これ通知には必要ないのですが、日時を表示するときのために入れときます。viewDidLoadの上あたりに1行宣言を足して、viewDidLoadの中で日付のフォーマットを設定しておきます。

 

次に処理を実行するボタンを作成していきます。ストーリーボード上で作る説明が面倒なのでviewDidLoad内でコードで描きます。上の日付フォーマット設定の下あたりに貼り付ければオッケーです。もちろんストーリーボード上にボタンを4つ置いてアクション接続しても良いですよ。上から日時指定通知、タイマー通知、そして実行待ちの通知を取得するボタン、実行済の通知を取得するボタンになります。まだボタンを押したときに呼ばれる関数を作っていないのでエラーが表示されますが、これから作っていくのでお気になさらずに。

 

 

日時指定通知

では日時指定通知のボタンの処理を作っていきます。簡単に表示内容と時間をセットして登録するだけです。identifierの部分は何でも良いのですが、ここではユニークなIDを発行しています。このIDで通知をキャンセルしたり上書きしたりといった制御ができます。

日付をデータコンポーネントに変換して設定するので、その前にボタンを押した時間から5分後を計算しています。

 

 

タイマー通知

今度はタイマー通知を作成する処理を書いていきます。ボタンを押した10秒後に通知が表示されるようにします。日付の代わりにタイマーをセットするだけでやっていることは日時指定と同じです。

 

実行待ち通知一覧

処理としてはこれで完成ですが、登録内容を確認するためのボタンも作ったのでその中身も作っていきます。まずは実行待ち通知一覧から。タイマーと時間指定で取得方法がちょっと違いますね。

 

実行済み通知一覧

こちらは実行が終わった通知の一覧です。取ってくる元が違いますが、やってることはほぼ同じです。

 

これで日時指定通知とタイマー通知が使えるようになりました!意外と簡単ですが、アプリとは同期せずに不意にやって来る感じなので、ちょっと注意が必要ですね。

サンプルはこちらにあります。

 

おわりに

通知にはもう1つ位置情報というのもあるのですが、それはGPSの設定もあるので別の機会にやってみようと思います。