2017-05-11 6 views
1

私は、バックグラウンドで定期的にHTTPリクエストを送信する必要がある、私のアプリの素晴らしい機能を開発しています。定期的にバックグラウンドモード(iOS)でHTTPリクエストを送信する

私はここで、すでに多くの記事や議論を読んだが、私はstackoverflow.comで出会ったすべての提案が部分的にしか問題を解決するために解決策を考え出すていません。

は、私は自分のアプリケーションが何をしたいです何を詳細に説明しましょう。

はAPIを持つウェブサイトがあります考えてみましょう、私は(アプリがバックグラウンドモードにあるとき)、ウェブサイト上のデータの状態を確認するために定期的に要求を送信します。また、データの状態が受け入れ可能な場合は、プッシュ通知をユーザーに送信して、現時点で正しいデータであることを通知します。

誰かがどのようにiOSアプリでこのアイデアを実装するためのソリューションを提案してもらえますか?

+0

プリフェッチ機能を確認してください:https://developer.apple.com/reference/uikit/uitableview/1771763-prefetchdatasource –

+0

@ MaxPevsnerありがとうございましたが、私の意見では、このアプローチは状況には絶対に当てはまりません。そして、私はいくつかのツールに接続されていない、何らかの "ソフトウェア設計"の答えが必要です。 – user3524337

+0

サイレントプッシュ通知は、いったんデバイスで受信されると、いくつかのタスクを実行できます。フルバックグラウンドモードは、特定の機能に対してのみ利用可能です。https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html – Andrea

答えて

1

iOSでは、説明したとおり、これを行うことはできません。あなたのアプリがバックグラウンドにあるか、実行されていないときに定期的な間隔でタスクが実行されるようにスケジュールすることはできません。また、iOSがアプリをバックグラウンドで実行しているときに終了するかどうかを制御することもできないため、「実行していない」とは、処理する必要があるケースです(長い間はバックグラウンドで実行し続けることはできませんあなたが望むように)。

私は、私も物事のサーバー側を理解していません。受け入れられるまでサーバーがデータを操作しており、プッシュ通知を送信できる場合は、電話からの着信要求を待つ必要があるのはなぜですか?データが準備されているときにプッシュを送信するだけではどうですか?アプリが「受け入れ可能な」ものを決定した場合、アプリがサーバーに何を伝えて、プッシュを送信するかをサーバーが知るようにすることができます。

あなたの説明に近いものがいくつかあります。アプリで「バックグラウンドフェッチ」機能を実装すると、iOSは起動していないときにアプリを起動し、バックグラウンドでネットワークコールを行うことができます。しかし、これがどれほど頻繁に起こるかは保証されていません。これは、Apple's background execution docs

に記載されています。他のオプションは、「サイレント」プッシュ通知です。サーバーがこれらのいずれかを送信すると、iOSはバックグラウンドでアプリを起動して通知を処理できます。アプリは、必要に応じてネットワーク通話を行うことができます。あなたが好きな時にこれらを送ることができますが、Appleは無理をしないように警告します:

サイレント通知がバックグラウンドで目を覚ましあなたのアプリを保つための方法として意図されていない、また彼らは、優先度の高い更新のために意図されています。 APNは、サイレント通知を優先度の低いものとして扱い、総数が過大になると配信を完全に停止する可能性があります。実際の制限は動的であり、条件に基づいて変更できますが、1時間に数回の通知を送信しないようにしてください。

サイレントプッシュはApple's push notification docsに記載されています。

+0

このような詳細な説明をありがとう! 問題は自分のサーバーがないということです。サービスにリクエストを送信して応答するだけです。 – user3524337

0

あなたのアプリがbackground-runningの能力を持つことができるなら、あなたは物事のカップルを行うことができます。

  • 定期的に実行するには、Timer(NSTimer)が必要です。
  • HTTPリクエストを実行する方法が必要です。例については

Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(handleHTTPRequest), userInfo: nil, repeats: true) 

func handleHTTPRequest() { 
    // fetch and change the state of data 
} 

別のアプローチは、代が発生したときにタスクを実行しますdelegatesを持っていることであろう。固定時間間隔で実行したくない場合に使用できます。

+0

'Timerは確実に動作しません。アプリケーションがバックグラウンドにあるときには、すべて)。たとえそれがあったとしても、iOSによってアプリが終了する可能性があります。 –

+0

@TomHarrington、あなたが経験豊富な開発者であるので、私はあなたに助けを求めるのが好きです。何をお勧めしますか? :) – user3524337

+0

こんにちは@TomHarrington私は、タスクが通常のバックグラウンドモードで強制終了されない限り、彼が 'backgorund mode'機能を持っているかどうかを明示的に書いています。 – Rahul

関連する問題