我知道类似的问题已经被问过很多次了。但在阅读了这些帖子之后,我仍然感到非常困惑,尤其是在iOS 10中引入了UNUserNotificationCenter
之后。
官方文档提到了我可以处理远程通知的3种方法:
userNotificationCenter:willPresentNotification:withCompletionHandler:
以在应用程序位于前台时处理通知
userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
应用程序:didReceiveEmotentification:fetchCompletionHandler:
方法
所以
而且,更令人困惑的是:如果应用程序在后台,何时调用委托方法:何时收到通知消息?或者当用户点击通知时?
相关:iOS推送通知:当应用程序处于后台时,如何检测用户是否点击了通知?
除了Ameya给出的很好的答案之外,我还想指出,如果应用程序处于后台状态,userNotificationCenter:willPresent:notification
不会被调用。
我在iOS 10上处理所有案例的完整解决方案是使用应用程序:didfishlaunchingwithoptions:launchOptions
,检查是否处于后台状态,并在后台处理通知。但是,您的有效负载现在还需要包括“内容可用”:1
字段)。
iOS10及以后:
1) userNotificationCenter将显示通知:通常用于决定当用户已经在应用程序中并且通知到达时该做什么。你可能会在应用程序内部触发远程通知。用户点击远程通知后,将调用方法2(didReceive response)。
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) {
//Handle push from foreground
//When a notification arrives and your user is using the app, you can maybe notify user by showing a remote notification by doing this
completionHandler([.alert, .badge, .sound])
//To print notification payload:
print(notification.request.content.userInfo)
}
2) userNotificationCenter didReceive response:通常用于在用户点击通知后将用户重定向到应用程序的特定屏幕。
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
//Handle push from background or closed (or even in foreground)
//This method is called when user taps on a notification
//To print notification payload:
print(response.notification.request.content.userInfo)
}
以下iOS10:
3)应用didReceiveRemote teNotify:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
//To print notification payload
print(userInfo)
if #available(iOS 10.0, *) {
}
else {
//Handle remote notifications for devices below iOS 10
if application.applicationState == .active {
//app is currently in foreground
}
else if application.applicationState == .background {
//app is in background
}
else if application.applicationState == .inactive {
//app is transitioning from background to foreground (user taps notification)
}
}
}
4) 应用程序DidFinishLaunchWithOptions launchOptions:iOS 10以下的设备只剩下关闭应用程序,用户点击启动应用程序的通知的情况。对于这种情况,您必须检查以下方法。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//To print notification payload:
if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [AnyHashable: Any] {
print(notification)
}
}
LaunchOptions是一个字典,指明应用程序启动的原因(如果有)。在用户直接启动应用程序的情况下,此词典的内容可能为空。
现在回答你们的问题,
>
要在应用处于后台/非活动状态时处理远程通知,您必须在方法2(userNotificationCenter did接收响应)中为iOS10及以上的设备添加代码。此外,对于低于iOS10的设备,您必须使用方法3(应用程序didReceiveRemote teNotify)。
要在应用程序在iOS10之前在前台运行时处理远程通知,请使用方法3活动状态。
我正在尝试用远程通知处理所有可能的情况。当调用Foreground-DidReceiverEmoteNotification中的app时我就ok了。问题是当应用程序处于后台状态时,我收到推送通知。什么都不叫。如何让用户知道他有新的远程通知当应用程序回到前台?
问题内容: 我已经看到以下内容: AngularJS文档也提到了这一点,我不太了解。 这些方法之间有什么区别吗?特别是Angular文档的最后一种方法是做什么的?一个比另一个更好用吗? 问题答案: 它们大致相同,但有一些区别: 如果您 在页面末尾 (而不是在标题中)加载 了 脚本,这将起作用。 否则,在引导应用程序时将不会加载DOM(不会编译任何模板,指令不会有任何效果)。 此作品:plnkr 这
这些方法有什么区别吗?特别是最后一种方法是什么?一个比另一个好用吗?
我一直在写一些批处理文件,我偶然发现了这本用户指南,它提供了大量信息。它告诉我的一件事是,行不仅可以用注释,还可以用注释。上面写着: 批处理代码中的注释可以使用双冒号进行,这比使用REM命令更好,因为标签是在重定向符号之前处理的。
现在我正在开发一个能够接收通知的应用程序,进展顺利,直到我需要向服务器发送应用程序上收到的通知的副本。 虽然我知道这种方法的缺点,但这是我处理收到的通知的唯一方法。 现在我可以通过这个方法处理应用程序在后台和前台收到的通知 。在此方法中,我调用NSURLConnection sendAsynchronousRequest将收到的通知数据发送到我的服务器。 但是,当应用程序被删除(从后台应用程序中删
问题内容: 我正在尝试决定要选择哪种mime类型来返回mp3数据(由php提供) 根据此mime类型列表:http : //www.webmaster-toolkit.com/mime-types.shtml 这些之间有什么区别,我应该使用哪个? 问题答案: 最好的选择是使用RFC定义的 mime-type 。