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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

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

Swift

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

受付中

Push通知が届かなくなった(ios, fcm)

nyantaroo
nyantaroo

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

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

Swift

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

1回答

0評価

0クリップ

4193閲覧

投稿2020/12/30 05:33

編集2022/01/12 10:55

AppStoreにアプリが公開されてからPush通知が届かなくなりました。(正確なタイミングは不明、リリースが原因かも不明)
本番環境だけでなく、開発環境でも届かなくなりました。
公開される2日前までは、開発環境での実機シミューレートやTestFlightでのテストで、問題なく通知は届いていました。
公開されたのは昨日です。昨日はプッシュ通知のテストはしていません。

状況

SwiftUIを使って開発しています。
GitHubリポジトリ

認証キー(p8)を使用しています。

FCMのコンソールから通知を作成してみましたが、届きませんでした。(テストの段階では届いていました)

調べていたところ下のような質問を発見しました。
FCMでiOSアプリにPush通知が来ない

調べているうちに、「FireBaseの対応が追い付かず、リリース直後はCloudMessagingが動作しない事がある」との記述を見つけ、しばらく放置しました。先日、FireBaseから試験通知を行ったところ、無事アプリで受け取ることができました

上の記述は、他のページで発見することができませんでした。

試したこと

curlで通知を叩いて結果を調べてみる

zsh

curl -X POST --header "Authorization: key=<FCMのコンソールにあるサーバキー>" \ --Header "Content-Type: application/json" \ https://fcm.googleapis.com/fcm/send \ -d @- << EOF { "to": "<通知をおくりたいFCM Token>", "notification": { "body": "お知らせテスト" }, "priority":10, "mutable_content":true } EOF # 結果 {"multicast_id":***********,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"**********"}]}

デバイストークンが誤っている、登録されていない場合はエラーレスポンスコードが返ってきます。
デバイストークンが登録されていない、サーバーキーが誤っている等の理由ではなさそうです。

公式リファレンス

AppDelegate

AppDelegateのコードを載せておきます。

swift

import SwiftUI import Firebase import PartialSheet import FirebaseMessaging import UserNotifications import GoogleMobileAds @main struct StudyLevel_App: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate let sheetManager: PartialSheetManager = PartialSheetManager() let levelUpViewModel = LevelUpViewModel() var body: some Scene { WindowGroup { ContentView() .environmentObject(sheetManager) .environmentObject(levelUpViewModel) } } } class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { FirebaseApp.configure() GADMobileAds.sharedInstance().start(completionHandler: nil) Messaging.messaging().delegate = self if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] center.requestAuthorization(options: authOptions) { granted, error in guard granted else { return } DispatchQueue.main.async { application.registerForRemoteNotifications() } } } else { let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(settings) } application.registerForRemoteNotifications() return true } func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { print("Firebase registration token: (String(describing: fcmToken))") DeviceRegister().register(token: fcmToken) } func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) } func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { // Called when the user discards a scene session. // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { // Print message ID. if let messageID = userInfo["gcm.message_id"] { print("Message ID: (messageID)") } // Print full message. print(userInfo) } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // Print message ID. if let messageID = userInfo["gcm.message_id"] { print("Message ID: (messageID)") } // Print full message. print(userInfo) completionHandler(UIBackgroundFetchResult.newData) } } @available(iOS 10, *) extension AppDelegate : UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo if let messageID = userInfo["gcm.message_id"] { print("Message ID: (messageID)") } print(userInfo) completionHandler([.list, .banner, .sound, .badge]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo if let messageID = userInfo["gcm.message_id"] { print("Message ID: (messageID)") } print(userInfo) completionHandler() } } extension Color { static let backgroundGray = Color("backgroundGray") }

xcodeのログ

xcode

StudyLevel_(12483,0x103e4b8c0) malloc: recording malloc and VM allocation stacks using lite mode 2021-01-04 20:46:46.322285+0900 StudyLevel_[12483:7352109] 7.3.0 - [Firebase/Analytics][I-ACS023007] Analytics v.7.3.0 started 2021-01-04 20:46:46.322600+0900 StudyLevel_[12483:7352109] 7.3.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r) 2021-01-04 20:46:46.330274+0900 StudyLevel_[12483:7352113] 7.3.0 - [Firebase/Messaging][I-FCM001000] FIRMessaging Remote Notifications proxy enabled, will swizzle remote notification receiver handlers. If you'd prefer to manually integrate Firebase Messaging, add "FirebaseAppDelegateProxyEnabled" to your Info.plist, and set it to NO. Follow the instructions at: https://firebase.google.com/docs/cloud-messaging/ios/client#method_swizzling_in_firebase_messaging to ensure proper integration. 2021-01-04 20:46:46.654976+0900 StudyLevel_[12483:7352102] 7.3.0 - [Firebase/Analytics][I-ACS800023] No pending snapshot to activate. SDK name: app_measurement 2021-01-04 20:46:46.667848+0900 StudyLevel_[12483:7352109] 7.3.0 - [Firebase/Analytics][I-ACS023012] Analytics collection enabled 2021-01-04 20:46:46.668168+0900 StudyLevel_[12483:7352109] 7.3.0 - [Firebase/Analytics][I-ACS023220] Analytics screen reporting is enabled. Call +[FIRAnalytics logEventWithName:FIREventScreenView parameters:] to log a screen view event. To disable automatic screen reporting, set the flag FirebaseAutomaticScreenReportingEnabled to NO (boolean) in the Info.plist 2021-01-04 20:46:48.385282+0900 StudyLevel_[12483:7351951] <Google> To get test ads on this device, set: GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"bae7a10619e47a268758cd60b2f2643e" ]; 2021-01-04 20:46:48.387143+0900 StudyLevel_[12483:7352102] 7.3.0 - [Firebase/Analytics][I-ACS025026] Deferring to Firebase for event data collection 2021-01-04 20:46:49.797186+0900 StudyLevel_[12483:7351951] WF: === Starting WebFilter logging for process StudyLevel_ 2021-01-04 20:46:49.797361+0900 StudyLevel_[12483:7351951] WF: _userSettingsForUser mobile: { filterBlacklist = ( ); filterWhitelist = ( ); restrictWeb = 1; useContentFilter = 0; useContentFilterOverrides = 0; whitelistEnabled = 0; } 2021-01-04 20:46:49.797637+0900 StudyLevel_[12483:7351951] WF: _WebFilterIsActive returning: NO 2021-01-04 20:46:52.192272+0900 StudyLevel_[12483:7351951] [TraitCollection] Class CKBrowserSwitcherViewController overrides the -traitCollection getter, which is not supported. If you're trying to override traits, you must use the appropriate API.

バージョン

  • swift 5.3.1
  • Xcode 12.2
  • iOS 14.0

実機は、iOS14.2のiPhone11です。
他の端末も使用してテストしてみましたが、うまくいきませんでした。

補足

このあたりを調べると良い、この情報が欲しいなどのコメントがありましたらよろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

thyda.eiqau

2021/01/03 18:14

デバッグビルド (Xcodeからの実機ビルド) とストア版とで両方通知が届かないのですか?
nyantaroo

2021/01/04 00:46

両方届かないです。
thyda.eiqau

2021/01/04 14:12

届かないというのは画面に出ない(バナー等が出ない)という意味か、didReceiveRemoteNotificationの中を通っていない = print(userInfo)などが実行されていないという意味か、どちらですか?
nyantaroo

2021/01/05 00:36

画面に表示されないですし、didReceiveRemoteNotificationも呼ばれていないという状況です。
thyda.eiqau

2021/01/05 02:38

うーん、不思議ですね…… <通知をおくりたいFCM Token>と実機のトークンが一致していることは確かですか?didRefreshRegistrationTokenは実装されていないようですがトークンが更新されている可能性はないですかね?
nyantaroo

2021/01/05 03:49 編集

https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja#monitor-token-refresh 上記URLのコード例のように、didReceiveRegistrationTokenを実装してトークンを確認しているので問題ないと思います。 func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { print("Firebase registration token: \(fcmToken)") } ↑のようにdidRefreshRegistrationTokenを実装して、ブレイクポイントを設定した状態でアプリを再インストールしてみましたが、呼び出されていないようでした。 ※公式リファレンスを確認した結果、didRefreshRegistrationTokenは削除され、didReceiveRegistrationTokenを使用するようになったようです。 https://firebase.google.com/support/release-notes/ios?q=didRefreshRegistrationToken#fcm_38
thyda.eiqau

2021/01/05 03:35

おっと、deprecatedどころかremovedとは……古い情報で失礼しました。 「<通知をおくりたいFCM Token>と実機のトークンが一致していることは確かですか?」についても引き続きお願いします。
nyantaroo

2021/01/05 03:50

Xcodeの実機デバックの際に、didReceiveRegistrationTokenが返すトークンを確認しているので、実機のトークンと一致していると思われます。 Firebaseのコンソールで全体に向けて通知を送信してみましたが、それでもとどきませんでした。
nyantaroo

2021/01/05 12:23

認証キーを用いてるので、開発環境と本番環境の区別はないはずです。 ↓認証キーと証明書の比較記事 https://takamii.hatenablog.com/entry/2020/07/13/190027 ちなみに証明書を使用する方法も試してみましたが、うまくいきませんでした。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

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

Swift

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