こんにちは。
UISwitchをオンにしたら、DatePickerで設定した日時にローカル通知を行うという流れを実装しました。
ここでやりたいことは、通知の内容が毎回変わるという動作を組み込みたいのですが、この動作ができずに困っています。
swift
1import UserNotifications 2 3class LocalPushManager: NSObject { 4 static var shared = LocalPushManager() 5 let center = UNUserNotificationCenter.current() 6 7 func requestAuthorization(){ 8 center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in 9 if error == nil { 10 print("permission granted") 11 } 12 } 13 } 14 15 16//UISwitchをONにするとDatePickerが出て、hour minute を引数としたこの関数が呼ばれる 17 func sendLocalPush( _ h:Int, _ m:Int){ 18 19 var dispTitle = "" 20 let now = Date() 21 var days = 0 22 23 //UserDefaultsに事前に保存してあるタイトル、日数を引っ張り、今日との差(残り何日か)を 24 //以下コンテンツにいれる 25 if UserDefaults.standard.string(forKey: "dispTitle") != nil { 26 var setdate = UserDefaults.standard.object(forKey: "dispDate") as! Date 27 dispTitle = UserDefaults.standard.string(forKey: "dispTitle") as! String 28 days = Int(Calendar.current.dateComponents([.day], from: now, to: setdate).day!) + 1 29 } 30 31 // local push content 32 let content = UNMutableNotificationContent() 33 content.title = NSString.localizedUserNotificationString(forKey: "(dispTitle)", arguments: nil) 34 content.body = NSString.localizedUserNotificationString(forKey: "(days) days left!", arguments: nil) 35 36 // trigger 37 let date = DateComponents(hour:h, minute:m) 38 let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true) 39 40 let request = UNNotificationRequest(identifier: "Timer", content: content, trigger: trigger) 41 42 center.add(request) { (error) in 43 if error == nil { 44 print("schedule push succeed") 45 } 46 } 47 48 } 49 50} 51 52
この時点で、実際に正確な日数が計算されて指定時間に表示はされます。
Switchをオンにしたときに Date() が中で定義されている sendLocalPush が呼ばれ、そのときの日付との差が中で作成され、それをコンテンツに渡され、それをリクエストしてリピートしているので、結果内容がその日付を元に作成したものから変わらないのはわかっています。
通知受信をしたら、バックグラウンドでも中で特定のfuncを発動させるというような情報も探したのですが、それは出来ないというような記事をみました(無音の音を再生するくらいしかないが、FBがそれをやって問題になったとかなんとかのお話)。
通知を受信し、それを開いたときに発動するというのは見かけたのですが、実行したい動作は開かずとも毎日内容が違う(30日、29日、28日。。。)通知を送るということです。
これは不可能なのでしょうか。
もしくは、スイッチがオンの間は毎日リピートと言えども、オンにしたときに日数分のコンテンツを作成してその数分だけリクエストするという方法しかないのでしょうか?
(数十個作成するのはいいと思いますが、100を超えてしまうと相当な量になってしまうのではないかと思います)
よろしくお願いいたします。
あなたの回答
tips
プレビュー