#[Swift] ローカル通知と通知アクションの呼ばれ方
import UserNotifications
//ローカル通知クラスとして実装
class NotificationManager: NSObject, UNUserNotificationCenterDelegate {
//シングルトン
static let shared = NotificationManager()
private override init() {
super.init()
regist()
}
func regist() {
//デリゲート設定
UNUserNotificationCenter.current().delegate = self
//通知利用の登録
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
(granted, error) in
// Error
}
}
//フォアグラウンド時の通知
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .sound])
}
//通知タップ
//以下の場合呼ばればい
//・通知をタップしない場合
//・通知を×ボタンで閉じた場合
//・ロック画面で消去をタップした場合
//・フォアグラウンド指定なしでアプリが起動していない場合
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
completionHandler()
}
func add() {
//フォアグラウンド指定なしなのでアプリが起動していない場合は通知タップが呼ばれない
let action1 = UNNotificationAction(identifier: "action1", title: "action1", options: [])
//フォアグラウンド指定ありなのでアプリが起動していない場合も通知タップが呼ばれる
let action2 = UNNotificationAction(identifier: "action2", title: "action2", options: [.foreground])
let category = UNNotificationCategory(identifier: "myCategory", actions: [action1, action2], intentIdentifiers: ["action1", "action2"] , options: [])
UNUserNotificationCenter.current().setNotificationCategories([category])
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationString(forKey: "title", arguments: nil)
content.body = NSString.localizedUserNotificationString(forKey: "body", arguments: nil)
content.sound = UNNotificationSound.default()
content.categoryIdentifier = "myCategory"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)
let request = UNNotificationRequest(identifier: "myNotification", content: content, trigger: trigger)
//通知の追加
UNUserNotificationCenter.current().add(request) { (error : Error?) in
if error != nil {
// Error
}
}
}
}