发生错误时重新发送本地通知
问题描述:
在我们的应用程序中,我们发送预定的本地通知作为提醒。通知上有一个按钮可将提醒标记为已完成。当我们处理本地通知时,我们会发送一个API请求来标记提醒已完成。发生错误时重新发送本地通知
在HTTP请求失败的情况下,我们希望重新发送本地推送通知,原因有两个:1)用户知道原始操作失败,2)让他们可以重试。
我们尝试在application:handleActionWithIdentifier:for:completionHandler
回调中发送本地通知。我们从现在开始计划重试通知约5秒钟。它在模拟器上工作,但它不适用于实际设备。
我已经尝试在应用程序的application:didFinishLaunchingWithOptions:launchOptions
方法中添加application.beginBackgroundTaskWithName("showNotification", nil)
,这确实可以使其在设备上工作。但是,我担心这不是一个可靠的解决方案。我们的提醒通知可以在一天中的任何时间发送,beginBackgroundTaskWithName
的文档说它只能暂时工作。
所以我的问题是:真的没有办法重新发送iOS上的本地通知?另一方面,如果有,我该怎么做?
答
尝试下一个:
func showScheduledNotification() {
backgroundTaskID = UIApplication.shared.beginBackgroundTask(expirationHandler: { [weak self] in
guard let backgroundTaskID = self?.backgroundTaskID else { return }
UIApplication.shared.endBackgroundTask(backgroundTaskID)
})
DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + 5.0) { [weak self] in
guard let strongSelf = self else { return }
if let backgroundTaskID = strongSelf.backgroundTaskID {
UIApplication.shared.endBackgroundTask(backgroundTaskID)
strongSelf.backgroundTaskID = nil
}
/* show notification */
if /* showNotificationSuccess */ {
return
}
strongSelf.showScheduledNotification()
}
}
所以,每次尝试之后,后台任务将会结束。如果有必要,接下来会在5秒后开始。
不要忘了补充:
var backgroundTaskID: UIBackgroundTaskIdentifier?
为什么要使用本地通知失败,而不是直接故障处理块上执行的重试流? – piyuj
'我们安排从现在开始约5秒钟的重试通知'此时应用程序是否处于活动状态? –
@piyuj我们没有将我们的网络堆栈设置为自动重试。此外,请求是一个POST不是幂等的 –