在我们的应用中,我们会将预定的本地通知作为提醒发送。通知上有一个按钮,用于将提醒标记为已完成。当我们处理本地通知时,我们会发送API请求以将提醒标记为已完成。
如果HTTP请求失败,我们希望重新发送本地推送通知有两个原因:1)用户知道原始操作失败,2)以便他们可以重试。
我们尝试在application:handleActionWithIdentifier:for:completionHandler
回调中发送本地通知。我们从当前时间开始约5秒的重试通知。它适用于模拟器,但它不适用于实际设备。
我尝试在应用的application.beginBackgroundTaskWithName("showNotification", nil)
方法中添加application:didFinishLaunchingWithOptions:launchOptions
,这确实可以让它在设备上运行。但是,我担心它不是一个强有力的解决方案。我们的提醒通知可以在一天中的任何时间发送,beginBackgroundTaskWithName
的文档说它只能暂时生效。
所以我的问题是:在iOS上真的没有办法重新发送本地通知吗?另一方面,如果有,我该怎么办?
答案 0 :(得分: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?