通知を発行するケースでサーバーを使ったRemoteで通知をユーザーに出す場合と、例えばタイマーやアラームなどのアプリがローカルに発行する場合があります。Time Intervalで繰り返しの通知を発行させてみます。
Xcode 11.4.1
UserNotifications
通知を発行するトリガーとして以下のものがあり、PushがRemote Notificationと言われていたものです。残りはローカル通知になります。
- Time Interval
- Calendar
- Location
- Push
タイマーアプリを作るときはこの Time Interval が使いやすいでしょう。
サンプルコード
バックグラウンドで時間計測させたり、他のアプリを使っている時にも通知を出させるためにAppDelegateで設定します。
AppDelegate.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import UIKit import os @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 通知許可の取得 UNUserNotificationCenter.current().requestAuthorization( options: [.alert, .sound, .badge]){ (granted, _) in if granted{ UNUserNotificationCenter.current().delegate = self } } return true } // MARK: UISceneSession Lifecycle func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { ... } func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { ... } } // 通知を受け取ったときの処理 extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { os_log("Notified") // アプリ起動時も通知を行う completionHandler([.sound, .alert ]) } } |
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import UIKit import os class ViewController: UIViewController, UNUserNotificationCenterDelegate { override func viewDidLoad() { super.viewDidLoad() let center = UNUserNotificationCenter.current() // 通知の使用許可をリクエスト center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in } } @IBAction func setButton(_ sender: Any) { os_log("setlocalNotfication") // notification's payload の設定 let content = UNMutableNotificationContent() content.title = "Dinner" content.subtitle = "20:00" content.body = "It’s time for dinner." content.sound = UNNotificationSound.default // 1回だけ //let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) // 繰り返しは60sec以上 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true) let request = UNNotificationRequest(identifier: "Time Interval", content: content, trigger: trigger) // 通知の登録 UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) } @IBAction func stopButton(_ sender: Any) { os_log("stoplocalNotfication") // 通知の削除 UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["interval"]) } } |
Time Intervalの通知を設定・削除するためにボタンを作ってstoryboardで紐付けしてください。
繰り返しの通知は60sec以上である必要があります。os_logを使っているのは時間を確認するためだけです。
References:
UserNotifications | Apple Developer Documentation
UNTimeIntervalNotificationTrigger – UserNotifications | Apple
UNUserNotificationCenter – UserNotifications | Apple
UNMutableNotificationContent – UserNotifications | Apple