本地通知在 iOS 10.2 中没有出现在前台

Posted

技术标签:

【中文标题】本地通知在 iOS 10.2 中没有出现在前台【英文标题】:Local notification is not coming in forgeound in iOS 10.2 【发布时间】:2016-12-21 10:18:02 【问题描述】:

我已经为 ios 10.2 成功实现了本地通知。

但问题是,只有当应用程序在后台时才会发出通知警报。如果应用程序在前台,则不会发出警报。

是否可以在前台获取本地通知?

我的代码在这里

func notificationNow()

        print("notification will be triggered in five seconds..Hold on tight")
        let content = UNMutableNotificationContent()
        content.title = "Intro to Notifications"
        content.subtitle = "Lets code,Talk is cheap"
        content.body = "Sample code from WWDC"
        content.sound = UNNotificationSound.default()

        //To Present image in notification
        if let path = Bundle.main.path(forResource: "menu2", ofType: "png") 
            let url = URL(fileURLWithPath: path)

            do 
                let attachment = try UNNotificationAttachment(identifier: "sampleImage", url: url, options: nil)
                content.attachments = [attachment]
             catch 
                print("attachment not found.")
            
        

        // Deliver the notification in five seconds.
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5.0, repeats: false)
        let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger)

        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().add(request)(error) in

            if (error != nil)
                print(error?.localizedDescription as Any)
            
        
    

【问题讨论】:

【参考方案1】:

在UNUserNotificationCenterDelegate的文档中:

重要

您必须在应用完成启动之前将您的委托对象分配给 UNUserNotificationCenter 对象。例如,在 iOS 应用中,您必须在 application(:willFinishLaunchingWithOptions:) 或 application(:didFinishLaunchingWithOptions:) 方法中分配它。

您似乎在很久以后才设置委托 - 就在将通知添加到通知中心之前。

我创建了一个简单的 Swift 类单例,其扩展符合 UNUserNotificationCenterDelegate。在单例的 init 方法中,我将委托分配给 self。然后我在 AppDelegate 的 willFinishLaunchingWithOptions 方法中初始化单例。

【讨论】:

【参考方案2】:

在要观察本地通知的类中编写如下代码(扩展)

当您在前台收到通知或当应用处于后台时用户点击通知时,这将通知。

希望这能解决您的问题。

extension ViewController:UNUserNotificationCenterDelegate


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

    print("Tapped in notification")


//This is key callback to present notification while the app is in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 

    print("Notification being triggered")
    //You can either present alert ,sound or increase badge while the app is in foreground too with ios 10
    //to distinguish between notifications
//        if notification.request.identifier == requestIdentifier
//        

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

//        
       


【讨论】:

在扩展中我写了 ViewController 而不是我的 CustomViewController 的名称,这是唯一的问题。 我从我的一个项目中添加了代码。在“ViewController.swift”中的那个项目扩展代码中,复制了相同的代码。 “ViewController”应该替换为扩展将要写入的视图控制器名称。【参考方案3】:

当应用在前台运行时。您需要通过委托方法捕获本地通知。

所以在您的AppDelegate 中实现didFinishLaunchingWithOptions 方法中的委托侦听:

在您的应用完成启动之前设置委托很重要。

// Do NOT forget to retain your delegate somewhere
let notificationDelegate = UYLNotificationDelegate()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
  let center = UNUserNotificationCenter.current()
  center.delegate = notificationDelegate

  // ...
  return true

如果您想在应用处于前台时响应可操作通知或接收通知,您需要实现UNUserNotificationCenterDelegate。该协议定义了两种可选方法:

userNotificationCenter(_:willPresent:withCompletionHandler:) 是 当通知传送到前台应用程序时调用。你 接收包含原始UNNotificationRequestUNNotification 对象。您使用要呈现的UNNotificationPresentationOptions 调用完成处理程序(使用 .none 来 忽略警报)。

userNotificationCenter(_:didReceive:withCompletionHandler:) 被调用 当用户在发送的通知中选择操作时。你 接收 UNNotificationResponse 对象,其中包括 用户操作的 actionIdentifier 和 UNNotification 对象。 系统定义标识符UNNotificationDefaultActionIdentifierUNNotificationDismissActionIdentifier 在用户点击时使用 打开应用程序的通知或滑动以关闭 通知。

在这两种情况下,您必须在完成后调用完成处理程序。

#pragma mark - UNUserNotificationCenterDelegate Methods

func userNotificationCenter(_ center: UNUserNotificationCenter,
   willPresent notification: UNNotification, 
  withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 
// Play sound and show alert to the user
     completionHandler([.alert,.sound])

【讨论】:

OP 已标记swift3,你应该在swift3 写答案!【参考方案4】:

使用下面的方法配置通知在前台显示,

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

您可以参考Apple documentation了解更多详情!

【讨论】:

以上是关于本地通知在 iOS 10.2 中没有出现在前台的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10,当应用程序处于前台时显示本地通知?

xcode 8 和 iOS 10 本地通知

iOS - 如何判断本地通知是不是导致我的应用程序进入前台?

本地通知 ios 11 在后台

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

当我的 iOS 应用程序处于前台时,如何使本地通知静音?