【问题标题】:iOS UILocalNotification - No delegate methods triggered when app is running in background and the icon is clicked upon notificationiOS UILocalNotification - 当应用程序在后台运行并且在通知时单击图标时不会触发委托方法
【发布时间】:2012-04-11 02:20:54
【问题描述】:

iPhone 版本 - 5.1 (9B176)

以下是本地通知期间未调用didFinishLaunchingWithOptions 方法的一系列事件。

  1. 应用程序正在后台运行。
  2. 收到本地通知 - 简单通知没有对话框。
  3. 点击显示徽章编号的应用图标。

预计根据Apple documentation

作为呈现通知的结果,用户点击警报的操作按钮或点击(或单击)应用程序图标。 如果点击操作按钮(在运行 iOS 的设备上),系统将启动应用程序并且应用程序调用其委托的 didFinishLaunchingWithOptions 方法(如果已实现);它传入通知负载(用于远程通知)或本地通知对象(用于本地通知)。

如果在运行 iOS 的设备上点击应用程序图标,应用程序会调用相同的方法,但不会提供有关通知的信息

实际: didFinishLaunchingWithOptions 未调用。但是applicationWillEnterForegroundapplicationDidBecomeActive 被调用了。

【问题讨论】:

  • 你在这个问题上成功了吗,我也面临同样的问题

标签: iphone ios5 notifications uilocalnotification localnotification


【解决方案1】:

你是对的。该行为与文档不一致。将文档放在一边,专注于实际行为;问题的症结似乎是这样的:如果您的应用程序通过用户与通知交互而变为活动状态,您将收到指向通知的指针,如果用户直接点击您的应用程序图标,您将不会。

为了说明。如果您呈现警报样式通知并且用户点击操作按钮,或者如果,如您的情况,您呈现横幅通知并且用户点击您将通过以下两种方式之一收到指向通知的指针:

如果您的应用程序处于未运行状态:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    UILocalNotification *launchNote = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (launchNote){
        // I recieved a notification while not running

    }
}

如果您的应用程序在任何状态下运行:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    // I recieved a notification
}

在用户选择取消警报样式通知的情况下,该通知将消失。

真正令人讨厌的不一致部分是,如果您呈现横幅通知并且用户点击您的图标,您似乎无法在通知中心检索对呈现通知的引用。即它们没有出现在 [[UIApplication sharedApplication] scheduledLocalNotifications] 数组中,可能是因为它们不再被安排但现在出现了。

简而言之;文档是错误的。还有其他令人讨厌的不一致之处。如果这种行为对您来说是个问题,您应该向 Apple 提交错误。

【讨论】:

  • 不。未调用 didReceiveLocalNotification。应用程序在后台而不是前台运行。单击应用程序图标而不是通知消息。在这种情况下,根据苹果文档,预期的行为是调用 didFinishLaunchingWithOptions .. 但是 didFinishLaunchingWithOptions 和 didReceiveLocalNotification 都没有被调用。
  • 您是正确的,文档具有误导性/错误。作为回应,我已经编辑了我的答案。
  • 感谢 NJones。我已经向 Apple 提交了错误报告。 (错误报告 ID:11136947)
  • 你可以序列化 UILocalNotification 使用 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notice];
  • 这似乎已被弃用
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多