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

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

正在被调用,但通知屏幕上没有显示通知。

我想在通知屏幕上显示通知,不管应用程序是在后台还是前台。我厌倦了寻找解决办法。任何帮助都非常感激。


当前回答

iOS 14 +

下面这个答案有一个不同之处,.alert已弃用,使用.banner:

class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
    ) -> Bool {
        UNUserNotificationCenter.current().delegate = self

        return true
    }

    func userNotificationCenter(
        _ center: UNUserNotificationCenter,
        willPresent notification: UNNotification,
        withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
    ) {
        completionHandler([.banner, .badge, .sound])
    }
}

其他回答

如果应用程序在前台运行,iOS不会显示通知横幅/警报。这是故意的。你必须编写一些代码来处理应用程序在前台接收通知的情况。您应该以最合适的方式显示通知(例如,向UITabBar图标添加徽章号,模拟notification Center横幅等)。

正如@Danial Martine所说,iOS不会显示通知横幅/提醒。这是故意的。但如果真要这么做,还有一个办法。我也用同样的方法做到了这一点。

1.从parse FrameWork下载解析框架

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

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

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

PFPush会注意如何处理远程通知。如果App在前台,这显示警报,否则它显示在顶部的通知。

当应用程序在前台显示横幅消息时,使用以下方法。

iOS 10, Swift 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
      ...
   }

下面是当应用程序处于活动状态(前台或打开)时接收推送通知的代码。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

如果你的应用程序处于前台状态,这意味着你正在使用同一个应用程序。所以通常没有必要在顶部显示通知。

但如果你想显示通知在那种情况下你必须创建你的自定义警报视图或自定义视图像Toast或其他东西来向用户显示你已经收到通知。

如果你的应用中有这样的功能,你也可以在顶部显示一个徽章。