识别iOS远程通知回调的触发器

时间:2015-08-11 12:16:32

标签: ios objective-c notifications

假设您实现了电子邮件客户端应用程序。 收到新邮件时,应显示通知,应用程序应尽快提取新邮件。 当用户在通知中心点击通知时,应用程序应显示新邮件。 但是,如果他直接打开应用程序(而不是通过通知),他应该会看到已使用最新数据更新的邮件列表。

理想情况下,应用会在收到{content-available:1}通知时收到回调,以便更新数据,并在用户点击通知时进行另一次回调。

但是,如果应用程序实现application:didReceiveRemoteNotification:fetchCompletionHandler:,则可能会在通知到达时立即调用两次相同的回调,如果用户单击通知中心中的通知,则再次调用。

因此,当触发回调时,应用程序应该如何知道它是否应该导航到新邮件(当用户点击通知时)或获取数据(由系统调用)?

更新 - 我尝试根据此answer查询applicationState。这没有用,因为当用户打开控制中心并收到通知(但未点击)时,应用程序处于非活动状态,与用户点击通知时相同。

1 个答案:

答案 0 :(得分:0)

我同意,对于" background-fetch"同样的方法调用同样的方法是相当奇怪和不方便的。和"用户确实点击通知"。

您应该能够使用该应用的UIApplicationState对通知采取措施,方法是触发后台获取或呈现UI。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

    switch ([UIApplication sharedApplication].applicationState) {
        case UIApplicationStateBackground: {
            // Fetch data in background
            // TODO

            break;
        }
        case UIApplicationStateInactive:
            // User Tapped Notification

            // If needed:
            // Store the Notification, to be presented when app becomes active.
            self.notificationToPresentWhenActive = userInfo;

            completionHandler(UIBackgroundFetchResultNoData);
            break;
        case UIApplicationStateActive:
            // App was open

            // Present the in-app Notification UI
            [self presentNotification:userInfo];

            completionHandler(UIBackgroundFetchResultNoData);
            break;
    }
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    if (self.notificationToPresentWhenActive) {
        [self presentNotification:self.notificationToPresentWhenActive];

        self.notificationToPresentWhenActive = nil;
    }
}
  

更新 - 我尝试根据这个答案查询applicationState。这没有用,因为当用户打开控制中心并收到通知(但未点击)时,应用程序处于非活动状态,与用户点击通知时相同。

我无法使用控制中心(底部)或通知中心(顶部)重现此问题(iOS 9.0.2)。也许它已经在iOS 9或其中一个测试版中修复了?