根据Apple文档,为了确定推送通知中的用户是否点按了,您应该查看applicationState
中的application:didReceiveRemoteNotification:
如果值为UIApplicationStateInactive,则用户点击操作按钮;如果值为UIApplicationStateActive,则应用程序在收到通知时位于最前面。
我发现这并非总是如此。例如:
双击主页按钮以显示系统托盘并进入“快速应用切换模式”,您的应用程序向上滑动以显示其他正在运行的应用程序,并且您的应用程序将处于非活动状态(即使它仍然可以看到mostyle)。如果您在此模式下收到推送通知,则您的应用代理将仍然收到application:didReceiveRemoteNotification:
,此时您的applicationState为UIApplicationStateActive
。根据文档,您应该像用户点击警报一样对待它...但在这种情况下他们没有。不仅如此,用户甚至没有看到推送通知(可能是因为在此模式下应用程序的顶部被切断)。
是否有人知道检测处于“快速应用切换模式”或正确处理通知的方法?
答案 0 :(得分:4)
我能够通过一些漂亮的检查来解决这个问题......
基本上这件事的关键是
-(void)applicationDidEnterBackground:(UIApplication *)application;
当您输入快速应用切换(或控制中心)时,不会调用此方法,因此您需要根据它设置检查。
@property BOOL isInBackground;
@property (nonatomic, retain) NSMutableArray *queuedNotifications;
当您收到通知时......
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
UIApplicationState appState = application.applicationState;
// Check if we're in this special state. If so, queue the message up
if (appState == UIApplicationStateInactive && !self.isInBackground) {
// This is a special case in which we're in fast app switching or control center
if (!self.queuedNotifications) {
self.queuedNotifications = [NSMutableArray array];
}
// Queue this to show when we come back
[self.queuedNotifications addObject:userInfo];
}
}
然后当我们回来时......
- (void)applicationDidBecomeActive:(UIApplication *)application {
application.applicationIconBadgeNumber = 0;
if (!self.isInBackground) {
// Show your notifications here
// Then make sure to reset your array of queued notifications
self.queuedNotifications = [NSMutableArray array];
}
}
您可能想要做的另一件事是检查这种特殊情况,即进入快速应用切换和用户去其他地方。我在设置isInBackground BOOL之前就这样做了。我选择将它们作为本地通知发送
-(void)applicationDidEnterBackground:(UIApplication *)application {
for (NSDictionary *eachNotification in self.queuedNotifications) {
UILocalNotification *notification = [self convertUserInfoToLocalNotification:eachNotification];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
self.queuedNotifications = [NSMutableArray array];
self.isInBackground = YES;
}