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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3126閲覧

swift プッシュ通知 アプリ未起動時からの通知内容取得

snc

総合スコア19

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

1クリップ

投稿2020/02/04 08:43

編集2020/02/06 01:38

前提・実現したいこと

アプリ未起動時 (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(実機デバック)

参考
iOSにおけるPush通知の基本2(受信した通知の内容取得)

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

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

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

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

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

snc

2020/02/27 06:59

回答ありがとうございます。Xcode 11から追加されるSceneDelegateを使用しない設定をする事で、無事に取れるようになりました。
hoshi-takanori

2020/02/27 07:11

SceneDelegate 曲者ですね。こちらこそお知らせありがとうございます。
guest

回答1

0

自己解決

Xcode 11から追加されるSceneDelegateを使用しない設定をする事で、無事に取れるようになりました。

投稿2020/02/27 07:02

snc

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問