質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

459閲覧

[swift]通知が出ない

funaki

総合スコア1

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

1グッド

0クリップ

投稿2023/01/05 17:27

前提

swiftuiでルーティンワークを手伝うアプリを作っています。
プッシュ通知を実装しようとし、コードを書きましたが通知が表示されません。
coredataを使い、ユーザーに作業開始時間と終了時間を指定してもらって、その時間にプッシュ通知がいくようにしたいです。

実現したいこと

  • 通知を出したい

発生している問題・エラーメッセージ

なし

該当のソースコード

swift ------------------------------------contentView--------------------------------------- import SwiftUI import CoreData struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @State private var isPresented: Bool = false @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Item.title, ascending: true)], animation: .default) private var items: FetchedResults<Item> init(){ let center = UNUserNotificationCenter.current() center.requestAuthorization(options: .alert) { granted, error in if granted { print("許可されました!") }else{ print("拒否されました...") } } } var body: some View { NavigationStack { VStack { TabView { //朝 List { ForEach(items) { item in NavigationLink { Text("Item at \(item.title!)") } label: { Text(item.title!) } } .onDelete(perform: deleteItems) } .tabItem { Image(systemName: "sun.haze") } //夜 } .navigationTitle("Routine") .navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.large) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { NavigationLink(destination: addView()) { Text("追加") } } } } } } //リストを削除する関数 private func deleteItems(offsets: IndexSet) { withAnimation { offsets.map { items[$0] }.forEach(viewContext.delete) do { try viewContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } } } struct add: View{ var body: some View { addView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } } private let itemFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .medium return formatter }() struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } } ------------------------------------追加View------------------------------------------- import SwiftUI struct addView: View { @Environment(\.managedObjectContext) private var viewContext @Environment(\.presentationMode) var presentation @State private var isPresented: Bool = false @State private var title = "" @State private var startTime = Date() @State private var finishTime = Date() var body: some View { NavigationStack { VStack { Spacer() TextField("やること", text: $title) .padding() Spacer() DatePicker("開始時刻", selection: $startTime, displayedComponents: .hourAndMinute) .padding() Spacer() DatePicker("終了時刻", selection: $finishTime, displayedComponents: .hourAndMinute) .padding() Spacer() } .environment(\.editMode, .constant(.active)) .navigationTitle("追加") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button(action: { addItem() sendNotificationRequest() }) { Text("保存") } } } } } //通知のやつ func sendNotificationRequest(){ let content = UNMutableNotificationContent() content.title = "通知のタイトル" content.body = "通知の内容です" let dateComponent = Calendar.current.dateComponents([.hour,.minute], from: Date()) print(dateComponent) // 以下に表示 let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: false) let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request) } //リストを追加する関数 private func addItem() { let newItem = Item(context: viewContext) newItem.title = title newItem.startTime = startTime newItem.finishTime = finishTime try? viewContext.save() presentation.wrappedValue.dismiss() } struct addView_Previews: PreviewProvider { static var previews: some View { addView() } } }

試したこと

追加Viewに通知を出す関数を書いたのがダメだったのかと思い、contentViewにコピペして試しましたが動作しませんでした。

補足情報(FW/ツールのバージョンなど)

xcode14.2

funaki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

funaki

2023/01/06 04:58

ご連絡ありがとうございます!確認してみます!
guest

回答1

0

自己解決

let dateComponent のfromを設定時刻に設定できていなかったため通知が出ないだけでした。
startTimeに変更したらちゃんと機能しました!

投稿2023/01/06 05:07

funaki

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問