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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

0回答

1058閲覧

[Swift]ローカル通知の表示文字列を毎回変更する

mogiruri

総合スコア37

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

1クリップ

投稿2018/11/30 06:29

こんにちは。
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を超えてしまうと相当な量になってしまうのではないかと思います)

よろしくお願いいたします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問