当用户使用 iOS 13 Swift 5 点击推送通知时,在特定视图中打开应用程序

Posted

技术标签:

【中文标题】当用户使用 iOS 13 Swift 5 点击推送通知时,在特定视图中打开应用程序【英文标题】:Open app in specific view when user taps on push notification with iOS 13 Swift 5 【发布时间】:2019-11-21 09:49:59 【问题描述】:

我的应用允许向用户远程推送通知。当用户点击推送通知时,如何在特定的视图控制器中打开它?我希望应用根据收到的推送通知打开并导航到特定的视图控制器。

【问题讨论】:

关注本教程fluffy.es/perform-action-notification-tap 【参考方案1】:

您必须使用“ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool :

中的启动选项检查您的应用何时处于关闭状态
 if let option = launchOptions 
    let info = option[UIApplication.LaunchOptionsKey.remoteNotification]
         if (info != nil) 
            self.goAnotherVC()
     

并且在视图中确实加载了你的登陆 VC 设置了观察者

 NotificationCenter.default.addObserver(self, selector: #selector(self.goToVc(notification:)), name:NSNotification.Name(rawValue:identifier), object: nil)

选择器方法:

 @objc func goToVc(notification:Notification) 
     let storyboard = UIStoryboard(name: "Main", bundle: nil)
     let vc = storyboard.instantiateViewController(withIdentifier:"landingVC") as! landingVC
     self.navigationController?.pushViewController(vc, animated: true)  

在应用委托中:

func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any]) 
     NotificationCenter.default.post(name:NSNotification.Name(identifier), object: userInfo)
  

【讨论】:

【参考方案2】:

此答案适用于 ios 13+

在 AppDelegae 中:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 
   
        NotificationCenter.default.post(name: NSNotification.Name(identifier), object: nil)
        completionHandler()

viewDidLoad的登陆ViewController

override func viewDidLoad() 
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, selector: #selector(self.showChatController(notification:)), name:NSNotification.Name(rawValue: "noti"), object: nil)    

在你登陆viewController添加如下选择器方法:

@objc
func showChatController(notification: Notification) 
print("DEBUG: show chat controller here..")
        

【讨论】:

【参考方案3】:

您可以在收到通知并且用户点击通知后触发通知

与通知一起,您可以传递稍后用于识别您需要导航到哪个视图控制器的值。

创建一个负责所有推送通知导航处理的类。您可以将其命名为 PushNotificationHandler。让 PushNotificationHandler 处理程序负责导航到视图控制器的所有逻辑。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool  
 
使用上述委托方法从深层链接中获取值 使用值触发通知 在 PushNotificationHandler 类中处理通知

【讨论】:

如果用户已经启动应用并且应用正在后台运行,则不会调用上述方法。

以上是关于当用户使用 iOS 13 Swift 5 点击推送通知时,在特定视图中打开应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 2 将不允许 iOS 8 设备注册推送通知

当用户在 swift 中单击推送通知时打开自定义 url

当应用程序处于非活动状态并运行代码时,Swift iOS 应用程序会收到推送通知

Swift iOS 13 推送通知设备令牌在 javascript/php/typescript 中转换

iOS Swift 从推送通知以编程方式导航到某些 ViewController

当 ObservedObject 在其他类中发生更改时如何在 ContentView 中运行方法 [Swift 5 iOS 13.4]