3

開発中のandroid(またはiphone)クライアントがあります。クライアントは、Androidユーザーが私たちも開発しているサーバーにエントリを送信することを許可します。ユーザーがエントリをサーバーに送信する時点でクライアントにデータサービス(GPRS)がない場合、クライアントはエントリをオフラインデータベースに保存し、後でサーバーに送信することもサポートします。

プロセス全体の重要な側面の1つは、ユーザーがサーバーにエントリを送信したタイムスタンプの正確さです(エントリがリアルタイムで作成されたか、オフラインデータベースからクライアントによって送信されたかに関係なく)

クライアントで利用可能な場合、GPS位置を取得し、GPSタイムスタンプを使用してそれをサーバーに送信できます(またはGPSタイムスタンプをオフラインDBに保存し、後でサーバーに送信します)。ただし、ユーザーがGPS(および他のすべての位置情報サービス)をオフにしている場合、デバイスにはGPS修正がないため、サーバーはエントリがいつ作成されたかを正確に判断できません。ユーザーが実際に発生した時間とは異なる時間にエントリを作成するためにクロックを変更する可能性があるため、ローカルデバイスの時計を使用することはできません(これらのエントリはユーザーの給与の一部であるため、ユーザーはそれらを「修正」することに関心がある可能性があります)。

だから基本的に私は、携帯電話の内部時計を信頼できないときに、いくつかのエントリが作成された時間をできるだけ正確に判断する方法を探しています。アルゴリズムは、リアルタイムで送信されるエントリまたはオフラインDBから送信されるエントリの両方をサポートする必要があります。アルゴリズムは、ユーザーがモバイルの時刻を変更したり、モバイルをオン/オフにしたり、アプリケーションがモバイルで実行されているときにGPSをオン/オフにしたりする場合もサポートする必要があります...

私が考えたいくつかのアイデア:

  1. モバイルの時間を信頼することはできませんが、ストップウォッチとして機能することはできます。アプリケーションが存在するまでループするクラスがあり、ループは1秒間スリープし、内部クロック変数を1秒増やします。すべてのGPS位置で、私のコードは内部時計変数を更新します。このようにして、デバイスの外部(GPSから)からの絶対時計があり、クライアントがサーバーにエントリを送信するときに、内部時計を絶対時間として使用できます。

長所:GPSから位置情報を取得したときにのみ更新されるため、ユーザーはこの時計を変更できません

短所:ユーザーが信頼できるエントリを作成するには、アプリケーションに少なくとも1つのGPS修正が必要です。

  1. サーバーが正しい正確な時計を持っているという事実を利用することができます。クライアントがエントリの経過時間が10分であるという情報をサーバーに送信する場合、サーバーは内部時間を使用して、エントリが作成された正確な時刻を知ることができます。

最大の問題は、どのようにしてエントリー年齢を知るかです。エントリを0の経過時間でオフラインDBに保存することを考えました。その後、1秒ごとにDBのエントリの経過時間を増やします。問題は、アプリが閉じているか、デバイスがオフになっている場合、これが発生することです

これは私が現在立ち往生しているところです。これを解決する方法についてのアイデアは大歓迎です

ありがとう

4

3 に答える 3

2

これが私がiPhoneでこの問題を処理する方法です。アプリが起動したら、サーバーに電話して現在のGMT時刻を尋ねます(必要に応じて、パブリックNTPサーバーに電話することもできます)。次に、それをシステム時間と比較します。Xを超えて異なる場合は、システム時刻が間違っているため、これを修正するまでアプリを使用できないというメッセージがポップアップ表示されます。次に、アプリの実行中にシステム時刻を変更しているユーザーを監視します。変更した場合は、もう一度比較を行います(時刻がXを超えている場合は、エラーメッセージをポップアップ表示します)。これにより、システム時刻が常に正しく(ある程度の許容範囲内で)、[NSDatedate]を信頼できるようになります。ただし、このソリューションには有効なネットワーク接続が必要です。このソリューションが機能する場合は、サンプルコードを投稿できます。

于 2012-04-29T18:03:05.343 に答える
2

私はジュールとジョエルの答えを1つのソリューションにまとめて、私のニーズに最適なソリューションを提供すると思います。モバイルにGPRSがない場合、ユーザーは時計を変更する可能性があるため、時間変更イベントを検出するだけでは役に立ちません。その時点では、新しい時刻が正しいことを検証できません。

Joelが推奨したように、アプリケーションの起動時にサーバーから時間を取得します(その時点でも、サーバーと通信する必要があります。そうしないと、アプリケーションが起動しません)。現在のデバイスのupTimeとともにサーバーから取得された時間が保存されます。

ユーザーがエントリを作成したい場合は、(サーバーベース時間+現在のアップタイム-ベースアップタイム)を使用して現在の時間を計算します。このようにして、デバイスの現在の時計に関係なく、独立した時間のソースが得られます

これは間違いなくAndroidで動作します

iPhoneでは、 http://www.cocoadev.com/index.pl? FindingUptimeから何かを使用してupTimeを取得しようとします

ジュール&ジョエル、あなたの答えに感謝します!

于 2012-04-30T06:35:28.653 に答える
1

android.os.SystemClockを調べてください。具体的には、lapsedRealtime()は、電話の電源がオンになってからの時間を返します。これは、ユーザーが時計を変更しても影響を受けません。

電話がオンになっているときに実行され、リアルタイムクロックをチェックするコードを使用することで、電話がオフになっている場合の時間を関連付けることができます。電話がオフのときは時計を変えることができないので、これを使って簡単な不正行為を捕らえるシステムを組み立てることができると思います。(ユーザーが電話をルートする場合、すべての賭けはオフになります-彼らはあなたの下からAPIの動作を変更する可能性があります)。

毎秒コードを実行すると、電話のバッテリー寿命が短くなります。これを行った場合、ほとんどの電話は1日続く可能性は低いでしょう。

于 2012-04-29T16:47:36.300 に答える