前提・実現したいこと
アプリ未起動時 (Not Running)にプッシュ通知されたアラートをタップすると、アプリが起動し、
通知に含まれる内容(ペイロード)を取得する実装を行っております。
しかし、アラートをタップして起動してもペイロードの内容を取得が出来ないでいます。
Xcodeでのデバックは以下を参考にして、プッシュ通知からのアプリ起動時も追えている状況です。
プッシュ通知などのイベントで起動した場合のデバッグ方法
※通知自体は行えている。
※ペイロードの内容は、常に同じ。
※アプリ起動中(Background)からの起動時はペイロードを受け取れている。
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)の利用時
Swiftを始めて間もない為、説明が下手くそですが、どうかご教授頂ければと思います。
宜しくお願い致します。。。
発生している問題
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 〜省略〜 return true }
第2引数のlaunchOptionsディクショナリからキーUIApplication.LaunchOptionsKey.remoteNotificationを指定することで
プッシュ通知のペイロードを格納したディクショナリが正常なら得られるが、常にlaunchOptionsがnilの状態で値が取得出来ない。
nilになる条件は、ホーム画面でアプリをタップしての起動時の場合らしいが、アプリの起動はアラートから行っています。。。
該当のソースコード
AppDelegate
1// 2// AppDelegate.swift 3// 4 5import UIKit 6import UserNotifications 7 8@UIApplicationMain 9class AppDelegate: UIResponder, UIApplicationDelegate { 10 11 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 12 // Override point for customization after application launch. 13 14 // プッシュ通知の利用許可リクエスト送信 15 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in 16 guard granted else { return } 17 18 DispatchQueue.main.async { 19 // プッシュ通知の利用登録 20 UIApplication.shared.registerForRemoteNotifications() 21 } 22 } 23 24 // アプリ起動時にプッシュ通知の情報を取得 25 if let userInfo = launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] as! [AnyHashable: Any]? { 26 let key: Array! = Array(userInfo.keys) 27 if key != nil { 28 for i in 0..<key.count { 29 let key0 = key[i] as! String 30 let value = userInfo["(key0)"] 31 32 〜省略〜 33 } 34 } 35 } 36 37 return true 38 } 39 40 // MARK: UISceneSession Lifecycle 41 42 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 43 // Called when a new scene session is being created. 44 // Use this method to select a configuration to create the new scene with. 45 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 46 } 47 48 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { 49 // Called when the user discards a scene session. 50 // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 51 // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 52 } 53 54 // プッシュ通知の利用登録が成功した場合 55 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 56 let token = deviceToken.map { String(format: "%.2hhx", $0) }.joined() 57 UserDefaults.standard.set(token, forKey: DEVICE_TOKEN) 58 print("Device token: (token)") 59 } 60 61 // プッシュ通知の利用登録が失敗した場合 62 func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { 63 print("Failed to register to APNs: (error)") 64 } 65 66 // アプリ起動中にプッシュ通知を受信した場合 67 // ※以下のuserInfoでは問題なく取得出来ている 68 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 69 70 guard let data = userInfo["data"] as? [String: AnyObject] else { 71 completionHandler(.failed) 72 return 73 } 74 75 let key: Array! = Array(data.keys) 76 if key != nil { 77 for i in 0..<key.count { 78 let key0 = key[i] 79 let value = data["(key0)"] 80 81 if let unwrapValue = value { 82 ~省略~ 83 } 84 } 85 } 86 } 87} 88 89 90
補足情報(FW/ツールのバージョンなど)
Swift5
Xcode11.2.1
iOS13.3
iPhoneSE(実機デバック)
回答1件
あなたの回答
tips
プレビュー