開発中のandroid(またはiphone)クライアントがあります。クライアントは、Androidユーザーが私たちも開発しているサーバーにエントリを送信することを許可します。ユーザーがエントリをサーバーに送信する時点でクライアントにデータサービス(GPRS)がない場合、クライアントはエントリをオフラインデータベースに保存し、後でサーバーに送信することもサポートします。
プロセス全体の重要な側面の1つは、ユーザーがサーバーにエントリを送信したタイムスタンプの正確さです(エントリがリアルタイムで作成されたか、オフラインデータベースからクライアントによって送信されたかに関係なく)
クライアントで利用可能な場合、GPS位置を取得し、GPSタイムスタンプを使用してそれをサーバーに送信できます(またはGPSタイムスタンプをオフラインDBに保存し、後でサーバーに送信します)。ただし、ユーザーがGPS(および他のすべての位置情報サービス)をオフにしている場合、デバイスにはGPS修正がないため、サーバーはエントリがいつ作成されたかを正確に判断できません。ユーザーが実際に発生した時間とは異なる時間にエントリを作成するためにクロックを変更する可能性があるため、ローカルデバイスの時計を使用することはできません(これらのエントリはユーザーの給与の一部であるため、ユーザーはそれらを「修正」することに関心がある可能性があります)。
だから基本的に私は、携帯電話の内部時計を信頼できないときに、いくつかのエントリが作成された時間をできるだけ正確に判断する方法を探しています。アルゴリズムは、リアルタイムで送信されるエントリまたはオフラインDBから送信されるエントリの両方をサポートする必要があります。アルゴリズムは、ユーザーがモバイルの時刻を変更したり、モバイルをオン/オフにしたり、アプリケーションがモバイルで実行されているときにGPSをオン/オフにしたりする場合もサポートする必要があります...
私が考えたいくつかのアイデア:
- モバイルの時間を信頼することはできませんが、ストップウォッチとして機能することはできます。アプリケーションが存在するまでループするクラスがあり、ループは1秒間スリープし、内部クロック変数を1秒増やします。すべてのGPS位置で、私のコードは内部時計変数を更新します。このようにして、デバイスの外部(GPSから)からの絶対時計があり、クライアントがサーバーにエントリを送信するときに、内部時計を絶対時間として使用できます。
長所:GPSから位置情報を取得したときにのみ更新されるため、ユーザーはこの時計を変更できません
短所:ユーザーが信頼できるエントリを作成するには、アプリケーションに少なくとも1つのGPS修正が必要です。
- サーバーが正しい正確な時計を持っているという事実を利用することができます。クライアントがエントリの経過時間が10分であるという情報をサーバーに送信する場合、サーバーは内部時間を使用して、エントリが作成された正確な時刻を知ることができます。
最大の問題は、どのようにしてエントリー年齢を知るかです。エントリを0の経過時間でオフラインDBに保存することを考えました。その後、1秒ごとにDBのエントリの経過時間を増やします。問題は、アプリが閉じているか、デバイスがオフになっている場合、これが発生することです
これは私が現在立ち往生しているところです。これを解決する方法についてのアイデアは大歓迎です
ありがとう