在前台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添加到你的项目中。
这里有一些我用过的:
这是接收推送通知的代码,当应用程序处于活动状态(前景或打开)。 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将小心如何处理远程通知。 如果应用程序在前台,则会显示警报,否则会在顶部显示通知。