IOS应用程序在后台时不会显示推送通知。迅速

时间:2016-08-31 08:30:39

标签: ios iphone swift background apple-push-notifications

好的,所以当应用程序在前台运行时,我的推送通知就像魅力一样。但是当我进入后台时,应用程序永远不会收到推送通知。就像通知一样充耳不闻。 所以这就是发生的事情。当应用程序首次启动时,我可以收到通知。当我关闭并重新打开应用程序时,我可以收到通知。但是当应用程序在后台关闭时,我无法收到通知。当应用程序进入后台并且当应用程序变为活动状态时我打印出来,所以我知道它不会关闭。因为它的印刷它会进入后台,所以应该运行。 所以这就是我为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)
}

我想我也有正确的设置。但我现在不太确定。推送通知确实有效,但我做了很多改动,并且暂时没有对它们进行测试。

enter image description here enter image description here enter image description here

这是有效载荷的一个例子

{"aps":{"alert":"Gus Message.","badge":"1", "url":"https://www.gus.com","mytitle":"Gus Title"}}

1 个答案:

答案 0 :(得分:2)

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

  1. 非活性
  2. 前景
  3. 背景
  4. 非活动模式应在<iframe src="https://docs.google.com/presentation/d/17nlO95lz91-shRep16UiJl-3EAxv-MnOFH718ku2gtw/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="749" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>方法

    中处理
    didFinishLaunchingWithOptions

    其余两个案例应该在//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) } } } 方法

    中处理
    didReceiveRemoteNotification