本地通知在 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:)
是
当通知传送到前台应用程序时调用。你
接收包含原始UNNotificationRequest
的UNNotification
对象。您使用要呈现的UNNotificationPresentationOptions
调用完成处理程序(使用 .none 来
忽略警报)。
userNotificationCenter(_:didReceive:withCompletionHandler:)
被调用
当用户在发送的通知中选择操作时。你
接收 UNNotificationResponse
对象,其中包括
用户操作的 actionIdentifier 和 UNNotification
对象。
系统定义标识符UNNotificationDefaultActionIdentifier
和UNNotificationDismissActionIdentifier
在用户点击时使用
打开应用程序的通知或滑动以关闭
通知。
在这两种情况下,您必须在完成后调用完成处理程序。
#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 - 如何判断本地通知是不是导致我的应用程序进入前台?