为什么不能处理APNS推送通知和本地通知?

时间:2016-08-02 06:12:51

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

我正在处理推送通知和本地通知,但前台通知工作正常,但在这种情况下终止应用程序时,我无法在点击通知时重定向特定视图。

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

         // Check if launched from notification
        // 1
        if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
            // 2
            let aps = notification["aps"] as! [String: AnyObject]
            //Redirect to notification view
            handlePushMessage(aps)
        }else if let notification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? [String: AnyObject] {
            // 2
            self.postData = notification["aps"] as! [String: AnyObject]
            //Redirect to notification view
            didTapNotification()
        }else{
            //Session
            //Redirect to Main view
            checkUserSession()
        }
   return true
}

当应用程序处于非活动状态或终止时,我正面临着来自APNS通知和本地通知的问题。请帮助我找到解决方案。

3 个答案:

答案 0 :(得分:0)

您如何尝试didReceiveRemoteNotification功能?

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
     if(application.applicationState == UIApplicationStateBackground){



     }else if(application.applicationState == UIApplicationStateInactive){



     }
}

答案 1 :(得分:0)

  

尝试此代码,您可以根据您的要求进行修改。如果你有任何问题理解这个逻辑让我知道。 didReceiveRemoteNotification with completionHandler在后台和前台都可以使用。不要忘记在plist中进行适当的更改以支持后台提取和后台通知。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)

    if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
        notificationDataDict = notification;
    }


    return true
}
func handleRemoteNotificationWithUserInfo(application:UIApplication, userInfo:NSDictionary){

}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    print(userInfo)

    if application.applicationState != .Inactive{

        notificationDataDict = userInfo;

        if let navigationController = self.window?.rootViewController as? UINavigationController{


            if application.applicationState == .Active{

                if application.backgroundRefreshStatus == .Available{

                    completionHandler(.NewData)

                    self.handleRemoteNotificationWithUserInfo(application, userInfo: userInfo)


                }
                else
                {
                    completionHandler(.NoData)
                }
            }
            else{
                completionHandler(.NewData)

                self.handleRemoteNotificationWithUserInfo(application, userInfo: userInfo)
            }

        }


    }
}

答案 2 :(得分:0)

最后,我得到了管理APNS推送通知和本地通知的解决方案,现在工作正常。

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

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

    //Register here For Notification

    if #available(iOS 9, *) {

        let notificationTypes: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound]
        let pushNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)
        application.registerUserNotificationSettings(pushNotificationSettings)
        application.registerForRemoteNotifications()

    }else{

        UIApplication.sharedApplication().registerUserNotificationSettings(
            UIUserNotificationSettings(forTypes: .Alert, categories: nil))
        application.registerForRemoteNotifications()
    }

dispatch_async(dispatch_get_main_queue()) {
        // Check if launched from notification
        // 1
        if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
            // 2
            let aps = notification["aps"] as! [String: AnyObject]
            handlePushMessage(aps)
        }else if let notification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
            // 2
            self.postData = notification.userInfo as! [String: AnyObject]
            didTapNotification()
        }else{
            //Session
            checkUserSession()
        }
      }

}