在前台iOS中获取推送通知

我在我的应用程序中使用推送通知服务。 当应用程序在后台时,我可以在通知屏幕上看到通知(从iOS设备顶部向下滑动时显示的屏幕)。 但是,如果应用程序在前台委托方法

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo 

被叫,但通知画面不显示通知。

我想在通知屏幕上显示通知,而不pipe应用程序是在后台还是在前台。 我已经厌倦了寻找解决scheme。 任何帮助是极大的赞赏。

要在app处于前台时显示横幅消息,请使用以下方法。

iOS 10,Swift 3

 // This method will be called when app received push notifications in foreground func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } 

iOS 10,Swift 2.3

 @available(iOS 10.0, *) func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { //Handle the notification completionHandler( [UNNotificationPresentationOptions.Alert, UNNotificationPresentationOptions.Sound, UNNotificationPresentationOptions.Badge]) } 

下面的代码将为你工作:

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { application.applicationIconBadgeNumber = 0; //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) { // Nothing to do if applicationState is Inactive, the iOS already displayed an alert view. 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]; } } 

对于任何人可能有兴趣,我最终创build一个自定义视图,看起来像顶部的系统推横幅,但添加了一个closuresbutton(小蓝X)和一个选项来点击自定义操作的消息。 它还支持在用户有时间阅读/解散旧的通知之前到达多个通知的情况(没有限制可以堆放多less…)

链接到GitHub:AGPushNote

用法基本上在内线上:

 [AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"]; 

它看起来像这样在iOS7(iOS6有一个iOS6的外观和感觉…)

在这里输入图像说明

如果应用程序在前台运行,iOS将不会显示通知标题/提醒。 这是devise。 但是我们可以通过使用UILocalNotification来实现它,如下所示

  • 检查应用程序在接收远程程序时是否处于活动状态
    通知。 如果处于活动状态,则触发UILocalNotification。

     if (application.applicationState == UIApplicationStateActive ) { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.userInfo = userInfo; localNotification.soundName = UILocalNotificationDefaultSoundName; localNotification.alertBody = message; localNotification.fireDate = [NSDate date]; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; } 

如果应用程序在前台运行,iOS将不会显示通知标题/提醒。 这是devise。 你必须编写一些代码来处理你的应用在前台收到通知的情况。 您应该以最合适的方式显示通知(例如,将徽章号码添加到UITabBar图标,模拟通知中心横幅等)。

目标C

在这里输入图像说明

对于iOS 10,我们需要在前台集成显示通知横幅的willPresentNotification方法。

如果应用程序处于前景模式(活动)

 - (void)userNotificationCenter:(UNUserNotificationCenter* )center willPresentNotification:(UNNotification* )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { NSLog( @“Here handle push notification in foreground" ); //For notification Banner - when app in foreground completionHandler(UNNotificationPresentationOptionAlert); // Print Notification info NSLog(@"Userinfo %@",notification.request.content.userInfo); } 

您可以创build自己的模仿横幅提示的通知。

一种方法是创build一个看起来像横幅的自定义uiview,并可以animation和响应触摸。 考虑到这一点,您可以创build更好的横幅,甚至更多的function。

或者你可以找一个API来为你做,并将它们作为podfiles添加到你的项目中。

这里有一些我用过的:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

这是接收推送通知的代码,当应用程序处于活动状态(前景或打开)。 UNUserNotificationCenter文档

 @available(iOS 10.0, *) func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge]) } 

如果您需要访问userInfo的通知使用代码: notification.request.content.userInfo

将该completionHandler行添加到委托方法为我解决了同样的问题:

 //Called when a notification is delivered to a foreground app. @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } 

根据苹果文档 ,是的,你可以显示通知,而应用程序正在运行 在这里输入图像说明

在你的应用程序委托使用以下代码

 import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var currentToken: String? var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. application.registerForRemoteNotifications() let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in // Enable or disable features based on authorization. if granted == true { print("Allow") UIApplication.shared.registerForRemoteNotifications() } else { print("Don't Allow") } } UNUserNotificationCenter.current().delegate = self return true } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){ let tokenParts = deviceToken.map { data -> String in return String(format: "%02.2hhx", data) } let token = tokenParts.joined() currentToken = token //get device token to delegate variable } public class var shared: AppDelegate { return UIApplication.shared.delegate as! AppDelegate } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } } 

如果你的应用程序处于前台状态,这意味着你正在使用相同的应用程序。 所以一般不需要在顶部显示通知。

但是,如果您想在此情况下显示通知,则仍需创build自定义的“警报视图”或“自定义视图”,如Toast或其他内容,以向用户显示您已收到通知。

如果您的应用具有此类function,您还可以在顶部显示徽章。

正如@Danial Martine所说,iOS不会显示通知标题/警报。 这是devise。 但是,如果真的必须这样做,那么有一种方法。 我也是这样做的。

1.从Parse FrameWork下载parsing框架

2.导入#import <Parse/Parse.h>导入#import <Parse/Parse.h>

3.将以下代码添加到您的didReceiveRemoteNotification方法中

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [PFPush handlePush:userInfo]; } 

PFPush将小心如何处理远程通知。 如果应用程序在前台,则会显示警报,否则会在顶部显示通知。