【Swift】プッシュ通知の取得と、ローカルプッシュ通知の送信方法

## プッシュ通知の取得

### 手順1
info.plistに **Privacy - User Notifications Usage Description** を追記する。
※追記理由：Alertの文言をわかりやすいものに変更する為。
![スクリーンショット 2022-09-17 13.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/106c6464-5c52-762a-cf6c-d164fc8ace85.png)

### 手順2
AppDelegate.swiftにUserNotificationsをインポートする

``` AppDelegate.swift
import UserNotifications
```

### 手順3
フォアグラウンド(アプリが起動状態)で受け取れるようにする
※いらない人はスキップ

``` AppDelegate.swift
extension AppDelegate: UNUserNotificationCenterDelegate {
    // フォアグラウンドの場合でも通知を表示する
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.list, .sound,])
    }
}
```

![スクリーンショット 2022-09-17 13.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/5056638a-2086-1998-350a-64cbf28dfb19.png)

### 手順4
アプリのバッジの更新、サウンド、アラートの通知に関してユーザへ確認するためのアラートを表示する
delegate忘れずに。

``` AppDelegate.swift
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) {(granted, error) in
    if granted {
        print("許可する")
        UNUserNotificationCenter.current().delegate = self
    } else {
        print("許可しない")
    }
}
```

## ローカルプッシュ通知の送信

### 説明
インスタンス生成

``` sample.swift
let content = UNMutableNotificationContent()
```


各項目を入力(初期値のままでいい場合、一部省略可能)

``` sample.swift
content.title = "タイトル"
content.subtitle = "サブタイトル"
content.body = "タップしてアプリを開いてください"
content.sound = UNNotificationSound.default
```

トリガー作成
timeInterval : (Int)何秒後に発火させるかを定義
repeats : (bool)リピート
参考：

https://developer.apple.com/documentation/usernotifications/untimeintervalnotificationtrigger
``` sample.swift
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10,
                                                repeats: false)
```

request作成

identifier：(String)通知毎に一意の文字が好ましい。Date()とか。
content：(UNMutableNotificationContent)
trigger：(UNTimeIntervalNotificationTrigger)

``` sample.swift
let request = UNNotificationRequest(identifier: "Timer",
                                    content: content,
                                    trigger: trigger)
```

UNUserNotificationCenterにrequest

``` sample.swift
UNUserNotificationCenter.current().add(request) { (error) in
    if let error = error {
        print(error.localizedDescription)
    }
}
```

以下全文

``` 使いたいクラスの関数に入れる。.swift
// タイトル、本文、サウンド設定の保持
let content = UNMutableNotificationContent()
content.title = "タイトル"
content.subtitle = "サブタイトル"
content.body = "タップしてアプリを開いてください"
content.sound = UNNotificationSound.default

// seconds後に起動するトリガーを保持
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10,
                                                repeats: false)
// 識別子とともに通知の表示内容とトリガーをrequestに内包する
let request = UNNotificationRequest(identifier: "Timer",
                                    content: content,
                                    trigger: trigger)

// UNUserNotificationCenterにrequest
UNUserNotificationCenter.current().add(request) { (error) in
    if let error = error {
        print(error.localizedDescription)
    }
}
```

## サンプルプロジェクト

https://github.com/kirasoga/LocalNotification

## 最後に
iOSアプリ開発をしています。
主にSwiftですが、最近は熱が入ってきてFlutterも🦾
色々やってます。もし良かったら見てってください。

https://sogablog.net/