使用 UNUserNotificationCenter 支持 iOS 10 丰富的通知,但通知永远不会出现。它只会发出警报

Posted

技术标签:

【中文标题】使用 UNUserNotificationCenter 支持 iOS 10 丰富的通知,但通知永远不会出现。它只会发出警报【英文标题】:Using UNUserNotificationCenter to support iOS 10 rich notifications, but the notification never shows up. It only sounds the alert 【发布时间】:2016-09-29 16:42:57 【问题描述】:

不确定,缺少什么,但我遇到了一个奇怪的问题!!!

通知声音,但不显示。

我已将应用程序注册为仅显示警报和声音,但奇怪的是它从未显示。可以看到通知添加成功。但是,似乎有些琐碎的事情我无法理解。

即使删除通知也有效。

import Foundation
import NotificationCenter
import UserNotifications

class NotificationManager: NSObject 

    private let categoryIdentifier = "notificationCategory"

    private var toDateComponents = NSDateComponents()

    private enum actionIdentifier : String 
        case openApp = "openApp"
        case playMusic = "playMusic"
    

    // MARK: - Register for notifications

    func registerForNotifications(application: UIApplication) 
        if #available(ios 10.0, *) 
            UNUserNotificationCenter.currentNotificationCenter().getNotificationSettingsWithCompletionHandler  notificationSettings in
                switch notificationSettings.authorizationStatus 
                case .NotDetermined:
                    UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Alert, .Sound])  (granted, error) in
                        // Enable or disable features based on authorization
                        if granted 
                            print("Access requested and was granted for sending notifications")
                            UNUserNotificationCenter.currentNotificationCenter().setNotificationCategories([])
                            UNUserNotificationCenter.currentNotificationCenter().delegate = self
                            self.setupNotificationActions()
                         else 
                            print("Access requested and was denied for sending notifications")
                            print(error?.localizedDescription)
                        
                    
                case .Denied:
                    print("Notifications are turned off!!")
                break // nothing to do, pointless to go on
                case .Authorized:
                    self.setupNotificationActions()
                
            
         else 
            // Nothing to do here
            print("iOS 9 says, Let's get started...")
            self.setupNotificationActions()
        
    

    // MARK: - Setup notification actions

    private func setupNotificationActions() 

        // Initialize and specify the notification actions
        if #available(iOS 10.0, *) 
            let openAppAction = UNNotificationAction(identifier: actionIdentifier.openApp.rawValue, title: "Open App", options: [.AuthenticationRequired, .Foreground])
            let playMusicAction = UNNotificationAction(identifier: actionIdentifier.playMusic.rawValue, title: "Play Music", options: [])
            let notificationCategory = UNNotificationCategory(identifier: categoryIdentifier, actions: [openAppAction, playMusicAction], intentIdentifiers: [], options: [.CustomDismissAction])

            UNUserNotificationCenter.currentNotificationCenter().setNotificationCategories([notificationCategory])
         else 
            // Specify the notification actions
            let openAppAction = UIMutableUserNotificationAction()
            openAppAction.identifier = actionIdentifier.openApp.rawValue
            openAppAction.title = "Open App"
            openAppAction.activationMode = UIUserNotificationActivationMode.Foreground
            openAppAction.destructive = false

            let playMusicAction = UIMutableUserNotificationAction()
            playMusicAction.identifier = actionIdentifier.playMusic.rawValue
            playMusicAction.title = "Play Music"
            playMusicAction.activationMode = UIUserNotificationActivationMode.Background
            playMusicAction.destructive = false
            playMusicAction.authenticationRequired = false

            // Specify the category related to the above actions
            let notificationCategory = UIMutableUserNotificationCategory()
            notificationCategory.identifier = categoryIdentifier
            notificationCategory.setActions([openAppAction, playMusicAction], forContext: UIUserNotificationActionContext.Default)
            notificationCategory.setActions([playMusicAction], forContext: UIUserNotificationActionContext.Minimal)

            let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Sound], categories: NSSet(object: notificationCategory) as? Set<UIUserNotificationCategory>)
//            if (notificationSettings.types != UIUserNotificationType.None)
                UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)
//            
        
    

而且,在 AppDelegate...

private let notificationManager = NotificationManager()

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    notificationManager.registerForNotifications(application)

【问题讨论】:

您的应用在测试通知时是否在前台? 不。不是。 尝试这样做:清除所有现有的已发送通知,然后显示新通知。 @prabodhprakash 是一样的!! :( @matt。我正在检查。让我看看。 【参考方案1】:

每当您发送丰富的通知时,请确保有效载荷,必须包含“可变内容”:1,

有效载荷,


  "aps": 
    "alert": "Test Rich Notification",
    "mutable-content": 1,
    "badge": "1"
  ,
  "mediaUrl": "https://www.awaragroup.com/wp-content/uploads/2015/05/it-specialist.jpg",
  "mediaType": "jpg"

【讨论】:

【参考方案2】:

应正确分配代表。虽然,我无法确定发生这种情况的原因,但以下更改确保通知通过。

AppDelegate,

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate 

    private let notificationManager = NotificationManager()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    UNUserNotificationCenter.currentNotificationCenter().delegate = self
    notificationManager.registerForNotifications()

    

在 AppDelegate 本身中插入委托方法。

【讨论】:

以上是关于使用 UNUserNotificationCenter 支持 iOS 10 丰富的通知,但通知永远不会出现。它只会发出警报的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”