首页 > 解决方案 > iOS UNUserNotificationCenter didReceiveNotificationResponse 仅在应用程序在后台打开时运行代码

问题描述

如果应用程序是inactive或在background.

这是2个场景:

这是我的代码:

// Push notification received in background
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;

  [[SEGAnalytics sharedAnalytics] receivedRemoteNotification:userInfo];

  if ([HSBeacon isBeaconPushNotification:userInfo]) {
    UIApplication *applicaiton = [UIApplication sharedApplication];

    // @todo Do not run if app was killed
    if (application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground) {
      NSString *helpScoutBeaconID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"HelpScoutBeaconID"];
      HSBeaconSettings *settings = [[HSBeaconSettings alloc] initWithBeaconId:helpScoutBeaconID];
      [HSBeacon handlePushNotification:userInfo beaconSettings:settings];
    }
    // End of conditional code
  }

  completionHandler();
}

我试过使用:

    UIApplication *applicaiton = [UIApplication sharedApplication];

    if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground) {
      ...
    }

但是当应用程序被杀死、不活动或在后台时,这会触发。

谢谢

标签: iosobjective-ciphonepush-notificationapple-push-notifications

解决方案


感觉必须有更好的方法来做到这一点,但我认为可行的一种方法是保留您设置的局部变量:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;

仅当应用程序当前位于前台时才调用该委托,因此如果您有类似的属性

@property (nonatomic, assign) BOOL receivedWillPresentNotification;

那么你可能会像这样实现这个

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
  // Whatever other logic you have here
  self.receivedWillPresentNotification = YES;
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;

  [[SEGAnalytics sharedAnalytics] receivedRemoteNotification:userInfo];

  if ([HSBeacon isBeaconPushNotification:userInfo] && self.receivedWillPresentNotification) {
      NSString *helpScoutBeaconID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"HelpScoutBeaconID"];
      HSBeaconSettings *settings = [[HSBeaconSettings alloc] initWithBeaconId:helpScoutBeaconID];
      [HSBeacon handlePushNotification:userInfo beaconSettings:settings];
  }

  self.receivedWillPresentNotification = NO;
  completionHandler();
}

再次,可能有一个更好的解决方案,与检查通知applicationDidFinishLaunching和检查应用程序的状态有关,然后您可以存储,但我认为您可以使用其他UNUserNotificationCenterDelegate方法作为代理。


推荐阅读