当前位置: 首页 > 知识库问答 >
问题:

检测应用是否通过推送通知启动/打开

贺善
2023-03-14

是否可以知道应用程序是否从消息推送中启动/打开?

我想发射活动可以在这里捕捉到:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if (launchOptions != nil) {
         // Launched from push notification
         NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    }
}

然而,当应用程序处于后台时,如何从推送通知中检测到它被打开?

共有3个答案

邹宣
2023-03-14

我们遇到的问题是在应用程序启动后正确更新视图。这里有一系列复杂的生命周期方法,令人困惑。

生命周期方法

我们对iOS 10的测试揭示了各种情况下的以下一系列生命周期方法:

DELEGATE METHODS CALLED WHEN OPENING APP

    Opening app when system killed or user killed
        didFinishLaunchingWithOptions
        applicationDidBecomeActive

    Opening app when backgrounded
        applicationWillEnterForeground
        applicationDidBecomeActive

DELEGATE METHODS CALLED WHEN OPENING PUSH

    Opening push when system killed
        [receiving push causes didFinishLaunchingWithOptions (with options) and didReceiveRemoteNotification:background]
        applicationWillEnterForeground
        didReceiveRemoteNotification:inactive
        applicationDidBecomeActive

    Opening push when user killed
        didFinishLaunchingWithOptions (with options)
        didReceiveRemoteNotification:inactive [only completionHandler version]
        applicationDidBecomeActive

    Opening push when backgrounded
        [receiving push causes didReceiveRemoteNotification:background]
        applicationWillEnterForeground
        didReceiveRemoteNotification:inactive
        applicationDidBecomeActive

问题所在

好的,那么现在我们需要:

  1. 确定用户是否正在通过推送打开应用

棘手的一点是,更新视图必须在应用程序实际处于活动状态时进行,这在所有情况下都是相同的生命周期方法。

我们解决方案的草图

以下是我们解决方案的主要组成部分:

  1. 在AppDelegate上存储一个notificationUserInfo实例变量

解释

当从push打开时,didFinishLaunchingWithOptions应用程序WillEnter前台总是在DidReceiveMemotentification:inactive之前立即调用,因此我们首先在这些方法中重置notificationUserInfo,这样就不会出现过时状态。然后,如果调用了didReceiveMotonification:inactive,我们知道我们是从推送中打开的,所以我们设置了self。notificationUserInfo,然后被ApplicationIDBecomeActive拾取,以将用户转发到右侧视图。

最后一种情况是,如果用户在应用切换器中打开应用程序(即在应用程序位于前台时双击home按钮),然后接收消息推送。在这种情况下,仅调用didReceiveRemote teNotify: inactive,并且既不调用WillEnterprise Foreground也不调用didFinishLaunding,因此您需要一些特殊状态来处理该情况。

希望这有帮助。

仉嘉泽
2023-03-14

虽然晚了,但可能有用

当应用程序未运行时

-(BOOL)application:(UIApplication*)application did finishlaunchingwithoptions:(NSDictionary*)launchOptions

叫做。。

您需要检查推送通知的位置

NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (notification) {
    NSLog(@"app recieved notification from remote%@",notification);
    [self application:application didReceiveRemoteNotification:notification];
} else {
    NSLog(@"app did not recieve notification");
}
胡鸿禧
2023-03-14

请参见以下代码

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground  )
    {
         //opened from a push notification when the app was on background
    }
}

等同于

-(void)application:(UIApplication *)application didReceiveLocalNotification (UILocalNotification *)notification
 类似资料:
  • 我有一个cordova应用程序(codova(3.4.0)在iOS上运行,很快也在Android上运行。推送通知已实现并正常工作。我无法通过消息推送检测应用程序何时启动并将应用程序重定向到正确的页面。 注意:这与应用在后台运行时从消息推送启动应用无关。只有当应用完全关闭时! 我现在有以下工作流: 定期启动: 等待科尔多瓦。js启动ondeviceready事件 从消息推送冷应用启动: 等待科尔多瓦

  • 我想知道是否有标志和参数可以通过单击通知托盘中的推送通知来告诉我用户是否启动了活动/应用程序。 我在 C2DM 接收器中的代码.java 我试着设定 但当该应用程序启动时,其意图中没有额外的内容。 我的mainactivity的onCreate函数中的代码 我得到的输出是onCreate - bundle没有额外的内容。所以多余的部分没有通过。 那么还有其他方法吗?在iOS中很容易

  • 如何通过Azure从我的UWP-App向不同设备上的应用程序的其他实例发送推送通知? 以下是注册设备以接收推送的说明。(这是可行的)第二部分是关于如何在控制台应用程序上发送推送(这也是可行的)https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-windows-store-dotnet-get-star

  • 我在PushKit VoIP通知上发现了一些与Azure通知中心支持相关的帖子: https://social.msdn.microsoft.com/Forums/ie/en-US/afda14fe-1218-4ca1-a1ee-205ccd241d1a/support-for-apple-voip-pushkit-push-notifications?forum=notificationhubs

  • 在我的应用程序中,我使用了消息推送服务,但我的问题是,当我关闭应用程序时,通知会出现,但当我打开应用程序然后发送通知时,通知不会出现。请帮帮我。

  • 当应用程序关闭时,我在使用FCM的聊天中收到有关新消息的通知。当我点击它时,我想打开聊天活动,但主活动会打开。 点击推送通知将打开主活动。在其中,我可以从intent获得一种类型的通知,并打开另一个活动: 在我看来,这种方法既肮脏又不方便。是否可以指定单击推送通知时将打开的活动? 编辑:解决问题的步骤: > 为要打开的活动添加意图过滤器: 向FCM消息添加click_action="you-act