3

我的问题是这样的。

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

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

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

4

3 回答 3

2

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

此外,如果您的应用程序在上述事件发生时已经在运行,didReceiveRemoteNotification那么openURL除了applicationDidBecomeActive:. 从调用的回调的组合中,您可以确定发生了哪个事件。

于 2012-05-23T16:22:35.777 回答
1

您可以通过检查 launchOptions 对象来做到这一点。这应该告诉您是直接打开应用程序还是作为通知的结果。

你可以做这样的事情:

if(!launchOptions){
    NSLog(@"App invoked directly");
}
于 2012-05-23T16:17:18.987 回答
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 *) 使用CompletionHandler 响应:

于 2019-07-15T12:07:37.937 回答