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

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

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

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

解決済

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

shokoba58
koto

総合スコア84

Swift

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

1回答

0評価

0クリップ

137閲覧

投稿2022/06/17 20:16

編集2022/06/18 10:53

Swiftでタスクアプリを作成し、指定した時間に通知する機能を実装したのですが動いてくれず、悩んでいます。

まず保存処理の該当部分は以下です。

swift

// 保存クラス // 新規作成 func add(){ let item = TodoItem() item.id = String(Int.random(in: 0...9999)) try! realm.write{ realm.add(item) } } // 更新 func update(id:String,title:String,date:Date,check:Bool,notificationFlg:Bool){ let item = TodoItem() // IDに紐づくデータを取得 let target = realm.objects(TodoItem.self).filter("id == %@", id) try! realm.write{ target[0].title = title target[0].date = date target[0].check = check target[0].notificationFlg = notificationFlg } setNotification(item: item) print("編集完了") } // 通知 func setNotification(item:TodoItem){ let targetDate = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from:item.date) let trigger = UNCalendarNotificationTrigger(dateMatching: targetDate, repeats: false) let content = UNMutableNotificationContent() content.title = item.title content.sound = .default let request = UNNotificationRequest(identifier: item.id, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) }

新規作成機能でタイトルのみのデータを作成し、
編集画面で通知日時を設定し、更新して通知をセットするようにしています。
DBには以下のように登録されています。
id = 0001
title = 仮
date = 2022-06-17T19:56:16.250Z
check = false (タスクのチェックボックスのBoolです)
notificationFlg = false (通知を設定するか否かを設定するフラグ・未実装です)

AppDelegateの該当部分は以下です。

swift

let defaults = UserDefaults() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // マイグレーション処理 migration() // 初回起動フラグが立っているなら初回起動処理 let dic = ["initialFlg": true] defaults.register(defaults: dic) defaults.synchronize() // 通知の許可 UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]){ (granted,error) in } if defaults.bool(forKey: "initialFlg") == true { print("initial setup start") self.initialSetUp() } return true } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.banner,.sound]) }

DBにも正しいデータが入っているはずなのに動かず、詰まっています。
(補足ですが、試しに即時通知機能をviewWillAppearに実装した所、正しく動作しました)

swift

let notificationContent = UNMutableNotificationContent() notificationContent.title = "お知らせ" notificationContent.body = "通知内容" notificationContent.sound = UNNotificationSound.default let request = UNNotificationRequest(identifier: "notification", content: notificationContent, trigger: nil) UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

xg63ex2b

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]) で渡してみましたが、やはり変わらずでした…
xg63ex2b

2022/06/18 00:49

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

2022/06/18 01:02

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

2022/06/18 01:29

補足ですが、setNotificationは「// 保存クラス」の下に記載しています。
xg63ex2b

2022/06/18 01:38

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

2022/06/18 01:50

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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