我在我的应用程序使用推送通知服务。 当应用程序在后台,我能看到通知屏幕上通知(屏幕中显示,当我们从iOS设备的顶部向下滑动)。 但是,如果应用程序是在前台的委托方法
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
获取调用,但通知没有在通知屏幕上显示。
我想说明的通知屏幕独立的应用程序是否在背景或前景通知。 我通过搜索解腻。 任何帮助是极大的赞赏。
Answer 1:
用于当应用程序处于前台显示横幅消息,使用下面的方法。
iOS的10,斯威夫特3/4:
// 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])
}
您还必须注册您的应用程序委托的委托通知中心:
import UserNotifications
// snip!
class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate
// snip!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// set the delegate in didFinishLaunchingWithOptions
UNUserNotificationCenter.current().delegate = self
...
}
Answer 2:
下面的代码会为你工作:
- (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];
}
}
Answer 3:
对于任何可能有兴趣,我结束了创建看起来像顶部的系统推动的旗帜,但增加了一个关闭按钮(小蓝X)和挖掘信息的自定义操作的选项自定义视图。 它还支持多个通知到达用户来得及看之前的情况/解雇旧的(没有限制多少能堆积...)
链接到GitHub上:AGPushNote
用法基本上就足矣:
[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];
它看起来像这样在iOS7(iOS6的有iOS6的外观和感觉...)
Answer 4:
目标C
对于iOS 10
,我们需要整合willPresentNotification
在演出通知旗帜方法foreground
。
如果应用程序在前台模式(有源)
- (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);
}
Answer 5:
如果应用程序在前台运行,iOS设备将不会显示通知横幅/警报。 这是由设计。 但是,我们可以通过实现它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]; }
迅速:
if application.applicationState == .active {
var localNotification = UILocalNotification()
localNotification.userInfo = userInfo
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.alertBody = message
localNotification.fireDate = Date()
UIApplication.shared.scheduleLocalNotification(localNotification)
}
Answer 6:
如果应用程序在前台运行,iOS设备将不会显示通知横幅/警报。 这是由设计。 你必须写一些代码来处理您的应用程序接收通知,而它是在前台的情况。 你应该表现出的通知,并在最恰当的方式(例如,添加徽章数量到UITabBar
图标,模拟通知中心横幅等)。
Answer 7:
您可以创建自己的通知,模仿旗帜警报。
一种方法是创建一个自定义的UIView,看起来像旗帜,可以动画和触摸做出反应。 考虑到这一点,你可以使用更多功能创造更好的横幅。
或者你可以查找它会为你的API,并将其添加为podfiles到项目中。
这里有一对夫妇,我已经使用:
https://github.com/terryworona/TWMessageBarManager
https://github.com/toursprung/TSMessages
Answer 8:
下面是代码以接收推送通知时应用处于活动状态(前景或打开)。 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
Answer 9:
根据苹果的文档 ,是的,你可以在应用程序运行时显示通知
Answer 10:
并称,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])
}
Answer 11:
在你的应用程序代理使用波纹管代码
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])
}
}
Answer 12:
正如上面提到的,你应该使用UserNotification.framework
实现这一目标。 但我的目的,我必须表明它在应用不管怎样,希望有iOS 11
风格,所以我创建了一个小帮手观点,也许将是有用的人。
GitHub上的iOS 11推送通知查看 。
Answer 13:
正如马丁@Danial说的iOS不会显示通知横幅/警报。 这是由设计。 但是,如果真的要做到这一点,然后有一个办法。 我也通过同样做到这一点。
1.下载从解析帧工作解析FrameWork的
2.Import #import <Parse/Parse.h>
3.添加以下代码到你的didReceiveRemoteNotification方法
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
[PFPush handlePush:userInfo];
}
PFPush会照顾如何处理远程通知。 如果应用程序是在前台这显示警报,否则它显示在顶部的通知。
Answer 14:
如果您的应用程序在前台状态,这意味着您正在使用相同的应用程序。 因此,有没有需要显示在顶部的通知一般。
但仍然,如果你想显示你要创建自定义警报视图或自定义视图像烤面包或别的东西展现给你已经收到了通知用户这种情况下通知。
您还可以显示在顶部的徽章,如果你在你的应用程序这类功能。
文章来源: Get push notification while App in foreground iOS