对于系统高于iOS 10版本的系统,在UNUserNotificationCenterDelegate中,有两种方法可以阐明是否从用户点击或系统收到消息来调用APNS消息方法:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
对于iOS 10版本下的系统,应用程序委托方法- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
存在问题,有3种方法可以调用此方法:
1:当应用程序在后台运行时单击通知消息,将调用此方法。
2:点击应用程序图标,应用程序在后台运行或被杀死,在App真正启动之前(大约1~3秒),在这几秒钟内如果收到APNS消息,也会调用此方法。
3:应用程序正在运行,下拉通知栏以使应用程序变为非活动状态,在此状态下如果收到APNS消息,也将调用此方法。
现在问题是,如何判断这3种点击?通常,如果用户没有点击消息进入应用程序(2和3的点击),应用程序就不应该执行此消息(比如打开基于消息信息的新页面)。但如何知道它是从2和3?
从下面的答案中,发现kind-2已经用applicationState解决了,而kind-3仍然没有回答,有谁知道如何修复它?
答案 0 :(得分:0)
您可以使用UIApplication
状态检查,如下所示:
///- if app is running in foreground
if (application.applicationState == UIApplicationStateActive) {
[self pushNotificationReceivedWhileActiveWithInfo:userInfo];
///- if app was running in background
} else if (application.applicationState == UIApplicationStateBackground) {
if (self.pushReceivedWhileClosed != YES) {
[self pushNotificationReceivedWhileInBackgroundWithInfo:userInfo];
}
}
当应用程序完全关闭时,您需要通过保存通知数据从通知打开时从didFinishLaunchingWithOptions
获取通知来处理通知,并在用户到达主屏幕时执行它,让我们说:
///- when receiving push notification while [app closed]
if (launchOptions != nil) {
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil) {
NSLog(@"[AppDelegate]##########################AppDelegate######################### Received notification while app CLOSED");
///- save the dictionary data and execute it when the app loads for example.
self.pushReceivedWhileClosed = YES;
}
}
答案 1 :(得分:0)
检查应用程序didReceiveRemoteNotification
中的应用程序状态- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground )
{
//app was on background
}
}
答案 2 :(得分:0)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSMutableDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo != nil)
{
comingFromNotification = YES;
}else{
comingFromNotification = NO;
}
}