2017-05-29 6 views
0

アプリでは、予定されたローカル通知をアラームとして送信します。リマインダを完了したものとしてマークするボタンが通知にあります。ローカル通知を処理する際に、通知が完了したことを示すAPIリクエストが送信されます。エラーの場合にローカル通知を再送信

HTTPリクエストが失敗した場合、ローカルプッシュ通知を再送するには、1)元のアクションが失敗したことをユーザーが認識している、2)再試行できるという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? 
関連する問題