Swiftでタスクアプリを作成し、指定した時間に通知する機能を実装したのですが動いてくれず、悩んでいます。
まず保存処理の該当部分は以下です。
swift
1 // 保存クラス 2 // 新規作成 3 func add(){ 4 let item = TodoItem() 5 item.id = String(Int.random(in: 0...9999)) 6 try! realm.write{ 7 realm.add(item) 8 } 9 } 10 11 // 更新 12 func update(id:String,title:String,date:Date,check:Bool,notificationFlg:Bool){ 13 let item = TodoItem() 14 // IDに紐づくデータを取得 15 let target = realm.objects(TodoItem.self).filter("id == %@", id) 16 try! realm.write{ 17 target[0].title = title 18 target[0].date = date 19 target[0].check = check 20 target[0].notificationFlg = notificationFlg 21 } 22 setNotification(item: item) 23 print("編集完了") 24 } 25 26 // 通知 27 func setNotification(item:TodoItem){ 28 let targetDate = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from:item.date) 29 let trigger = UNCalendarNotificationTrigger(dateMatching: targetDate, repeats: false) 30 let content = UNMutableNotificationContent() 31 content.title = item.title 32 content.sound = .default 33 let request = UNNotificationRequest(identifier: item.id, content: content, trigger: trigger) 34 UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 35 }
新規作成機能でタイトルのみのデータを作成し、
編集画面で通知日時を設定し、更新して通知をセットするようにしています。
DBには以下のように登録されています。
id = 0001
title = 仮
date = 2022-06-17T19:56:16.250Z
check = false (タスクのチェックボックスのBoolです)
notificationFlg = false (通知を設定するか否かを設定するフラグ・未実装です)
AppDelegateの該当部分は以下です。
swift
1 let defaults = UserDefaults() 2 3 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 4 // Override point for customization after application launch. 5 // マイグレーション処理 6 migration() 7 // 初回起動フラグが立っているなら初回起動処理 8 let dic = ["initialFlg": true] 9 defaults.register(defaults: dic) 10 defaults.synchronize() 11 12 // 通知の許可 13 UNUserNotificationCenter.current().delegate = self 14 UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]){ 15 (granted,error) in 16 } 17 18 if defaults.bool(forKey: "initialFlg") == true { 19 print("initial setup start") 20 self.initialSetUp() 21 } 22 23 return true 24 } 25 26 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 27 completionHandler([.banner,.sound]) 28 }
DBにも正しいデータが入っているはずなのに動かず、詰まっています。
(補足ですが、試しに即時通知機能をviewWillAppearに実装した所、正しく動作しました)
swift
1 let notificationContent = UNMutableNotificationContent() 2 notificationContent.title = "お知らせ" 3 notificationContent.body = "通知内容" 4 notificationContent.sound = UNNotificationSound.default 5 6 let request = UNNotificationRequest(identifier: "notification", content: notificationContent, trigger: nil) 7 UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
解決法につきまして、教えて頂けましたら幸いです。
DB(target[0])は内容を変更しているように見えますが、
setNotification(item: item)のitemはインスタンスを生成した直後の状態のままのように見えます。
target[0]をsetNotificationに渡してみたら何か変わりますでしょうか。
ご回答ありがとうございます。
setNotification(item: target[0])
で渡してみましたが、やはり変わらずでした…
そうでしたか、すみません・・
setNotificationはご自身で実装されているメソッドですよね。
こちらも質問欄のコードとしてご記載いただけますでしょうか。
通知機能に値を渡すメソッドを記載しておらず失礼しました…
質問欄に追記いたしました。
補足ですが、setNotificationは「// 保存クラス」の下に記載しています。
コードのご記載ありがとうございます。
setNotificationの部分を使って再現確認してみましたが手元の環境では通知が表示されました。
「DBには以下のように登録されています。」とご記載いただいていますが、
setNotificationの中のitemの内容を確認したときにも正しい状態になっていますでしょうか?
「(補足ですが、試しに即時通知機能をviewWillAppearに実装した所、正しく動作しました)」
とのことですので、基本的な通知の実装はできていると思っています。
itemをtarget[0]に変更した後、念の為クリーンビルドしたら
正しく動作しました!ゴミが悪さをしていたのかもしれないです。
丁寧にご回答いただき、ありがとうございました!
回答1件
あなたの回答
tips
プレビュー