应用程序已从图标或通知中打开

时间:2012-05-23 14:47:05

标签: ios notifications push-notification

我的问题是这样的。

我向服务器发送请求,要求通知我将在2到10分钟内发生的事件并关闭应用程序,服务器将通过推送通知回复该请求。在服务器响应通知之前,应用程序会显示动画,以防万一它停留在前台。

当我收到通知时,当应用程序打开时,动画必须停止并显示通知中的一些数据。 我的问题是,如果我没有从通知中打开应用程序(我从图标中打开它),动画将继续显示,因为“didReceiveRemoteNotification”的回调方法永远不会被调用..

是否可以通过图标或通知(本地或推送)检查应用是否已打开?

3 个答案:

答案 0 :(得分:2)

SDK的application:didFinishLaunchingWithOptions:段有助于解释在不同的启动/唤醒场景中调用哪些委托方法(例如,单击已注册的URL处理程序,打开支持的mime类型,回答远程/本地通知,点击主屏幕上的图标等)

此外,如果您的应用程序在上述事件发生时已在运行,则会调用相应的委托方法(例如didReceiveRemoteNotificationopenURL等){{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: