前提
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
回答1件