当应用程序未运行时,Swift接收推送通知(Parse)

时间:2016-01-29 19:59:41

标签: ios swift parse-platform notifications push-notification

我正在使用Swift构建一个iOS应用程序,当有人提到我时,我希望接收推送通知(Parse)。

我使用导航控制器作为初始视图控制器,第一个视图控制器是登录视图控制器。在此视图控制器中有一个if语句,用于检查用户是否已登录。如果用户已登录,则应用程序会自动跳转到主屏幕。

如果登录成功,应用程序将跳转到主屏幕。

在以下情况下,我的通知正常:

  • 该应用正在运行
  • 该应用正在后台运行,当我点按通知栏时,应用会在通知屏幕上跳转

我的通知在以下情况下不起作用:

  • 应用程序在后台运行,当我点击带有徽章的图标(即1)时,它会显示主屏幕,而不是通知屏幕
  • 应用程序根本没有运行,我正在通过通知运行它。在这种情况下,应用程序堆叠在登录屏幕上,并且没有响应。我认为问题是因为它等待用户登录。

我不知道AppDelegate.swift文件中是否存在问题。我已经按照Parse文档以及Parse的Starter项目进行编码。

以下是AppDelegate.swift

中的方法

方法application: didFinishLaunchingWithOptions

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if let notificationPayload = launchOptions? [UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {
        let meetingId = notificationPayload["meetingId"] as? String
        let targetMeeting = PFObject(withoutDataWithClassName: "Meeting", objectId: meetingId)
        targetMeeting.fetchIfNeededInBackgroundWithBlock({ (object, error) -> Void in
            if error == nil {
                let meetingToRespond = Meeting(id: targetMeeting.objectId!, name: targetMeeting["name"] as! String, location: CLLocationCoordinate2DMake((targetMeeting["location"]?.latitude)!, (targetMeeting["location"]?.longitude)!), day: targetMeeting["dayTime"] as! NSDate)
                var rootViewController = self.window?.rootViewController as! UINavigationController
                let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let notificationScreen = mainStoryboard.instantiateViewControllerWithIdentifier("screenForNotification") as! MeetingToRespondViewController
                notificationScreen.meeting = meetingToRespond
                rootViewController.pushViewController(notificationScreen, animated: true)
            }
        })  
    }
    // Enable storing and querying data from Local Datastore. 
    // Remove this line if you don't want to use Local Datastore features or want to use cachePolicy.
    Parse.enableLocalDatastore()
    Parse.setApplicationId("@@@",
        clientKey: "@@@")

    PFFacebookUtils.initializeFacebookWithApplicationLaunchOptions(launchOptions)

    PFUser.enableAutomaticUser()

    let defaultACL = PFACL();

    // If you would like all objects to be private by default, remove this line.
    defaultACL.setPublicReadAccess(true)

    PFACL.setDefaultACL(defaultACL, withAccessForCurrentUser:true)

    if application.applicationState != UIApplicationState.Background {

        // Track an app open here if we launch with a push, unless
        // "content_available" was used to trigger a background push (introduced in iOS 7).
        // In that case, we skip tracking here to avoid double counting the app-open.         
        let oldPushHandlerOnly = !self.respondsToSelector(Selector("application:didReceiveRemoteNotification:fetchCompletionHandler:")) 
        let noPushPayload: AnyObject? = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey]
        if oldPushHandlerOnly || noPushPayload != nil {   
            PFAnalytics.trackAppOpenedWithLaunchOptions(launchOptions)    
        } 
    }
    if application.respondsToSelector("registerUserNotificationSettings:") {
        let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
    } else {
        let types: UIRemoteNotificationType = [UIRemoteNotificationType.Badge, UIRemoteNotificationType.Alert, UIRemoteNotificationType.Sound]
        application.registerForRemoteNotificationTypes(types)
    }
    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

方法application: didRegisterForRemoteNotificationsWithDeviceToken

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let installation = PFInstallation.currentInstallation()
    installation.setDeviceTokenFromData(deviceToken)
    installation.saveInBackground()  
}

方法application: didReceiveRemoteNotification

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    if application.applicationState == .Inactive {   
        // The application was just brought from the background to the foreground, so we consider the app as having been "opened by a push notification."
        PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
    }
}

方法application:didReceiveRemoteNotification:fetchCompletionHandler

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    if application.applicationState == .Inactive {
        PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
    }
    if let meetingId: String = userInfo["meetingId"] as? String {
        let targetMeeting = PFObject(withoutDataWithClassName: "Meeting", objectId: meetingId)
        targetMeeting.fetchIfNeededInBackgroundWithBlock({ (object, error) -> Void in 
            // Show meeting to respond view controller
            if error != nil {
                completionHandler(UIBackgroundFetchResult.Failed)
            } else if PFUser.currentUser() != nil {
                // Get the meeting
                let meetingToRespond = Meeting(id: targetMeeting.objectId!, name: targetMeeting["name"] as! String, location: CLLocationCoordinate2DMake((targetMeeting["location"]?.latitude)!, (targetMeeting["location"]?.longitude)!), day: targetMeeting["dayTime"] as! NSDate)
                var rootViewController = self.window?.rootViewController as! UINavigationController
                let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let notificationScreen = mainStoryboard.instantiateViewControllerWithIdentifier("screenForNotification") as! MeetingToRespondViewController
                notificationScreen.meeting = meetingToRespond
                rootViewController.pushViewController(notificationScreen, animated: true)
                completionHandler(UIBackgroundFetchResult.NewData) 
            } else {
                completionHandler(UIBackgroundFetchResult.NoData)
            } 
        })
    }
    completionHandler(UIBackgroundFetchResult.NoData)
}

方法applicationDidBecomeActive: application

func applicationDidBecomeActive(application: UIApplication) {
    // Clear the badge
    let currentInstallation = PFInstallation.currentInstallation()
    if currentInstallation.badge != 0 {
        currentInstallation.badge = 0
        currentInstallation.saveEventually()
    }
    FBSDKAppEvents.activateApp()
}

提前谢谢!!! :D :);)

0 个答案:

没有答案