ローカル通知でテロリンって鳴らす（Swift）

#はじめに
Swiftでローカル通知を送ってみます。

単純にアプリがバックグラウンドに入ってから
一定時間経過したらローカル通知が鳴るサンプルを作成してみます。

今回は、とにかくテロリンって鳴らすのが目的です。

#まずは、通知タイプを設定して登録する
アプリ初回起動時に出てくる、通知を許可するか否かのアレを表示させます。
今回はOKを選択される前提で話を進めます。

<img width="285" alt="2016-07-20 0.49.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/44fe60d8-09df-0afc-656f-7701dca35afa.png">
**通知を許可するか否かのダイアログ**

これは、AppDelegateの
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
で実装しましょう。

```
// 通知の設定を登録する
let notificationSetting = UIUserNotificationSettings(forTypes:[.Alert,.Sound,.Badge], categories:nil)
application.registerUserNotificationSettings(notificationSetting)
```

`forTypes:[.Alert,.Sound,.Badge]`
この部分で通知のタイプを指定しています。

例えば、バッジは要らないという場合は
`forTypes:[.Alert,.Sound]`
となります。



#バッジのカウントをUserDefaultsで管理する
ローカル通知なので、バッジ有っても無くてもな〜と思いますが一応つけました。
UserDefaultsにバッジのカウントを保存しておきます。

```
let appIconBadgeNumberKey = "AppIconBadgeNumber"
// userDefaultsに100をセットする
userDefaults.setInteger(100, forKey: appIconBadgeNumberKey)

// userDefaultsに保存されている値をバッジに設定
application.applicationIconBadgeNumber = userDefaults.integerForKey(appIconBadgeNumberKey)
```

#実際に通知を登録する
今回は、バックグラウンドになる時に通知の予約をするサンプルなので
AppDelegateのfunc applicationDidEnterBackground(application: UIApplication)
の中に記述します。

```
func applicationDidEnterBackground(application: UIApplication) {
    let notification = UILocalNotification()
    
    // ロック中の「スライドで表示」の"表示"部分の文言を変更
    notification.alertAction = "アプリ起動" 

    // 通知の本文
    notification.alertBody = "テロリン" 

    // 通知される時間（本サンプルは5秒後に設定）
    notification.fireDate = NSDate(timeIntervalSinceNow:5) 

    // デフォルトの通知音を設定
    notification.soundName = UILocalNotificationDefaultSoundName
        
    // アインコンバッジの数字をセットする
    // UserDefaultsに保存されている値にプラス1して再度保存する。
    let iconBadgeNumber = userDefaults.integerForKey(appIconBadgeNumberKey) + 1
    userDefaults.setInteger(iconBadgeNumber, forKey: appIconBadgeNumberKey)
    notification.applicationIconBadgeNumber = iconBadgeNumber
        
    // 通知の情報
    notification.userInfo = ["title": "hoge", "body": "piyo"]

    // 設定した通知を登録
    application.scheduleLocalNotification(notification)
}
```

#userInfoの中身を覗いてみる
userInfoの中身を確認してみましょう。(自分でセットした情報しか無いけれど。。)

```
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    if let userInfo = notification.userInfo {
        print("\(userInfo)")
    }
}
```
通知登録時にuserInfoにセットした情報を取得することができます。
<img width="179" alt="2016-07-20 1.48.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/0e6d2e44-8c85-6d71-4289-5c3682cba852.png">




#登録されている通知を削除する
通知が重複しないよう既に呼ばれた通知は削除しなければなりません。

バックグラウンド若しくはフォアグラウンドでローカル通知を受け取ると、
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification)
が呼ばれます。

非起動時に通知からアプリを起動した場合は、
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Boolが呼ばれて、launchOptionsに通知の内容が入っています。

通知を削除するコードはこんな感じ。

```
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    // 通知を消す
    application.cancelLocalNotification(notification)

    // ついでにバッジを０にする
    userDefaults.setInteger(0, forKey: appIconBadgeNumberKey)
    application.applicationIconBadgeNumber = userDefaults.integerForKey(appIconBadgeNumberKey)
}
```

#動かしてみる
通知が届き、バッジのカウントもちゃんと増えました。
<img width="361" alt="2016-07-20 1.27.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/b039b30b-c28e-f240-5d75-b30f247c5cae.png">

<img width="97" alt="2016-07-20 1.25.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/a0341a72-8d07-90c7-a5c9-40fb5b25801a.png">