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

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

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

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

Q&A

解決済

1回答

594閲覧

日付を指定した際のローカル通知が届かない

pftyuk

総合スコア52

Swift

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

0グッド

0クリップ

投稿2019/01/27 13:36

編集2019/01/30 14:14

前提・実現したいこと

日付を指定して任意のタイミングでローカル通知を受け取りたいのですが
通知を受け取るタイミングの指定を、日付指定にしたパターンの時のみ
通知が飛んで来ず原因がわからないため、ご教示頂きたいです。

こちらを参考にして、未発火の通知を出力してみたのですが
どうもそもそも通知が登録されてない(?)ようなのですが原因がわかりませんでした。

前提として、アプリ起動後にアプリはバックグラウンド状態にしています。
リンク先の、一度だけ通知・繰り返し通知のパターンでは通知が飛んでくることを確認しました。

日付を指定するカレンダー通知のパターンの時のみ
通知が飛んでくることを確認できていない状況です。動作確認は実機で行っております。
ご回答頂けると幸いです。宜しくお願い致します。

出力結果

許可する ==========Pending Notification============ []

該当のソースコード

import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // アプリのバッジの更新、サウンド、アラートの通知に関してユーザへ確認 let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .badge, .sound]) {(granted, error) in if granted { print("許可する") } else { print("許可しない") } } return true } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } }

Swift

1import UIKit 2import UserNotifications 3 4class ViewController: UIViewController { 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 let calendar = Calendar.current 9 let date = Date() 10 let after = calendar.date(byAdding: .minute, value: 1, to: date)! 11 let dateComponents = Calendar.current.dateComponents(in: .current, from: after) 12 13 let content = UNMutableNotificationContent() 14 content.title = "カレンダー通知" 15 content.subtitle = "サブタイトル、これはiOS10から新登場" 16 content.body = "カレンダー通知が発火されました。" 17 content.sound = UNNotificationSound.default 18 19 // 指定した日付に発火 20 let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false) 21 let request = UNNotificationRequest(identifier: "notification", 22 content: content, 23 trigger: trigger) 24 25 // カレンダー通知予約 26 let center = UNUserNotificationCenter.current() 27 center.add(request, withCompletionHandler: nil) 28 29 center.getPendingNotificationRequests { (requests) in 30 print("==========Pending Notification============") 31 print(requests) 32 } 33 } 34}

###追記

(lldb) po dateComponents ▿ calendar: gregorian (current) timeZone: Asia/Tokyo (current) era: 1 year: 2019 month: 1 day: 30 hour: 22 minute: 52 second: 29 nanosecond: 591760039 weekday: 4 weekdayOrdinal: 5 quarter: 0 weekOfMonth: 5 weekOfYear: 5 yearForWeekOfYear: 2019 isLeapMonth: false ▿ calendar : gregorian (current) - identifier : Foundation.Calendar.Identifier.gregorian - kind : "current" ▿ locale : Optional<Locale> ▿ some : en_JP (current) - identifier : "en_JP" - kind : "current" ▿ timeZone : Asia/Tokyo (current) - identifier : "Asia/Tokyo" - kind : "current" ▿ abbreviation : Optional<String> - some : "JST" - secondsFromGMT : 32400 - isDaylightSavingTime : false - firstWeekday : 1 - minimumDaysInFirstWeek : 1 ▿ timeZone : Asia/Tokyo (current) - identifier : "Asia/Tokyo" - kind : "current" ▿ abbreviation : Optional<String> - some : "JST" - secondsFromGMT : 32400 - isDaylightSavingTime : false - era : 1 - year : 2019 - month : 1 - day : 30 - hour : 22 - minute : 52 - second : 29 - nanosecond : 591760039 - weekday : 4 - weekdayOrdinal : 5 - quarter : 0 - weekOfMonth : 5 - weekOfYear : 5 - yearForWeekOfYear : 2019 - isLeapMonth : false

###追記2
dateからdateComponentsに変換した場合とdateComponents決め打ちの場合で
両方デバッグ出力して比較してみましたが、dateからdateComponentsに変換した場合は
色々と付加情報がついていたので、憶測でしかないですがこの辺りが怪しい気がします。

//通知飛んで来ない //2019/1/30 23:05 実行 let calendar = Calendar.current let date = Date() let after = calendar.date(byAdding: .minute, value: 1, to: date)! let dateComponents = Calendar.current.dateComponents(in: .current, from: after) (lldb) po dateComponents ▿ calendar: gregorian (current) timeZone: Asia/Tokyo (current) era: 1 year: 2019 month: 1 day: 30 hour: 23 minute: 6 second: 8 nanosecond: 585582017 weekday: 4 weekdayOrdinal: 5 quarter: 0 weekOfMonth: 5 weekOfYear: 5 yearForWeekOfYear: 2019 isLeapMonth: false ▿ calendar : gregorian (current) - identifier : Foundation.Calendar.Identifier.gregorian - kind : "current" ▿ locale : Optional<Locale> ▿ some : en_JP (current) - identifier : "en_JP" - kind : "current" ▿ timeZone : Asia/Tokyo (current) - identifier : "Asia/Tokyo" - kind : "current" ▿ abbreviation : Optional<String> - some : "JST" - secondsFromGMT : 32400 - isDaylightSavingTime : false - firstWeekday : 1 - minimumDaysInFirstWeek : 1 ▿ timeZone : Asia/Tokyo (current) - identifier : "Asia/Tokyo" - kind : "current" ▿ abbreviation : Optional<String> - some : "JST" - secondsFromGMT : 32400 - isDaylightSavingTime : false - era : 1 - year : 2019 - month : 1 - day : 30 - hour : 23 - minute : 6 - second : 8 - nanosecond : 585582017 - weekday : 4 - weekdayOrdinal : 5 - quarter : 0 - weekOfMonth : 5 - weekOfYear : 5 - yearForWeekOfYear : 2019 - isLeapMonth : false ------------------------------------------------------------------------------- //通知飛んで来る //2019/1/30 23:06 実行 var dateComponents = DateComponents() dateComponents.year = 2019 dateComponents.month = 1 dateComponents.day = 30 dateComponents.hour = 23 dateComponents.minute = 7 dateComponents.second = 0 (lldb) po dateComponents ▿ year: 2019 month: 1 day: 30 hour: 23 minute: 7 second: 0 isLeapMonth: false - year : 2019 - month : 1 - day : 30 - hour : 23 - minute : 7 - second : 0 - isLeapMonth : false

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

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

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

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

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

guest

回答1

0

ベストアンサー

時間がなくて検証までできていないのですが、

  • dateComponentsの中身をデバッグで見てみて、変な値が設定されていないかを確認する
  • Dateからではなく、手動でdateComponentsを生成し(決め打ちで日にちや時間を指定する)

後者で上手く行けば、前者との値の入り方の違いで
原因が特定出来そうですが、試してみてはいかがでしょうか。

投稿2019/01/30 02:23

takabosoft

総合スコア8356

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

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

pftyuk

2019/01/30 14:03

ご回答頂きありがとうございます。 未だ原因が掴めなかったのでレスポンス頂けただけで非常に助かります。 dateComponentsの中身をデバッグで見てみて、変な値が設定されていないかを確認する →こちら中身を確認してみました。追記で回答に載せてみたので確認頂ければと思います。 22:51に実行したので丁度1分後辺りで変な値は入ってなさそうに思いますね・・・。 Dateからではなく、手動でdateComponentsを生成し(決め打ちで日にちや時間を指定する) →こちら試してみました。結論から申し上げるとこの方法で通知確認できました。 //変更箇所と出力結果 var dateComponents = DateComponents() dateComponents.year = 2019 dateComponents.month = 1 dateComponents.day = 30 dateComponents.hour = 22 dateComponents.minute = 55 dateComponents.second = 0 許可する ==========Pending Notification============ [<UNNotificationRequest: 0x280d248a0; identifier: notification, content: <UNNotificationContent: 0x283672280; title: カレンダー通知, subtitle: サブタイトル、これはiOS10から新登場, body: カレンダー通知が発火されました。, summaryArgument: , summaryArgumentCount: 0, categoryIdentifier: , launchImageName: , threadIdentifier: , attachments: ( ), badge: (null), sound: <UNNotificationSound: 0x282778540>,, trigger: <UNCalendarNotificationTrigger: 0x280368460; dateComponents: <NSDateComponents: 0x283470bb0> Calendar Year: 2019 Month: 1 Day: 30 Hour: 22 Minute: 55 Second: 0, repeats: NO>>] 追々やりたいこととして、Dateで日付計算して該当の日に通知を送るようなことをしたいので DateからDateComponentsに変換して通知を設定出来ると嬉しいですが、そもそも無理なんですかね・・・。
pftyuk

2019/01/31 12:52

こちらDateからDateComponentsに変換後 色々付加情報がありますが、一旦別でDateComponentsのインスタンス生成後に 必要な項目だけ抽出して、手動で生成したインスタンスに値をセットする流れで 無事やりたいことが実現できました!解決しましたのでベストアンサーとさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問