【问题标题】:How to handle receiving remote push notifications properly如何正确处理接收远程推送通知
【发布时间】:2015-12-23 10:54:07
【问题描述】:

我有一个关于如何处理传入推送通知的问题。如您所知,一个应用程序可以有很多视图。接收时,我想例如显示警报或在用户所在的视图上做其他事情(因为我真的不知道用户在收到通知时将在哪个视图中)。现在,如果每个视图都代表一个 swift 文件,那么我是否需要在每个 swift 文件中实现相同的代码来处理传入的推送通知,或者我猜有更好的设计或技术来解决这个问题?

我已经搜索了一段时间,我只能找到当应用程序在后台而不是前台时遇到问题的人:/

任何东西都会很好,教程、指南、代码示例。如果可能的话,有很多方法可以解决这个问题,这样我就可以研究它们并选择最适合我的方法。

【问题讨论】:

  • 不,为通知设置一个监听器,或者只使用 appDelegate,然后只呈现一个覆盖视图或做任何你想做的事情 - 如果每个视图都必须做不同的事情,你可以创建一个协议来每当通知到达时,视图符合并调用协议方法
  • 但是在 appDelegate @luk2302 中处理任何需要做的事情是否被视为“良好的编码”?
  • 取决于您想要实现的目标。让 appDelegate 成为入口点并尝试尽早委托功能,但尽量避免让每个视图都订阅通知本身。
  • 但我的用户在收到通知时可能处于任何视图中?我仍然需要订阅每个视图,对吗? @luk2302
  • 没有。使所有想要接收通知的视图都符合一个自创协议,该协议定义了某种函数receivedNotification。然后检查 appDelegate 当前视图是否符合协议。如果是则调用该方法,否则做一些不同的事情

标签: ios swift push-notification push


【解决方案1】:

希望这会有所帮助:

收到通知时找到可见的视图控制器。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    let currentViewControlelr :UIViewController = topViewController(UIApplication.sharedApplication().keyWindow?.rootViewController)!;

    if(currentViewControlelr == YourViewController()){

        //Display Alert 
        let alert = UIAlertView()
        alert.title = "Alert"
        alert.message = "Here's a message"
        alert.addButtonWithTitle("Understod")
        alert.show()

        //Implement other function according to your needs
    }

    NSLog("UserInfo : %@",userInfo);
    }

获取当前可见的Top ViewController的Helper方法

func topViewController(base: UIViewController? ) -> UIViewController? {
    if let nav = base as? UINavigationController {
        return topViewController(nav.visibleViewController)
    }
    if let tab = base as? UITabBarController {
        if let selected = tab.selectedViewController {
            return topViewController(selected)
        }
    }
    if let presented = base?.presentedViewController {
        return topViewController(presented)

    }
    return base
    }

【讨论】:

  • 使用未解析的标识符“UserProfileController”和使用未解析的标识符“AlertView”
  • 您必须在 UserProfileViewController 的位置检查您的控制器名称并编写代码以显示警报。
  • 我现在迷路了。当我应该在“currentViewController”上显示警报时,为什么我们需要该 if 语句来检查 currentViewcontroller 是否为“MyViewController”?
  • 如果您想为所有控制器显示相同的消息,您可以将警报排除在 if 条件之外。如果您想根据控制器显示不同的消息,则必须在 if 条件下对其进行管理。
  • 我的应用程序将根据推送通知的内容显示不同的警报,以便我的情况不需要 if 语句,谢谢。但是,如果我想在 currentViewController 上显示它,我该怎么做。我正在尝试使用此代码:currentViewControlelr(alert,animated:true,completion:nil)但我收到此错误:无法调用非函数类型'UIViewController'的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多