Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 应用程序状态和推送通知_Swift_Notifications_Push Notification_Swift2 - Fatal编程技术网

Swift 应用程序状态和推送通知

Swift 应用程序状态和推送通知,swift,notifications,push-notification,swift2,Swift,Notifications,Push Notification,Swift2,我有一个服务器,可以成功生成推送通知并将其发送到设备。在应用程序端,如果用户已经在应用程序中,或者如果用户从通知进入应用程序,我可以轻松地“找到”通知并运行必要的代码来操作通知(调用应用程序委托,并将通知存储在NSUserDefaults中,然后我可以在整个应用程序中访问该通知) 但是,如果用户在后台运行应用程序(例如,用户在应用程序中,但随后切换到另一个应用程序),当用户从应用程序图标重新打开应用程序时,应用程序只会返回到它所处的上一个状态,并且不会实际调用任何代码(这是您所期望的) 我试图弄

我有一个服务器,可以成功生成推送通知并将其发送到设备。在应用程序端,如果用户已经在应用程序中,或者如果用户从通知进入应用程序,我可以轻松地“找到”通知并运行必要的代码来操作通知(调用应用程序委托,并将通知存储在NSUserDefaults中,然后我可以在整个应用程序中访问该通知)

但是,如果用户在后台运行应用程序(例如,用户在应用程序中,但随后切换到另一个应用程序),当用户从应用程序图标重新打开应用程序时,应用程序只会返回到它所处的上一个状态,并且不会实际调用任何代码(这是您所期望的)

我试图弄清楚的是,如何再次调用AppDelegate以便在返回当前状态之前提取通知,或者如何调用某些代码以便截获通知


想法?

如果我正确理解了您的问题,您希望在退出后台状态时得到通知。如何使用appdelegate方法

func applicationDidBecomeActive(application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
这是我的解决办法

  • 在“应用程序恢复”中,在AppDelegate中,我检查徽章并在徽章值大于0时存储推送:

    func applicationDidBecomeActive(application: UIApplication) {            
            let installation = PFInstallation.currentInstallation()
        if installation.badge != 0 {
    
            NSUserDefaults.standardUserDefaults().setObject(true, forKey: "push")
    
            NSNotificationCenter.defaultCenter().postNotificationName("indicatePush", object: nil)
    
            installation.badge = 0
    
            installation.saveEventually()
        }}
    
    对NSNotificationCenter的调用调用基类中的一个已注册方法,我在基类中将push变量设置为
    true

  • 在子类中,在
    viewDidLoad
    上,我注册了两个方法(您可能只需要其中一个):

    NSNotificationCenter.defaultCenter().addObserver(self,选择器:“AppApplicationsActive:”,名称:UIApplicationIDBecMeactiveNotification,对象:nil) NSNotificationCenter.defaultCenter().addObserver(self,选择器:“ApplicationEntedForeGround:”,名称:UIApplicationWillEnterForegroundNotification,对象:nil)

  • 将对“从服务器拉入”的调用添加到两个方法之一。就我而言:

    func appplicationIsActive (notification: NSNotification){
        refresh()    
    }
    

  • 你完了

    有点。情况如下:用户在收到通知后启动了应用程序。由于应用程序已有效恢复,因此不会调用AppDelegate。由于未被调用,因此不会调用DidReceiveEmoteNotification,因此会忽略通知。那么,如果用户只是简单地恢复应用程序,我将如何拦截通知呢?让我重新表述一下:应用程序委托是通过ApplicationIDBecomeActive调用的。我可以并且确实检查“徽章号码”。如果它不是零,我在NSUserDefaults中设置通知指示器。但是,在此之后,当应用程序实际恢复时,视图已处于活动状态(viewDidLoad不运行)。因此,检查“通知”的代码不会被调用。在ViewWillApearMean中调用它如何,而不是说viewWillAppear(每次加载视图时都应该调用它)。实际上没有调用视图方法…应用程序只打开视图。毕竟,它是/正在后台运行,所以它“已经出现”你说“当用户从应用图标重新打开应用程序时,应用程序只会返回到它所处的最后一个状态,实际上没有调用任何代码”,并且当你从后台改为活动状态时,会调用yes ViewWillAppeal