为啥我的本地通知没有在 iOS 10 的前台触发?

Posted

技术标签:

【中文标题】为啥我的本地通知没有在 iOS 10 的前台触发?【英文标题】:Why is my local notifications not triggered in the foreground in iOS 10?为什么我的本地通知没有在 iOS 10 的前台触发? 【发布时间】:2017-04-05 03:47:27 【问题描述】:

我试图了解为什么本地通知没有显示在前台。我相信我添加了所有正确的代码以实现此功能,但是当我的应用处于前台时,没有显示横幅。

这是我在AppDelegate.swift 中添加的内容:

import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    
        UNUserNotificationCenter.current().requestAuthorization(options: [UNAuthorizationOptions.alert, UNAuthorizationOptions.sound, UNAuthorizationOptions.badge])  (willAllow: Bool, error: Error?) in

            if willAllow == true
            
                // Do something
            

        

        UNUserNotificationCenter.current().delegate = self

        // Override point for customization after application launch.
        return true
    

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    
        print("GO IN HERE")
        completionHandler(.alert)
    

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
    

    


我的ViewController.swift

override func viewDidLoad()

    super.viewDidLoad()

    let content: UNMutableNotificationContent = UNMutableNotificationContent()
    content.sound = UNNotificationSound.default()
    content.subtitle = "This is a test"

    let trigger: UNTimeIntervalNotificationTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

    let request: UNNotificationRequest = UNNotificationRequest(identifier: "timerDone", content: content, trigger: trigger)

    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

当我的应用首次启动时,我确实看到了允许我的应用推送通知的权限警报,但我根本看不到任何通知。

我确实看到了日志输出 GO IN HERE,因此正在调用 willPresent

我还有什么遗漏的吗?

【问题讨论】:

请看一下这个***.com/questions/39893300/… 【参考方案1】:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    
    
    let center = UNUserNotificationCenter.current()
    center.delegate = self
    
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) (accepted, error) in
        if !accepted 
            print("Notification access denied")
        
    

在 AppDelegate 中添加:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 

    
    completionHandler( [.alert, .badge, .sound])


func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 
    completionHandler()

【讨论】:

【参考方案2】:

参考以下答案: UserNotification is not showing (ios 10)

我的本​​地通知没有显示在前台的原因不是因为我“将永远不会在前台看到通知”,如上一个答案所述,而是因为我需要至少设置 body 内容,我没有在我的代码中设置。

通过设置content.body = "Some message",我终于可以在我的应用运行时在前台看到通知了。

【讨论】:

谢谢。为什么我在 iOS 10 上看不到本地通知,这让我抓狂。我只是设置了 title...(当然在 iOS 11 上运行良好)【参考方案3】:

对我来说,是我忘了像这样设置委托:

UNUserNotificationCenter.current().delegate = self

【讨论】:

【参考方案4】:

您永远不会在前台看到通知,这就是它们的工作方式。如果你想强制它们显示,你可以创建自己的 UIView 并显示它或使用现有库https://github.com/pikacode/EBForeNotification

【讨论】:

我没有关注你:user​Notification​Center(_:​will​Present:​with​Completion​Handler:​)Called when a notification is delivered to a foreground app. 参考:developer.apple.com/reference/usernotifications/… 是的,它会被调用,但在视觉上它不会显示。这就是为什么你需要手动显示它

以上是关于为啥我的本地通知没有在 iOS 10 的前台触发?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 开发:推送通知阻止我的本地通知触发

iOS10:从本地通知中点击操作不会将应用程序带到前台

xcode 8 和 iOS 10 本地通知

iOS 本地通知 - 在后台时回调

当应用程序在 iOS 10 的前台时,不会调用“willPresent 通知”并且本地通知不会显示

iOS8中的本地通知触发代码可以吗?