AppStoreにアプリが公開されてからPush通知が届かなくなりました。(正確なタイミングは不明、リリースが原因かも不明)
本番環境だけでなく、開発環境でも届かなくなりました。
公開される2日前までは、開発環境での実機シミューレートやTestFlightでのテストで、問題なく通知は届いていました。
公開されたのは昨日です。昨日はプッシュ通知のテストはしていません。
状況
SwiftUIを使って開発しています。
GitHubリポジトリ
認証キー(p8)を使用しています。
FCMのコンソールから通知を作成してみましたが、届きませんでした。(テストの段階では届いていました)
調べていたところ下のような質問を発見しました。
FCMでiOSアプリにPush通知が来ない
調べているうちに、「FireBaseの対応が追い付かず、リリース直後はCloudMessagingが動作しない事がある」との記述を見つけ、しばらく放置しました。先日、FireBaseから試験通知を行ったところ、無事アプリで受け取ることができました
上の記述は、他のページで発見することができませんでした。
試したこと
curlで通知を叩いて結果を調べてみる
zsh
1curl -X POST --header "Authorization: key=<FCMのコンソールにあるサーバキー>" \ 2--Header "Content-Type: application/json" \ 3https://fcm.googleapis.com/fcm/send \ 4-d @- << EOF 5{ 6 "to": "<通知をおくりたいFCM Token>", 7 "notification": { 8 "body": "お知らせテスト" 9 }, 10 "priority":10, 11 "mutable_content":true 12} 13EOF 14 15# 結果 16{"multicast_id":***********,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"**********"}]}
デバイストークンが誤っている、登録されていない場合はエラーレスポンスコードが返ってきます。
デバイストークンが登録されていない、サーバーキーが誤っている等の理由ではなさそうです。
AppDelegate
AppDelegateのコードを載せておきます。
swift
1 2import SwiftUI 3import Firebase 4import PartialSheet 5import FirebaseMessaging 6import UserNotifications 7import GoogleMobileAds 8 9@main 10struct StudyLevel_App: App { 11 @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate 12 let sheetManager: PartialSheetManager = PartialSheetManager() 13 let levelUpViewModel = LevelUpViewModel() 14 15 var body: some Scene { 16 WindowGroup { 17 ContentView() 18 .environmentObject(sheetManager) 19 .environmentObject(levelUpViewModel) 20 } 21 } 22} 23 24class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate { 25 26 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { 27 FirebaseApp.configure() 28 GADMobileAds.sharedInstance().start(completionHandler: nil) 29 Messaging.messaging().delegate = self 30 if #available(iOS 10.0, *) { 31 let center = UNUserNotificationCenter.current() 32 center.delegate = self 33 34 let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] 35 center.requestAuthorization(options: authOptions) { granted, error in 36 guard granted else { return } 37 38 DispatchQueue.main.async { 39 application.registerForRemoteNotifications() 40 } 41 } 42 } else { 43 let settings: UIUserNotificationSettings = 44 UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 45 application.registerUserNotificationSettings(settings) 46 } 47 48 application.registerForRemoteNotifications() 49 50 return true 51 } 52 53 func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { 54 print("Firebase registration token: (String(describing: fcmToken))") 55 DeviceRegister().register(token: fcmToken) 56 } 57 58 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 59 // Called when a new scene session is being created. 60 // Use this method to select a configuration to create the new scene with. 61 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 62 } 63 64 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { 65 // Called when the user discards a scene session. 66 // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 67 // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 68 } 69 70 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { 71 // Print message ID. 72 if let messageID = userInfo["gcm.message_id"] { 73 print("Message ID: (messageID)") 74 } 75 76 // Print full message. 77 print(userInfo) 78 } 79 80 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], 81 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 82 // Print message ID. 83 if let messageID = userInfo["gcm.message_id"] { 84 print("Message ID: (messageID)") 85 } 86 87 // Print full message. 88 print(userInfo) 89 90 completionHandler(UIBackgroundFetchResult.newData) 91 } 92} 93 94@available(iOS 10, *) 95extension AppDelegate : UNUserNotificationCenterDelegate { 96 97 func userNotificationCenter(_ center: UNUserNotificationCenter, 98 willPresent notification: UNNotification, 99 withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 100 let userInfo = notification.request.content.userInfo 101 102 if let messageID = userInfo["gcm.message_id"] { 103 print("Message ID: (messageID)") 104 } 105 106 print(userInfo) 107 108 completionHandler([.list, .banner, .sound, .badge]) 109 } 110 111 func userNotificationCenter(_ center: UNUserNotificationCenter, 112 didReceive response: UNNotificationResponse, 113 withCompletionHandler completionHandler: @escaping () -> Void) { 114 let userInfo = response.notification.request.content.userInfo 115 if let messageID = userInfo["gcm.message_id"] { 116 print("Message ID: (messageID)") 117 } 118 119 print(userInfo) 120 121 completionHandler() 122 } 123} 124 125extension Color { 126 static let backgroundGray = Color("backgroundGray") 127} 128
xcodeのログ
xcode
1StudyLevel_(12483,0x103e4b8c0) malloc: recording malloc and VM allocation stacks using lite mode 22021-01-04 20:46:46.322285+0900 StudyLevel_[12483:7352109] 7.3.0 - [Firebase/Analytics][I-ACS023007] Analytics v.7.3.0 started 32021-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) 42021-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: 5https://firebase.google.com/docs/cloud-messaging/ios/client#method_swizzling_in_firebase_messaging 6to ensure proper integration. 72021-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 82021-01-04 20:46:46.667848+0900 StudyLevel_[12483:7352109] 7.3.0 - [Firebase/Analytics][I-ACS023012] Analytics collection enabled 92021-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 102021-01-04 20:46:48.385282+0900 StudyLevel_[12483:7351951] <Google> To get test ads on this device, set: GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"bae7a10619e47a268758cd60b2f2643e" ]; 112021-01-04 20:46:48.387143+0900 StudyLevel_[12483:7352102] 7.3.0 - [Firebase/Analytics][I-ACS025026] Deferring to Firebase for event data collection 122021-01-04 20:46:49.797186+0900 StudyLevel_[12483:7351951] WF: === Starting WebFilter logging for process StudyLevel_ 132021-01-04 20:46:49.797361+0900 StudyLevel_[12483:7351951] WF: _userSettingsForUser mobile: { 14 filterBlacklist = ( 15 ); 16 filterWhitelist = ( 17 ); 18 restrictWeb = 1; 19 useContentFilter = 0; 20 useContentFilterOverrides = 0; 21 whitelistEnabled = 0; 22} 232021-01-04 20:46:49.797637+0900 StudyLevel_[12483:7351951] WF: _WebFilterIsActive returning: NO 242021-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です。
他の端末も使用してテストしてみましたが、うまくいきませんでした。
補足
このあたりを調べると良い、この情報が欲しいなどのコメントがありましたらよろしくお願いします。