【SwiftUI】通知を日付(Date型)で指定する方法!UNCalendarNotificationTrigger

この記事からわかること

  • Swift UIプッシュ通知実装する方法
  • (Date型)z
  • 通知を日付(Date)で指定するには?
  • UNCalendarNotificationTrigger使い方注意点
  • DateComponents使用方法
  • Date型からDateComponentsに変換すると通知が表示されない原因解決法

index

[open]

\ アプリをリリースしました /

ふるログ

ふるさと納税管理アプリ-ふるログ-

無料posted withアプリーチ

Swift UIでプッシュ通知を表示させる日付や時間を直感的にDate型などで指定する方法をまとめていきます。この記事では通知の実装方法は解説しませんので下記記事を参考にしてください。

通知を日付(Date型)で指定する方法

通知機能を実装する際に通知の表示タイミングをUNTimeIntervalNotificationTriggerクラスを使った現在時刻+秒数単位ではなく、日付形式に指定するためにはUNCalendarNotificationTriggerを使用します。まずは使用例を見てみます。

UNTimeIntervalNotificationTriggerを使用した現在時刻+3秒後に通知表示

func sendNotificationRequest(){
    let content = UNMutableNotificationContent()
    content.title = "通知のタイトル"
    content.body = "通知の内容です"

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)

    let request = UNNotificationRequest(identifier: UUID().uuidString , content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request)
}

UNCalendarNotificationTriggerを使用した8:30に通知表示

func sendNotificationRequest(){
    let content = UNMutableNotificationContent()
    content.title = "通知のタイトル"
    content.body = "通知の内容です"

    let dateComponent = DateComponents(hour: 8, minute: 30)
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: false)

    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request)
}

UNCalendarNotificationTrigger

UNCalendarNotificationTrigger通知のトリガー条件を日付単位で指定できるクラスです。引数にはDate型ではなくDateComponents型で日付情報を渡します。

init(
    dateMatching dateComponents: DateComponents,
    repeats: Bool
)

【Swift】DateComponentsとは?使用方法とDate型との違い

DateComponents型はインスタンス化時のイニシャライザによって値を定義できます。

DateComponents

DateComponents(year: 2022, month: 10, day: 4, hour: 10, minute: 30)

またはCalendar構造体のdateComponentsメソッドからも変換可能です。このメソッドだとDate型から直接変換することが可能です。

Calendar.current.dateComponents(in: TimeZone.current, from: Date())

Date型から変換すると通知が表示されない?

Calendar構造体のdateComponentsメソッドを使用して現在時刻+3秒を設定してUNCalendarNotificationTriggerの引数に渡してみましたが、うまく動作しませんでした。

func sendNotificationRequest(_ date:Date){
    let content = UNMutableNotificationContent()
    content.title = "通知のタイトル"
    content.body = "通知の内容です"
    
    var dateComponent = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
    dateComponent.second! += 3
    print(dateComponent) // 以下に表示
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: false)
    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request)
}

この原因はUNCalendarNotificationTriggerの引数dateMatchingの説明に記述されていました。

引用:init(dateMatching dateComponents: DateComponents,repeats: Bool)

”dateComponents
トリガーを構築するときに使用する一時的な情報。トリガーに関連する日付コンポーネントのみを指定してください。”

引数として指定するDateComponentsは必要な情報のみを保持したデータでないといけないようです。先ほどのデータを表示して見るとさまざまな情報を保持してしまっているので正常に動作しなかったのだと思います。

calendar: gregorian (current) timeZone: Asia/Tokyo (fixed (equal to current)) era: 1 year: 2022 month: 10 day: 4 hour: 6 minute: 23 second: 41 nanosecond: 184649944 weekday: 3 weekdayOrdinal: 1 quarter: 0 weekOfMonth: 2 weekOfYear: 41 yearForWeekOfYear: 2022 isLeapMonth: false 

Date型から変換するには?

Date型から変換した情報を使用するためには以下のように配列形式で必要な情報を指定することで解決できます。

func sendNotificationRequest(){
    let content = UNMutableNotificationContent()
    content.title = "通知のタイトル"
    content.body = "通知の内容です"

    let dateComponent = Calendar.current.dateComponents([.hour,.minute,.second], from: Date())
    dateComponent.second! += 3
    print(dateComponent)  // 以下に表示
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: false)
    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request)
}
hour: 6 minute: 32 second: 32 isLeapMonth: false 

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

私がSwift UI学習に使用した参考書

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

自作iOSアプリ

\ アプリをリリースしました /

mapping

自分だけの地図を作ろう!-mapping-

無料posted withアプリーチ

割り勘アプリ-bill-

旅行におすすめ!
割り勘アプリ-bill-

無料posted withアプリーチ

Imakoko

現在地を取得するアプリ!Imakoko

無料posted withアプリーチ

ふるログ

ふるさと納税管理アプリ-ふるログ-

無料posted withアプリーチ

Remind-シンプル通知アプリ-

シンプル通知アプリ-Remind-

無料posted withアプリーチ

CLIPURL

好きな記事をクリップしよう!-CLIPURL-

無料posted withアプリーチ

記録カレンダー

続けたを可視化できるアプリ!記録カレンダー

無料posted withアプリーチ

Githubにて
iOSアプリのソースコードを公開中!

自作Webアプリ

子育て知識共有サイト-mikata-

子育て知識共有サイト-mikata-

フレームワーク:Laravel/Vue.js

作成の流れQiita「Laravel×Vue.jsを使って初めてWebアプリを自作しました!」

感想:初めて作成したWebアプリです!メールアドレスでの会員登録や質問投稿、回答やコメント、いいねやフォローなどSNSに近い機能を実装してみました。レビューや修正すべきポイントなどを教えていただけると嬉しいです!

New Article

index