我的问题是这样的。
我向服务器发送请求,要求通知我将在2到10分钟内发生的事件并关闭应用程序,服务器将通过推送通知回复该请求。在服务器响应通知之前,应用程序会显示动画,以防万一它停留在前台。
当我收到通知时,当应用程序打开时,动画必须停止并显示通知中的一些数据。 我的问题是,如果我没有从通知中打开应用程序(我从图标中打开它),动画将继续显示,因为“didReceiveRemoteNotification”的回调方法永远不会被调用..
是否可以通过图标或通知(本地或推送)检查应用是否已打开?
答案 0 :(得分:2)
SDK的application:didFinishLaunchingWithOptions:
段有助于解释在不同的启动/唤醒场景中调用哪些委托方法(例如,单击已注册的URL处理程序,打开支持的mime类型,回答远程/本地通知,点击主屏幕上的图标等)
此外,如果您的应用程序在上述事件发生时已在运行,则会调用相应的委托方法(例如didReceiveRemoteNotification
,openURL
等){{1} }。从被叫回调的组合中,您可以确定发生了哪个事件。
答案 1 :(得分:1)
您可以通过检查launchOptions对象来执行此操作。这应该告诉您是直接打开应用还是通知。
你可以这样做:
if(!launchOptions){
NSLog(@"App invoked directly");
}
答案 2 :(得分:0)
您可以将此代码添加到AppDelegate的applicationWillEnterForeground方法中:
-(void)applicationWillEnterForeground:(UIApplication *)application {
// this method is called when staring an app that was closed / killed / never run before (after applicationDidFinishLaunchingWithOptions) and every time the app is reopened or change status from background to foreground (ex. returning from a mobile call or after the user switched to other app and then came back)
[[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {
NSLog(@"AppDelegate-getDeliveredNotificationsWithCompletionHandler there were %lu notifications in notification center", (unsigned long)[notifications count]);
for (UNNotification* notification in notifications) {
NSDictionary *userInfo = notification.request.content.userInfo;
if (userInfo) {
NSLog(@"Processed a notification in getDeliveredNotificationsWithCompletionHandler, with this info: %@", userInfo);
[self showPushNotificationInAlertController:userInfo]; // this is my method to display the notification in an UIAlertController
}
}
UIApplication.sharedApplication.applicationIconBadgeNumber = 0;
}];
} }
从方法应用程序didFinishLaunchingWithOptions中删除此行:如果已将其包括在其中,因为它会清除徽章编号以及通知中心中的所有通知:
UIApplication.sharedApplication.applicationIconBadgeNumber = 0;
这当前在iOS 12中运行,没有机会在较早版本中进行测试。 您还必须在此方法中实现代码,以处理应用程序在前台运行时收到的通知:willPresentNotification:(UNNotification *)notification withCompletionHandler: 以及用于处理通知的方法,在该通知中,用户通过点击通知来打开您的应用:didReceiveNotificationResponse:(UNNotificationResponse *)Response withCompletionHandler: