UserNotification(LocalNotification)


UserNotificationはユーザーに対して通知を発行する時に使用します。
UserNotificationは大きく分けて二種類あり、外部から通知を発行できるRemoteNotification(LineやTwitterのような通知)とLocalNotification(時計アプリなどの内部的に発行する通知)があります。
ここではLocalNotificationを取り扱います。

UserNotificationサンプル

初めにオリジナル通知音の発行に使用する音データ(.cafファイル)をプロジェクトに登録します。
.caf ファイルをプロジェクトに追加し、BundleResoucesに登録されていることを確認します。
また使用したcafファイルはこちらです。
UserNotificationの仕様として、使用するオリジナル通知音に不具合がある場合、デフォルトの通知音が再生されます。

alt

UserNotificationsBasic.swift

import UIKit
import UserNotifications

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //通知の許可を出す
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
        }
        
        // MARK: - 10秒後に着火するボタン
        let tenSecondBtn = UIButton()
        tenSecondBtn.frame = CGRect(x: 50, y: 50, width: 250, height: 40)
        tenSecondBtn.backgroundColor = UIColor.gray
        tenSecondBtn.addTarget(self, action: #selector(tenSecondBtnClicked(sender:)), for:.touchUpInside)
        tenSecondBtn.setTitle("10秒後に通知", for: UIControlState.normal)
        tenSecondBtn.setTitleColor(UIColor.white, for: UIControlState.normal)
        self.view.addSubview(tenSecondBtn)
        
        // MARK: - 時間日時をしてして通知する
        let setDayAndTimeBtn = UIButton()
        setDayAndTimeBtn.frame = CGRect(x: 50, y: 120, width: 250, height: 40)
        setDayAndTimeBtn.backgroundColor = UIColor.gray
        setDayAndTimeBtn.addTarget(self, action: #selector(setDayAndTimeBtnClicked(sender:)), for:.touchUpInside)
        setDayAndTimeBtn.setTitle("日時と時間を指定して通知", for: UIControlState.normal)
        setDayAndTimeBtn.setTitleColor(UIColor.white, for: UIControlState.normal)
        self.view.addSubview(setDayAndTimeBtn)

        // MARK: - 通知音を変更する
        let setOriginalSoundBtn = UIButton()
        setOriginalSoundBtn.frame = CGRect(x: 50, y: 190, width: 250, height: 40)
        setOriginalSoundBtn.backgroundColor = UIColor.gray
        setOriginalSoundBtn.addTarget(self, action: #selector(setOriginalSoundBtnClicked(sender:)), for:.touchUpInside)
        setOriginalSoundBtn.setTitle("オリジナルの通知音を設定", for: UIControlState.normal)
        setOriginalSoundBtn.setTitleColor(UIColor.white, for: UIControlState.normal)
        self.view.addSubview(setOriginalSoundBtn)
    }
    
    //10秒後に着火するボタンが終われたら呼ばれる
    internal func tenSecondBtnClicked(sender: UIButton){

        // Notificatiのインスタンス生成
        let content = UNMutableNotificationContent()
        
        // タイトルを設定する
        content.title = "ここがタイトルです"
        
        // 通知の本文です
        content.body = "ここが通知の本文です。ここが通知の本文です。ここが通知の本文です。"
        
        // デフォルトの音に設定します
        content.sound = UNNotificationSound.default()
        
        // Triggerを生成(いつ通知が来るのか)
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 10, repeats: false)
        
        // Requestを生成する。idには通知IDを設定する
        let request = UNNotificationRequest.init(identifier: "ID_TenSecond", content: content, trigger: trigger)
        
        // Noticationを生成する
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error) in
        }
    }
    
    
    //時間を指定して着火するボタンが終われたら呼ばれる
    internal func setDayAndTimeBtnClicked(sender: UIButton){
        
        // Notificatiのインスタンス生成
        let content = UNMutableNotificationContent()
        
        // タイトルを設定する
        content.title = "ここがタイトルです"
        
        // 通知の本文です
        content.body = "ここが通知の本文です。ここが通知の本文です。ここが通知の本文です。"
        
        // デフォルトの音に設定します
        content.sound = UNNotificationSound.default()
    
        //着火時間の設定
        //以下の例では午前1時25分0秒に設定しています
        var dateComponents = DateComponents()
        dateComponents.hour = 1
        dateComponents.minute = 30
        dateComponents.second = 0
        let calendarTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
        
        // Requestを生成する。idには通知IDを設定する
        let request = UNNotificationRequest.init(identifier: "ID_SetDayAndTime", content: content, trigger: calendarTrigger)
        
        // Noticationを発行する.
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error) in
            print(error ?? "aa")
        }
    }
    
    //オリジナルの通知音に設定ボタンが押されたら動く(10秒後に着火する)
    internal func setOriginalSoundBtnClicked(sender: UIButton){
        
        // Notificatiのインスタンス生成
        let content = UNMutableNotificationContent()
        
        // タイトルを設定する
        content.title = "ここがタイトルです"
        
        // 通知の本文です
        content.body = "ここが通知の本文です。ここが通知の本文です。ここが通知の本文です。"
        
        // オリジナルの音を設定する
        content.sound = UNNotificationSound.init(named: "sampleSound.caf")
        
        // Triggerを生成(いつ通知が来るのか)
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 10, repeats: false)
        
        // Requestを生成する。idには通知IDを設定する
        let request = UNNotificationRequest.init(identifier: "ID_TenSecond", content: content, trigger: trigger)
        
        // Noticationを生成する
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error) in
        }
    }
}