IOS应用程序赢得';t在后台显示推送通知。敏捷的

IOS应用程序赢得';t在后台显示推送通知。敏捷的,ios,iphone,swift,background,apple-push-notifications,Ios,Iphone,Swift,Background,Apple Push Notifications,好吧,当应用程序在前台运行时,我的推送通知就像一个魔咒。但当我进入后台时,应用程序从未收到推送通知。这就像通知被置若罔闻一样。 这就是发生的事情。当应用程序首次启动时,我可以收到通知。当我关闭并重新打开应用程序时,我会收到通知。但当应用程序在后台关闭时,我无法收到通知。当应用程序进入后台时,当应用程序处于活动状态时,我会打印出来,这样我就知道它不会关闭。因为它的打印会进入后台,所以它应该运行。 这就是我为app deligate课程准备的内容: func application(applica

好吧,当应用程序在前台运行时,我的推送通知就像一个魔咒。但当我进入后台时,应用程序从未收到推送通知。这就像通知被置若罔闻一样。 这就是发生的事情。当应用程序首次启动时,我可以收到通知。当我关闭并重新打开应用程序时,我会收到通知。但当应用程序在后台关闭时,我无法收到通知。当应用程序进入后台时,当应用程序处于活动状态时,我会打印出来,这样我就知道它不会关闭。因为它的打印会进入后台,所以它应该运行。 这就是我为app deligate课程准备的内容:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

 //OTHER THINGS
   //Open the Push note page
    if launchOptions != nil
    {
        print(launchOptions)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier(myPage)
        self.window?.rootViewController = vc
    }

    //handel push note if app is closed
    //Sends it to the regular handler for push notifcaiton
    //didrecivepushnotificaiton
    if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary
    {
        print("Got A Push Note when I was closed")
        self.application(application, didReceiveRemoteNotification: remoteNotification as [NSObject : AnyObject])
    }

 }

  func application( application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken
    deviceToken: NSData ) {
    print("DEVICE TOKEN = \(deviceToken)")

    //convert the device token into a string
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var token = ""

    for i in 0..<deviceToken.length {
        token += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }
    print("token: " + token)
    //store the user device token for apns push notification
    loginInformation.setObject(token, forKey: "token")
    self.loginInformation.synchronize()

}

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

    print("Recived Push Notificaion")

    var myMess :String = ""
    var url : String = ""
    var myTitle : String = ""

    if var alertDict = userInfo["aps"] as? Dictionary<String, String> {

        print("Alert Dict")
        print(alertDict)

        url = alertDict["url"]!
        myMess = alertDict["alert"]!
        myTitle = alertDict["mytitle"]!
        //store the url for the push control view
        loginInformation.setObject(url, forKey: "URL")
        loginInformation.setObject(myMess, forKey: "Message")
        loginInformation.setObject(myTitle, forKey: "Title")
        self.loginInformation.synchronize()


    }else{print("No go")}
    application.applicationIconBadgeNumber = 0
    //post notification.
    NSNotificationCenter.defaultCenter().postNotificationName("PushReceived", object: nil, userInfo: userInfo)


    if myTitle == ""
    {
        myTitle = “New Title“
    }
    if myMess == ""
    {
        myMess = “All Hail Gus“
    }

    let alert = UIAlertController(title: myTitle, message: myMess, preferredStyle: UIAlertControllerStyle.Alert)
    //Close Button
     alert.addAction(UIAlertAction(title: "次回", style: UIAlertActionStyle.Default, handler: nil))
     self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)


}

func registrationHandler(registrationToken: String!, error: NSError!) {

}

// [START receive_apns_token_error]
func application( application: UIApplication, didFailToRegisterForRemoteNotificationsWithError
    error: NSError ) {
    print(error)
}

要全面实施APNS服务,您必须处理三种情况:

  • 不活跃
  • 前景
  • 背景
  • 非活动模式应在
    didfishlaunchingwithoptions
    方法中处理

    //receive apns when app in inactive mode, remaining message hint display task could be sum up by the code in applicationwillenterforeground
        if let options = launchOptions {
            if options[UIApplicationLaunchOptionsRemoteNotificationKey] != nil {
                let userInfo: NSDictionary = options[UIApplicationLaunchOptionsRemoteNotificationKey] as! NSDictionary
                let apsInfo: NSDictionary = userInfo["aps"] as! NSDictionary
                //parse notification body message ...
    
                        NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_REMOTE_NOTIF, object: userInfo)
                        APService.handleRemoteNotification(userInfo as! [NSObject : AnyObject])
    
                        //Update badge number
    
                        let badgeIndex = apsInfo["badge"] as! Int
                        UIApplication.sharedApplication().applicationIconBadgeNumber = badgeIndex
                    }
                }
            } else if options[UIApplicationLaunchOptionsURLKey] != nil {
                if let url = launchOptions?[UIApplicationLaunchOptionsURLKey] as? NSURL {
                    print(url)
                }
            }
        }
    
    //receive apns when app in background mode
        let apsInfo: NSDictionary = userInfo["aps"] as! NSDictionary
        if UIApplication.sharedApplication().applicationState != UIApplicationState.Active{
    
            //TODO: temporary method, need further update
            //judge notification type
            if let _ = userInfo["inviterName"] as? String {
                //notification for group invite
            }else{
                //Update badge number
                if let badgeInt = apsInfo["badge"] as? Int {
                    UIApplication.sharedApplication().applicationIconBadgeNumber = badgeInt > 0 ? badgeInt: 1
                }else{
                    UIApplication.sharedApplication().applicationIconBadgeNumber = 1
                }
                //turn on trigger to enable message hint btn on recorder vc when it appear
                NSUserDefaults.standardUserDefaults().setBool(true, forKey: REMOTE_NOTIF_REMAINING)
            }
        }
       //receive apns when app in forground mode
        else{
            //TODO: temporary method, need further update
            //judge notification type
            if let _ = userInfo["inviterName"] as? String {
                //notification for group invite
                NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_GROUP_NOTIF, object:nil)
            }else{
                //notificate recorder vc to display message hint directly
                NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_REMOTE_NOTIF, object: userInfo)
            }
        }
        APService.handleRemoteNotification(userInfo)
        completionHandler(UIBackgroundFetchResult.NewData)
    
    其余两个案例应采用
    didReceiveMotonification
    方法处理

    //receive apns when app in inactive mode, remaining message hint display task could be sum up by the code in applicationwillenterforeground
        if let options = launchOptions {
            if options[UIApplicationLaunchOptionsRemoteNotificationKey] != nil {
                let userInfo: NSDictionary = options[UIApplicationLaunchOptionsRemoteNotificationKey] as! NSDictionary
                let apsInfo: NSDictionary = userInfo["aps"] as! NSDictionary
                //parse notification body message ...
    
                        NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_REMOTE_NOTIF, object: userInfo)
                        APService.handleRemoteNotification(userInfo as! [NSObject : AnyObject])
    
                        //Update badge number
    
                        let badgeIndex = apsInfo["badge"] as! Int
                        UIApplication.sharedApplication().applicationIconBadgeNumber = badgeIndex
                    }
                }
            } else if options[UIApplicationLaunchOptionsURLKey] != nil {
                if let url = launchOptions?[UIApplicationLaunchOptionsURLKey] as? NSURL {
                    print(url)
                }
            }
        }
    
    //receive apns when app in background mode
        let apsInfo: NSDictionary = userInfo["aps"] as! NSDictionary
        if UIApplication.sharedApplication().applicationState != UIApplicationState.Active{
    
            //TODO: temporary method, need further update
            //judge notification type
            if let _ = userInfo["inviterName"] as? String {
                //notification for group invite
            }else{
                //Update badge number
                if let badgeInt = apsInfo["badge"] as? Int {
                    UIApplication.sharedApplication().applicationIconBadgeNumber = badgeInt > 0 ? badgeInt: 1
                }else{
                    UIApplication.sharedApplication().applicationIconBadgeNumber = 1
                }
                //turn on trigger to enable message hint btn on recorder vc when it appear
                NSUserDefaults.standardUserDefaults().setBool(true, forKey: REMOTE_NOTIF_REMAINING)
            }
        }
       //receive apns when app in forground mode
        else{
            //TODO: temporary method, need further update
            //judge notification type
            if let _ = userInfo["inviterName"] as? String {
                //notification for group invite
                NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_GROUP_NOTIF, object:nil)
            }else{
                //notificate recorder vc to display message hint directly
                NSNotificationCenter.defaultCenter().postNotificationName(APP_NOTIF_RECEIVE_REMOTE_NOTIF, object: userInfo)
            }
        }
        APService.handleRemoteNotification(userInfo)
        completionHandler(UIBackgroundFetchResult.NewData)
    

    如果应用程序在后台并收到推送,你想显示警报吗?我想弹出一个小横幅,告诉他们这里有一些有趣的事情:)我不知道什么是无声推送通知。我刚结束本教程,添加了从iti中获取信息所需的内容我想你可能会混淆前台和后台,通常我们只在后台接收推送通知,它会忽略前台的通知。当应用程序在前台时,我会使用警报让用户知道有推送通知。我想我的已经这样做了。我有didReceiveRemotonification方法,它为用户提供了一个警报。有没有比我这样做更好的方法?似乎缺少背景案例处理程序。在
    didReceiveMemotentification
    方法中,您必须首先通过
    UIApplication.sharedApplication().applicationState
    属性检查应用程序状态。在
    ui应用程序状态.Active
    情况下,它的前景。如果没有,它的背景(在你的代码中缺失)。@ChenWei。如何将此userInfo[“aps”]标识为!NSDictionary@UmaMadhavi. 在iOS9之前的
    func应用程序(u应用程序:UIApplication,didReceiveMemotentification用户信息:[AnyHashable:Any]){让aps\u dic:NSDictionary=userInfo[“aps”]as!NSDictionary…}
    @UmaMadhavi。在iOS10中,
    didReceiveMemotentification
    方法已弃用,您应使用
    func用户通知中心(center:UnuseNotificationCenter,didReceive响应:UNNotificationResponse,withCompletionHandler:@escaping()->Void){let content:UNNotificationContent=response.notification.request.content let userInfo=content.userInfo}…