通知を発行するケースでサーバーを使ったRemoteで通知をユーザーに出す場合と、例えばタイマーやアラームなどのアプリがローカルに発行する場合があります。Calendarで日時を決めて通知を発行させてみます。
Swift 5.1
Xcode 11.4.1
Xcode 11.4.1
UserNotifications
通知を発行するトリガーとして以下のものがあり、PushがRemote Notificationと言われていたものです。残りはローカル通知になります。
- Time Interval
- Calendar
- Location
- Push
めざまし時計アプリを作るときはこの Calendar を使ったほうがいいでしょう。
サンプルコード
バックグラウンドで時間計測させたり、他のアプリを使っている時にも通知を出させるために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 |
import UIKit import os class ViewController: UIViewController { var request:UNNotificationRequest! override func viewDidLoad() { super.viewDidLoad() // 直接日時を設定 let triggerDate = DateComponents(month:4, day:26, hour:12, minute:04, second: 10) let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false) // 通知コンテンツの作成 let content = UNMutableNotificationContent() content.title = "Calendar Notification" content.body = "2020/4/26 21:06:10" content.sound = UNNotificationSound.default // 通知リクエストの作成 request = UNNotificationRequest.init( identifier: "CalendarNotification", content: content, trigger: trigger) } @IBAction func setButton(_ sender: Any) { os_log("setButton") // 通知リクエストの登録 let center = UNUserNotificationCenter.current() center.add(request) } } |
現在の時刻から1分後に設定するケース
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 47 48 49 50 51 52 |
import UIKit import os class ViewController: UIViewController { var request:UNNotificationRequest! override func viewDidLoad() { super.viewDidLoad() // 日付フォーマット let date = Date() let dateFormatter = DateFormatter() dateFormatter.timeStyle = .medium dateFormatter.dateStyle = .medium dateFormatter.locale = Locale(identifier: "ja_JP") // 現在時刻の1分後に設定 let date2 = Date(timeInterval: 60, since: date) let targetDate = Calendar.current.dateComponents( [.year, .month, .day, .hour, .minute], from: date2) let dateString = dateFormatter.string(from: date2) print(dateString) // トリガーの作成 let trigger = UNCalendarNotificationTrigger.init(dateMatching: targetDate, repeats: false) // 通知コンテンツの作成 let content = UNMutableNotificationContent() content.title = "Calendar Notification" content.body = dateString content.sound = UNNotificationSound.default // 通知リクエストの作成 request = UNNotificationRequest.init( identifier: "CalendarNotification", content: content, trigger: trigger) } @IBAction func setButton(_ sender: Any) { os_log("setButton") // 通知リクエストの登録 let center = UNUserNotificationCenter.current() center.add(request) } } |
日付フォーマットでのja_JPおけるスタイル;
dateStyle | |
---|---|
.full | 2020年4月26日日曜日 |
.long | 2020年4月26日 |
.medium | 2020/04/26 |
.short | 2020/04/26 |
.none | (出力なし) |
timeStyle | |
.full | 21時06分10秒 日本標準時 |
.long | 21:06:10 JST |
.medium | 21:06:10 |
.short | 21:06 |
.none | (出力なし) |
References:
UserNotifications | Apple Developer Documentation
UNCalendarNotificationTrigger – UserNotifications | Apple
UNUserNotificationCenter – UserNotifications | Apple
UNMutableNotificationContent – UserNotifications | Apple