如何在IOS中处理多个远程通知点击

时间:2016-02-22 08:50:42

标签: ios objective-c notifications viewcontroller notificationcenter

我正在尝试基于notification点击打开不同的视图控制器,但是当收到push notification时,它会自动在后台运行控制器代码,所以当我通过应用程序图标/来自{{的通知打开应用程序时1}}它会立即加载notification centre,但是当收到多个通知时,它会加载第一个通知控制器,而不管是否点击了哪个通知。

  

让我们说我已收到标题通知"晚上","早晨"和   "晚上",它应该打开"晚视图控制器"什么时候"晚上"   通知被点击,但它加载"夜视控制器"我什么时候去   它负载"晨视控制器"最后它加载"晚上   查看控制器"。在通知发出之前,我在主控制器上   然后我将应用程序移到后台。

当我点击"早晨" view controller它现在什么都不做。

之前我尝试过使用addObserver,但结果是一样的,所以我转到app delegate。

这是app委托代码

notification

5 个答案:

答案 0 :(得分:4)

首先,启用了Remote Notification后台模式,以便在后台处理通知。现在的问题是,每当收到通知时,你都会将viewController推送到viewController堆栈,这就是为什么你看到三个viewControllers堆叠的原因。

其次,didReceiveRemoteNotification可以在不同的状态下调用/处理。 StateBackground如果应用位于后台,StateInactive如果用户点按通知中心的通知,StateForeground如果应用位于前台。您只需在StateBackground中添加一个支票推送viewController,这就是点击通知时您没有看到任何更改的原因。

答案 1 :(得分:1)

为此,需要在didReceiveRemoteNotification方法中检查应用程序状态。这是代码:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

 //recieved notification
    if ( application.applicationState == UIApplicationStateActive ){
        // app was already in the foreground
        UIViewController* topViewController = [self.navigationController topViewController];
        if ([topViewController isKindOfClass:[HomeVC class]]) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"getUpdatedServiceData" object:nil];
        }
    }
}
HomeVC中的

您需要在此方法推送视图控制器中创建证书 getUpdatedServiceData

*注意 -

  

使用此方法处理应用的传入远程通知。   与应用程序不同:didReceiveRemoteNotification:方法,即   只有当您的应用程序在前台即系统中运行时才会调用   当您的应用在前台运行或运行时调用此方法   背景。此外,如果您启用了远程通知   在后台模式下,系统启动你的应用程序(或从中唤醒它)   暂停状态)并在推送时将其置于后台状态   通知到了。但是,系统不会自动进行   如果用户强行退出,请启动您的应用。在那种情况下,   用户必须重新启动应用程序或在系统之前重新启动设备   尝试再次自动启动您的应用。

感谢。

答案 2 :(得分:0)

我没试过这个,但我想这个app delegate方法会解决你的问题。

application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:

通过从远程通知中选择操作来激活您的应用程序时调用此方法。

userInfo字典参数包含与远程通知相关的信息。

有关详细信息,请参阅Apple文档

https://developer.apple.com/library/ios//documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler

答案 3 :(得分:0)

由于您在后台处理通知,因此当您尝试从通知中心启动应用时,您的应用已准备好显示之前收到的通知,此问题肯定会发生。

所以要解决你的问题,你应该

  1. 检查并决定最新或点击的通知,或在- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中显示哪些有意义,以取决于应用程序状态,这些代表会收到通知
  2. 在应用启动时检查已显示的viewController。如果是,请删除它们并显示最新或点击的通知。

    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    
    UIViewController* topViewController = [navigationController visibleViewController];
    
    if ([topViewController isKindOfClass:[Excercise class]])
    {
        [topViewController dismissViewControllerAnimated:NO completion:nil];
    }
    
  3. //之后启动相关通知VC。

答案 4 :(得分:0)

您可以使用不同的应用状态。

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
    {
        if ( application.applicationState == UIApplicationState.Active)
        {
            // App is foreground and notification is recieved,
            // Show a alert.
        }
        else if( application.applicationState == UIApplicationState.Background)
        {
            // App is in background and notification is received, 
            // You can fetch required data here don't do anything with UI.
        }
        else if( application.applicationState == UIApplicationState.Inactive)
        {
           // App came in foreground by used clicking on notification, 
           // Use userinfo for redirecting to specific view controller.
        }

    }