点击 FCM 推送通知时,如何在选项卡栏中打开特定的视图控制器?
How do I open a particular view controller in a tab bar when a FCM push notification is tapped?
每当我在应用程序关闭时点击推送通知,应用程序总是崩溃。如果它在后台或在我点击推送通知时打开,那么它就可以正常加载。
我试过这里的建议:
下面是app delegate中的相关函数。没有注册任何用于确定崩溃确切位置的打印功能,因此我无法正确调试。我看到的唯一消息是:
Message from debugger: Terminated due to signal 9
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Navigation customization
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(hex: Constants.Colors.primary)!, NSAttributedString.Key.font: UIFont(name: "NexaLight", size: 18)!], for: UIControl.State.normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(hex: Constants.Colors.primary)!, NSAttributedString.Key.font : UIFont(name: "NexaBold", size: 18)! ], for: .highlighted)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(hex: Constants.Colors.secondary)!, NSAttributedString.Key.font : UIFont(name: "NexaBold", size: 18)! ], for: .focused)
ApplicationDelegate.shared.application( application, didFinishLaunchingWithOptions: launchOptions )
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
}
// Firebase
FirebaseApp.configure()
// APN FCM
Messaging.messaging().delegate = self
// Stripe
StripeAPI.defaultPublishableKey = "test"
// Google sign-in
GIDSignIn.sharedInstance()?.clientID = "test"
return true
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if let window = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window {
guard let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else { return }
if let tabBarController = rootViewController as? MainTabBarController {
tabBarController.selectedIndex = 1
window.rootViewController = tabBarController
window.makeKeyAndVisible()
}
}
completionHandler()
}
这是我解释的代码
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if let window = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window {
if let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController {
if let tabBarController = rootViewController as? MainTabBarController {
tabBarController.selectedIndex = 1
window.rootViewController = tabBarController
window.makeKeyAndVisible()
}
} else {
let tabBarController = UIStoryboard(name: "main", bundle: .main).instantiateViewController(identifier: "MainTabBarController") as? MainTabBarController
tabBarController.selectedIndex = 1
window.rootViewController = tabBarController
window.makeKeyAndVisible()
}
}
completionHandler()
}
每当我在应用程序关闭时点击推送通知,应用程序总是崩溃。如果它在后台或在我点击推送通知时打开,那么它就可以正常加载。
我试过这里的建议:
下面是app delegate中的相关函数。没有注册任何用于确定崩溃确切位置的打印功能,因此我无法正确调试。我看到的唯一消息是:
Message from debugger: Terminated due to signal 9
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Navigation customization
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(hex: Constants.Colors.primary)!, NSAttributedString.Key.font: UIFont(name: "NexaLight", size: 18)!], for: UIControl.State.normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(hex: Constants.Colors.primary)!, NSAttributedString.Key.font : UIFont(name: "NexaBold", size: 18)! ], for: .highlighted)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(hex: Constants.Colors.secondary)!, NSAttributedString.Key.font : UIFont(name: "NexaBold", size: 18)! ], for: .focused)
ApplicationDelegate.shared.application( application, didFinishLaunchingWithOptions: launchOptions )
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
}
// Firebase
FirebaseApp.configure()
// APN FCM
Messaging.messaging().delegate = self
// Stripe
StripeAPI.defaultPublishableKey = "test"
// Google sign-in
GIDSignIn.sharedInstance()?.clientID = "test"
return true
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if let window = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window {
guard let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else { return }
if let tabBarController = rootViewController as? MainTabBarController {
tabBarController.selectedIndex = 1
window.rootViewController = tabBarController
window.makeKeyAndVisible()
}
}
completionHandler()
}
这是我解释的代码
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if let window = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window {
if let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController {
if let tabBarController = rootViewController as? MainTabBarController {
tabBarController.selectedIndex = 1
window.rootViewController = tabBarController
window.makeKeyAndVisible()
}
} else {
let tabBarController = UIStoryboard(name: "main", bundle: .main).instantiateViewController(identifier: "MainTabBarController") as? MainTabBarController
tabBarController.selectedIndex = 1
window.rootViewController = tabBarController
window.makeKeyAndVisible()
}
}
completionHandler()
}