在推送通知上加载特定的viewController Swift 2 AppDelegate

时间:2016-01-08 10:44:56

标签: ios iphone swift push-notification appdelegate

我想打开一个特定的视图控制器(一个隐藏的视图控制器,因为它只能在接收到某个推送通知时才能访问(它不能通过标签栏访问))并且我已经能够做到这一点,但我遇到了问题..

我的应用有一个名为RootViewController的自定义标签栏控制器。当您点击具有特殊值的通知时,它会显示一个警告视图,询问用户是否要打开通知。

通知会触发将特定视图控制器置于前端但是 问题是我不能再访问标签栏了。

我不知道如何实现这一目标。

这是AppDelegate.m中的代码:

var presentedVC = self.window?.rootViewController as? UINavigationController
while (presentedVC!.navigationController != nil)  {
    presentedVC = presentedVC!.navigationController
}
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationViewController = storyboard.instantiateViewControllerWithIdentifier("PushNotificationView") as? NotTestViewController

destinationViewController?.url = self.url!
presentedVC?.presentViewController(destinationViewController!, animated: true, completion: nil)

})
)
alertCtrl.addAction(UIAlertAction(title: "Cancelar", style: .Destructive, handler: nil))

此代码有效,但与所需行为无关。

我缺少什么想法?

非常感谢

修改

我已将RAMTabBarAnimationController更改为TabBarController,因为RAMTabBarAnimationController未从TabBarController继承。但我仍然看到同样的行为。

2 个答案:

答案 0 :(得分:4)

我想回答我自己的问题,因为我想也许有人面临同样的情况,我要感谢@Muneeba

嗯,首先你必须知道你的远程推送通知是否需要进行后台提取,这很重要,因为如果是这样的话didReceiveRemoteNotification被调用两次(首先点击通知提醒时,秒当它打开应用程序时,所以你必须意识到这一点。

在我的情况下,我没有进行后台获取,因此我的content-available:false标志设置为false。

接下来要做的是向通知有效负载添加您的期望["key":value],以了解您是否要打开特定的视图控制器。

管理是否打开视图控制器。

在我的应用程序中,我想打开一个警告控件弹出窗口,始终显示推送通知的正文(使用“确定”按钮),并且只有在设置了某个值时才会向用户打开一个警告控件并向用户询问是否想要打开到达的新内容(通常此内容是基于Web的内容,打开嵌入在视图控制器中的Web视图)

didReceiveRemoteNotification

if let mensaje = userInfo["m"] as? String {
// Here is where I know if the value is set in the notification payload
 let alertCtrl = UIAlertController(title: titulo, message: mensaje as String, preferredStyle: UIAlertControllerStyle.Alert)
 if url == nil {
   alertCtrl.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
 } else {
 alertCtrl.addAction(UIAlertAction(title: "Ver receta", style: .Default, handler: {
  action in

      let storyboard = UIStoryboard(name: "Main", bundle: nil)
      //self.window?.rootViewController = storyboard.instantiateViewControllerWithIdentifier("TabbedController") as! UITabBarController
      let navigationController = storyboard.instantiateViewControllerWithIdentifier("pushNotificationNavigation") as! UINavigationController
      let dVC:NotTestViewController = navigationController.topViewController as! NotTestViewController
      // This is for passing the URL to the view Controller
      dVC.url = self.url!
      self.window?.rootViewController?.presentViewController(navigationController, animated: true, completion: {})

      })
      )
      alertCtrl.addAction(UIAlertAction(title: "Cancelar", style: .Destructive, handler: nil))
   }
   // Find the presented VC...
   var presentedVC = self.window?.rootViewController
   while (presentedVC!.presentedViewController != nil)  {
      presentedVC = presentedVC!.presentedViewController
      }
      presentedVC!.presentViewController(alertCtrl, animated: true, completion: nil)

      handler(UIBackgroundFetchResult.NoData)
 }

答案 1 :(得分:0)

你的RAMAnimatedTabBarController继承了哪个班级?如果它继承UIViewController / UITabbarController,则取UINavigationController并将其rootViewController设置为RAMAnimatedTabBarController实例,然后将其指定为窗口的rootViewController并设置{{ 1}}为此navigationBar隐藏,当您想推送到特定的控制器时,请执行此操作

UINavigationController