2017-05-29 183 views
0

在我们的应用程序中,我们发送预定的本地通知作为提醒。通知上有一个按钮可将提醒标记为已完成。当我们处理本地通知时,我们会发送一个API请求来标记提醒已完成。发生错误时重新发送本地通知

在HTTP请求失败的情况下,我们希望重新发送本地推送通知,原因有两个:1)用户知道原始操作失败,2)让他们可以重试。

我们尝试在application:handleActionWithIdentifier:for:completionHandler回调中发送本地通知。我们从现在开始计划重试通知约5秒钟。它在模拟器上工作,但它不适用于实际设备。

我已经尝试在应用程序的application:didFinishLaunchingWithOptions:launchOptions方法中添加application.beginBackgroundTaskWithName("showNotification", nil),这确实可以使其在设备上工作。但是,我担心这不是一个可靠的解决方案。我们的提醒通知可以在一天中的任何时间发送,beginBackgroundTaskWithName的文档说它只能暂时工作。

所以我的问题是:真的没有办法重新发送iOS上的本地通知?另一方面,如果有,我该怎么做?

+0

为什么要使用本地通知失败,而不是直接故障处理块上执行的重试流? – piyuj

+0

'我们安排从现在开始约5秒钟的重试通知'此时应用程序是否处于活动状态? –

+0

@piyuj我们没有将我们的网络堆栈设置为自动重试。此外,请求是一个POST不是幂等的 –

回答

0

尝试下一个:

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?