在前台iOS中的应用程序中,未在通知托盘(顶部)中获取推送通知

当app是前台时,我尝试了很多修改通知….通过创建通知服务扩展

在后台并杀死成功修改但在前台仅获取警报正文中的原始有效负载而不是通知。

这里是NotificationService.m文件

 @implementation NotificationService - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; // Modify the notification content here... NSLog(@"tesrrrr"); self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title]; self.bestAttemptContent.body = [NSString stringWithFormat:@"%@[ body added Manually ]", self.bestAttemptContent.body]; self.contentHandler(self.bestAttemptContent); } {(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSDictionary *userInfo1 = userInfo; NSLog(@"userInfo: %@", userInfo1); //self.textView.text = [userInfo description]; // We can determine whether an application is launched as a result of the user tapping the action // button or whether the notification was delivered to the already-running application by examining // the application state. if (application.applicationState == UIApplicationStateActive) { //opened from a push notification when the app was on background /* UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.userInfo = userInfo; localNotification.soundName = UILocalNotificationDefaultSoundName; localNotification.alertBody = @"xyz"; localNotification.fireDate = [NSDate date]; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; */ NSLog(@"userInfoUIApplicationStateactive->%@",[userInfo objectForKey:@"aps"]); NSLog(@"userInfoUIApplicationStateactive->%@",[userInfo objectForKey:@"aps"]); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was Running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; // [self scheduleAlarmForDate1:[NSDate date]alarmDict:userInfo]; } else { // a push notification when the app is running. So that you can display an alert and push in any view NSLog(@"userInfoUIApplicationStateBackground->%@",[userInfo objectForKey:@"aps"]); } }} 

当app在前台时,实现UNUserNotificationCenterDelegate委托方法以获取通知(托盘在顶部)。 但它只适用于IOS 10。

在你的didFinishLaunchingWithOptions方法中设置UNUserNotificationCenterDelegate委托就像这样。

 [UNUserNotificationCenter currentNotificationCenter].delegate = self; 

实现委托方法……

 //Called when a notification is delivered to a foreground app. -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge); } //Called to let your app know which action was selected by the user for a given notification. -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{ completionHandler(); } 

注意

如果您的应用程序开发目标较少,那么IOS10使用它来设置委托。

 #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 // For iOS 10 display notification (sent via APNS) [UNUserNotificationCenter currentNotificationCenter].delegate = self; #endif 

应用程序位于前台时,顶部的通知横幅不会显示。 此横幅由操作系统管理,仅在应用程序处于后台或处于已终止状态时调用。

虽然iOS 10不是这种情况,但从iOS 10开始,您可以执行此操作,您需要在委托中捕获通知并调用显示横幅的function。

 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler(UNNotificationPresentationOptions.alert) } 

但正如我所说,这仅适用于iOS 10+。 对于以前的兼容性,您可以执行以下提到的操作:

为它创建自定义控件。 当应用程序位于前台时,您可以轻松地在委托function中捕获通知。 然后你可以调用自己的自定义控件(视图)来显示横幅。 幸运的是,有很多很好的通知自定义控制来做到这一点。 以下是一些:

1. BRYXBanner

2. CRToast