[Swift4]通知の出し方


バックグラウンドで通知をするためのコードを自分の言葉でまとめておきます。(Swift4)

##1.インポート

`import UserNotifications`
UserNotificationsをインポートする

##2.通知許可ダイアログを表示する

```swift:test
        // 通知許可ダイアログを表示
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            // エラー処理
        }
```

通知ダイアログを出したいところに記入する。なんのために通知を許可するのか事前に何らかの形で示しておくと、ユーザーが条件反射で通知オフにすることを防ぐことができていい。
とりあえず最初のうちはViewDidLoadに入れておけば問題ないかな。

##3.通知の内容を設定する
```Swift:test
        // 通知内容の設定
        let content = UNMutableNotificationContent()
        // 通知のタイトルを設定
        content.title = NSString.localizedUserNotificationString(forKey: "Title", arguments: nil)
        // 通知の本文を設定
        content.body = NSString.localizedUserNotificationString(forKey: "Message", arguments: nil)
        // 通知の音楽を設定
        content.sound = UNNotificationSound.default()

        //※用意した音楽を使う場合はこんな感じ
        // content.sound = UNNotificationSound(named:"xxxx.mp3")
```
UNMutableNotificationContentのプロパティを使用して通知の内容を設定する。
コピーして適当に変えればいい感じになる。

##4.トリガーを設定する
###4-1.日時指定でトリガーを作成する場合
```Swift:test
        //20時15分30秒に通知する場合
        formatter.dateFormat = 20
        fireDate.hour = 20
        fireDate.minute = 15
        fireDate.second = 30
        let trigger = UNCalendarNotificationTrigger(dateMatching: fireDate, repeats: false)
```

なお、現在時刻を取得したい場合は以下を利用する。

```Swift:test
        let formatter = DateFormatter()
        formatter.dateFormat = "HH"
        fireDate.hour = Int(formatter.string(from: Date()))!
        formatter.dateFormat = "mm"
        fireDate.minute = Int(formatter.string(from: Date()))!
        formatter.dateFormat = "ss"
        fireDate.second = Int(formatter.string(from: Date()))!
```

現在時間から5時間後などのようにしたい際は、上記該当の箇所を以下のように書き換えることで簡単に書くことができる。
`fireDate.hour = Int(formatter.string(from: Date()))! + 5`



###4-2.経過時間でトリガーを作成する場合
```Swift:test
        //5秒後に通知する場合
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: true)
```

##5.通知のリクエストを設定
通知登録用に、以下のようにリクエストを設定する。
identifierは現状使い道がわかっていないが、適当に記載しとけば良い。

```Swift:test
let request = UNNotificationRequest(identifier: "Identifier", content: content, trigger: trigger)
```

##6.通知を登録
通知するものをこうやって登録することができるみたい。

```Swift:test
        // 通知を登録
        center.add(request) { (error : Error?) in
            if error != nil {
                // エラー処理
            }
        }
```

##7.完成したソース
完成したソースがこちら

```Swift:test
import UIKit
import UserNotifications
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        // 通知許可ダイアログを表示
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            // エラー処理
        }
        
        // 通知内容の設定
        let content = UNMutableNotificationContent()
        
        content.title = NSString.localizedUserNotificationString(forKey: "Title", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "Message", arguments: nil)
        content.sound = UNNotificationSound.default()
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        
        let request = UNNotificationRequest(identifier: " Identifier", content: content, trigger: trigger)
        
        // 通知を登録
        center.add(request) { (error : Error?) in
            if error != nil {
                // エラー処理
            }
        }
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


```

説明不足が隠しきれていないので、細かいところの理解ができたらまたアップデートしていきます。

通知音を再生⇨AVAudioPlayerに入れる⇨バックグラウンドで無限ループ再生みたいな感じでアラームを作ることはできないのかな、、、