ios - 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) {
...
}
但是当应用程序被杀死、不活动或在后台时,这会触发。
谢谢
解决方案
感觉必须有更好的方法来做到这一点,但我认为可行的一种方法是保留您设置的局部变量:
- (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
方法作为代理。
推荐阅读
- ruby-on-rails - 使用 Rspec 使用错误数量的参数(给定 2,预期为 1)在 get :index 中测试失败
- spring - 如何在 @Validated @Service 注释的服务方法中自动装配 bean
- mysql - 当其中一个字段包含逗号分隔数字时,如何在 mySQL 中使用 GROUP_CONCAT?
- python - 如何在 yocto 构建期间从 bitbake bb 文件执行 python 脚本
- mongodb - 无法连接到谷歌云 vm 实例上的 mongodb 副本集
- python - 在终端中找不到 Tesseract
- css - 如何修复 vue cli 中未找到模块的错误?
- java - 将十六进制字符串转换为字节数组
- python - Pandas groupby 然后统计出现的次数为0
- javascript - 使用 fetch 递归加载分页数据