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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

587閲覧

[Swift]通知機能を実装したのに通知してくれない

shokoba58

総合スコア99

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/06/17 20:16

編集2022/06/18 01:01

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)

解決法につきまして、教えて頂けましたら幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/17 23:13

DB(target[0])は内容を変更しているように見えますが、 setNotification(item: item)のitemはインスタンスを生成した直後の状態のままのように見えます。 target[0]をsetNotificationに渡してみたら何か変わりますでしょうか。
shokoba58

2022/06/17 23:51

ご回答ありがとうございます。 setNotification(item: target[0]) で渡してみましたが、やはり変わらずでした…
退会済みユーザー

退会済みユーザー

2022/06/18 00:49

そうでしたか、すみません・・ setNotificationはご自身で実装されているメソッドですよね。 こちらも質問欄のコードとしてご記載いただけますでしょうか。
shokoba58

2022/06/18 01:02

通知機能に値を渡すメソッドを記載しておらず失礼しました… 質問欄に追記いたしました。
shokoba58

2022/06/18 01:29

補足ですが、setNotificationは「// 保存クラス」の下に記載しています。
退会済みユーザー

退会済みユーザー

2022/06/18 01:38

コードのご記載ありがとうございます。 setNotificationの部分を使って再現確認してみましたが手元の環境では通知が表示されました。 「DBには以下のように登録されています。」とご記載いただいていますが、 setNotificationの中のitemの内容を確認したときにも正しい状態になっていますでしょうか? 「(補足ですが、試しに即時通知機能をviewWillAppearに実装した所、正しく動作しました)」 とのことですので、基本的な通知の実装はできていると思っています。
shokoba58

2022/06/18 01:50

itemをtarget[0]に変更した後、念の為クリーンビルドしたら 正しく動作しました!ゴミが悪さをしていたのかもしれないです。 丁寧にご回答いただき、ありがとうございました!
guest

回答1

0

自己解決

教えていただいた通りに
setNotification(item: item) → setNotification(item: target[0])(更新後最新データ)に変更し、
クリーンビルドしたら正しく動作しました。
ありがとうございました!

投稿2022/06/18 01:53

shokoba58

総合スコア99

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問