【问题标题】:Detecting user's tap on notification检测用户点击通知
【发布时间】:2013-08-12 11:10:04
【问题描述】:

根据苹果文档,我们可以通过检查应用程序状态变量是否处于非活动状态(link)来识别用户对通知的点击。

iOS 注意:在iOS中,你可以判断一个应用程序是否启动 由于用户点击操作按钮或是否 通知已通过以下方式发送到已运行的应用程序 检查应用程序状态。在委托的实现中 应用程序:didReceiveRemoteNotification:或 application:didReceiveLocalNotification: 方法,获取的值 applicationState 属性并对其进行评估。如果值为 UIApplicationStateInactive,用户点击了动作按钮;如果 值为 UIApplicationStateActive,应用程序在最前面的时候 它收到了通知。

但是我可以看到一个用例,其中有一个系统警报(通过系统警报,我的意思是在由 iOS 控制的应用程序的前台显示一个警报视图)并且应用程序处于非活动状态(当显示“系统警报”,iOS 通过将应用程序的application state 设置为 UIApplicationStateInactive 使后面的应用程序处于非活动状态),但用户仍然可以在屏幕上看到应用程序的内容。参考以下附件:

在这种状态下,如果应用收到通知,它的行为就像用户点击了通知一样。有解决此用例的解决方案吗?

【问题讨论】:

  • 相当混乱。 “前台的系统警报和应用程序处于非活动状态”到底是什么意思?
  • @HinataHyuga 在屏幕截图中,我有一个系统警报示例(gmail 应用程序上的通知警报),它由 iOS 而不是背后的应用程序控制。此时iOS将后面的应用视为处于非活动状态(应用的应用程序状态将设置为非活动)。
  • 每次收到通知时都会调用application:didReceiveLocalNotification:方法。
  • 是的@iPatel。但理想情况下应该是检查用户是否点击通知的条件。
  • 您想在应用程序处于活动状态或非活动状态时处理通知?

标签: ios cocoa-touch apple-push-notifications


【解决方案1】:
- (void)application:(UIApplication*)application didReceiveRemoteNotification: 
(NSDictionary*)userInfo
{
         UIApplicationState state = [application applicationState];
         if (state == UIApplicationStateActive)
         { 
              //When your app was active and it got push notification
         }
         else if (state == UIApplicationStateInactive) 
         {
              //When your app was in background and it got push notification
         }
}

didFinishLaunchingWithOptions 将在您的应用未运行并且在您的通知中单击启动时被调用。

由于您将在 didReceiveRemoteNotification 中显示 alertview,您可以在 alertview 的委托方法中识别点击,即- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

【讨论】:

  • 这个我明白。即使用户处于屏幕截图所示的状态,我也希望对用户点击通知进行可靠检查。
  • 不正确。此方法仅在应用程序运行时调用。 “如果在推送通知到达时应用程序未运行,则该方法会启动应用程序并在启动选项字典中提供适当的信息。应用程序不会调用此方法来处理该推送通知。”
  • 如屏幕截图所示 - 此警报由代码显示,它不是关于通知的系统警报。
  • @Shashank 我不明白你在说什么状态?
  • @HinataHyuga gmail 应用上的通知只是一个例子。它可能是来自另一个应用程序的警报,例如电池电量不足警报/本地通知警报。
【解决方案2】:

他们在 ios10 上修复了这个问题,当 add 方法时:

userNotificationCenter willPresentNotification.

这只会在应用程序处于 forground/active 状态时调用,并且只有在用户关闭其他系统警报后才会出现通知。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
相关资源
最近更新 更多