【问题标题】:App's badge number is stuck at 1 when incrementing manually from background remote push notification从后台远程推送通知手动递增时,应用程序的徽章编号卡在 1
【发布时间】:2014-12-17 12:02:37
【问题描述】:

我正在 iOS 应用程序中实现推送通知。

在从服务器content-available = 1 发送的 PNs 中设置有效负载,以便应用在推送通知从服务器到达时接收用户和后台通知:

aps =     {
    alert = "Hello!";
    "content-available" = 1;
    sound = default;
};

这就是我处理后台通知的方式:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
        NSInteger currentBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber;

        [UIApplication sharedApplication].applicationIconBadgeNumber = currentBadgeNumber + 1;

        completionHandler(UIBackgroundFetchResultNewData);

        return;
    }

    ...
}

写完这篇文章后,我希望每次推送通知到达时我的应用程序的徽章编号都增加 1(假设我的应用程序在后台)。

这种简单的方法在我的 2 台设备上非常适合我:装有 iOS 7.1 的 iPhone 4 和装有 iOS 8.1.2 的 iPhone 6,但它不适用于我们的一位测试人员。我们进行了广泛的测试并验证了它对他不起作用 - 我们的应用程序在他设备上的标记第一次增加到 1 然后冻结 - 从那时起它始终保持为 1。他是这样描述这个问题的:

我唯一一次看到应用程序的徽章正确增加是在重新启动设备并登录之后,这将使我们的应用程序成为当时为数不多的后台运行应用程序之一。因为我的设备上运行了许多应用程序,其中许多还使用后台处理(FB、NextDoor、WhatsApp),我的理论是,我们的应用程序获得后台周期的频率越来越少,设备处于活动状态的时间越长,这就是我们错过的原因有机会在后台被调用并增加徽章编号。

在采用这种简单的方法从后台推送通知中手动增加徽章编号之前,我们还考虑了在服务器端跟踪徽章编号并通过badge 参数发送其明确编号(因为一些 SO 主题建议这样做),但对于为简单起见,我们决定尝试更简单的方法并实施我上面描述的非常简单的策略。

所以问题是:

1) 对于我实施这种简单策略可能会为我们的测试人员产生不稳定结果的任何见解?

2) 如果答案 1 是否定的,我们是否应该 100% 考虑在服务器端实施来跟踪徽章编号,以便为我们提供稳定的结果?

附:目前,我正在添加额外的日志记录字符串以向我们的测试人员发布新的测试版本,以了解此问题是否与 application:didReceiveRemoteNotification:fetchCompletionHandler 相关,这可能不会在每次推送通知到达时都被调用。

【问题讨论】:

  • 我采用这种方式并获得了稳定的结果。我仍处于开发阶段,不知道它将如何在 App Store 上进行。但是为了徽章计数维护,我们选择了静默推送通知(content-available=1)。关于静默远程通知的一个重要注意事项是它们的速率有限。因此,如果超过速率,推送可能会延迟。没有合适的文档说明确切的费率是多少。我也很担心,这种方式能不能上App Store?
  • @dev4u,请查看我刚刚在此处发布的答案。如果您仍然喜欢使用content-available=1,我看不出它会导致 AppStore 出现问题的原因。但是,鉴于我们在使用content-available=1 方法时没有看到稳定的结果,我建议您利用服务器端实现。希望这是有道理的。

标签: ios apple-push-notifications


【解决方案1】:

自从我提出这个问题以来,当我们尝试使用 content-available=1 在客户端进行控制时,我们仍然没有获得稳定的结果来控制应用程序的徽章。

这就是我们将这个责任转移到服务器端的原因:现在我们在服务器上跟踪了许多未读通知,以便服务器通过badge 参数在aps 有效负载中发送这个数字。这为我们带来了应用程序徽章正确增量所需的稳定性。

现在我强烈建议大家对应用程序的徽章进行服务器端管理!!事实证明,这种服务器端实现相当简单,您可以完全控制此功能。

【讨论】:

  • 是的,服务器端实现是最好的方式。
【解决方案2】:

尝试先设置为 1,然后设置为 0。有时它在我的应用中解决了这个问题。

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

【讨论】:

  • 此问题与-[UIApplication setApplicationIconBadgeNumber:] 方法无关。我进行了详尽的测试,并确保didReceiveRemoteNotification: 方法在content-available=1 推送通知到达时不会以 100% 的保证被调用。我没有在你的答案上加上 -1,但它仍然与这个特定问题 95% 无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2010-12-28
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多