假设您实现了电子邮件客户端应用程序。 收到新邮件时,应显示通知,应用程序应尽快提取新邮件。 当用户在通知中心点击通知时,应用程序应显示新邮件。 但是,如果他直接打开应用程序(而不是通过通知),他应该会看到已使用最新数据更新的邮件列表。
理想情况下,应用会在收到{content-available:1}
通知时收到回调,以便更新数据,并在用户点击通知时进行另一次回调。
但是,如果应用程序实现application:didReceiveRemoteNotification:fetchCompletionHandler:
,则可能会在通知到达时立即调用两次相同的回调,如果用户单击通知中心中的通知,则再次调用。
因此,当触发回调时,应用程序应该如何知道它是否应该导航到新邮件(当用户点击通知时)或获取数据(由系统调用)?
更新 - 我尝试根据此answer查询applicationState
。这没有用,因为当用户打开控制中心并收到通知(但未点击)时,应用程序处于非活动状态,与用户点击通知时相同。
答案 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或其中一个测试版中修复了?