【问题标题】:Remote notification method called twice远程通知方法调用了两次
【发布时间】:2014-01-01 09:08:53
【问题描述】:

我在我的应用程序委托中实现了application:didReceiveRemoteNotification:fetchCompletionHandler: 来响应推送通知。

当应用程序在后台接收到通知时,会立即调用此方法,我会获取新数据并在完成后执行完成块。一切都按照文档。但是,如果我点击通知警报,则会再次调用此方法,从而导致另一个网络调用和 UI 更新。我本来希望每次推送通知都会调用一次此方法,而不是在收到时调用一次,然后在操作时调用一次。

其他人是如何实现这种方法的?

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [self loadSomeResource:^(NSData *data,NSError *error){
        if (error) {
            completionHandler(UIBackgroundFetchResultFailed);
        }
        else if (data){
            completionHandler(UIBackgroundFetchResultNewData);
        }
        else {
            completionHandler(UIBackgroundFetchResultNoData);
        }
    }];
}

【问题讨论】:

  • 在您的方法中检查应用是否处于活动状态?
  • 如果我这样做了,我应该在第二次调用 completionHandler 时传递什么?
  • 你能把你的代码贴出来吗?

标签: ios objective-c ios7 push-notification


【解决方案1】:

以下是收到推送通知时application:didReceiveRemoteNotification:fetchCompletionHandler:方法中需要注意的事项:
1.当应用未启动时(即应用既不在后台也不在前台时),该方法被调用一次,applicationState 将变为 UIApplicationStateInactive
2 .当应用程序处于前台时,该方法被调用一次,applicationState 将变为 UIApplicationStateActive
3.当应用程序处于后台时,该方法会被调用两次,一次是在您收到推送通知时,另一次是在您点击该通知时。当您收到推送通知时,applicationState 将为 UIApplicationStateBackground,当您点击该通知时,applicationState 将为 UIApplicationStateInactive.

applicationStateUIApplicationStateBackground 时我们可以忽略它,因此对于所有三种情况,我们只能处理一次推送通知。 p>

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    if (application.applicationState == UIApplicationStateBackground) {
        completionHandler(UIBackgroundFetchResultNoData);
        return;
    }

    // Do whatever you need here and call completionHandler with appropriate UIBackgroundFetchResult
}

【讨论】:

  • 如果您需要单独的逻辑来确定何时收到远程通知以及何时启动通知,这将无法解决问题。您如何区分并知道哪个是哪个,就像现在UIApplicationStateInactive 可以在用户打开通知时或在收到通知时应用程序处于非活动状态时调用?一个用例的示例是需要接收远程通知的时间戳。
  • @HaithamMaya 你找到解决办法了吗?
【解决方案2】:

检查您的 application.applicationState 以了解您是在后台还是处于非活动状态并采取相应措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多