1

そのため、Android および iPhone アプリも開発される Web アプリケーションのデータベース アーキテクチャに取り組んでいます。

そのために、ユーザーがweb-appまたはandroid-appまたはiphone-appを介してアプリケーションを使用しているかどうかを追跡するために、列名device_idを作成したいと考えています。mysql database

以下に機能的なポイントをいくつか示します。

作成・登録

  • web-app / android-app / iphone-app で実行できます。

ログインする

  • ユーザーの作成がどこから行われたかに関係なく、ユーザーは Web 上の中央データベースに基づいてすべてからログインできます (ログイン Web サービスを使用)。

問題ドメイン

事実はありませんが、私の技術チームの一部は次のようにアドバイスしています。

以前はUDIDANDROID_IDを提供していたIphoneAndroidは、将来のリリースでは提供されません。

今、

モバイル アプリはインターネットに接続していなくても動作するため、ボタンをクリックするだけでデバイス上のデータを Webに、Web からデバイスに同期する同期ツールを開発しました。

場合によっては、さまざまなデバイスや Web からアプリを使用している同じユーザーが含まれ、データがデバイスと Web でシームレスに同期されることがあります。

したがって、これに対する最善の回避策は何でしょうか。同期プロセスでデバイス ID に依存せずに、一意のシーケンスを自動生成できますか。

- -編集 - -

工場出荷時の状態にリセットされ、ルート化されたデバイスでは、デバイスが一意の ID を返さないことが確実です。また、さまざまな開発会社が Android のカスタマイズに取り組んでいるため、一意のデバイス ID が保証されるわけではありません。それで、どうすれば私の最後とウェブでもいくつかのロジックでより良い回避策を得ることができますか.

4

2 に答える 2

3

同期プロセス(@Nishant Bの投稿)が完了したと仮定すると、Unique IDの場合、ほぼすべてのAndroidデバイス(タブ+モバイル)で機能するコードスニペットがここにあります。

ご存知のように、Androidでは一意のIDが保証されていないため、生成するたびに複数のキーと一意のキーの組み合わせとして生成されるキーを作成することをお勧めします...

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE

String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 +
Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
Build.TAGS.length()%10 + Build.TYPE.length()%10 +
Build.USER.length()%10 ; //13 digits


WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);

BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();


String m_szLongID = m_szImei + m_szDevIDShort + m_szWLANMAC + m_szBTMAC;
// compute md5
MessageDigest m = null;
try {
     m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();

for (int i=0;i<p_md5Data.length;i++) {
        int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding)
if (b <= 0xF) m_szUniqueID+="0";
// add number to string
     m_szUniqueID+=Integer.toHexString(b);
}

// hex string to uppercase
m_szUniqueID = m_szUniqueID.toUpperCase();

ここでは、IMEI、メーカーボードの詳細、Wifiアドレス、Bluetoothアドレスを取得しました(工場出荷時のリセット時の変更としてANDROID_IDを使用していません)。これらのキーを組み合わせることで、MD5を使用して一意キー(m_szUniqueID)を生成できます。

上記の助けを借りて、毎回一意のキーを生成できると確信しています。

良い点:

  • 同じデバイスでの連続生成によって変化することはありません。つまり、1つのデバイスが持つIDは1つだけであり、つまり一意です。
  • 登録されていないデバイス、つまりIMEI番号のないデバイスでも機能します。
  • タブレットでも動作します。
于 2013-01-29T11:11:14.277 に答える
2

同期プロセスは順調に進んでいます。

デバイスUDID(iPhoneの場合)およびAndroid_ID(Androidの場合)は、プッシュ通知にのみ使用されます。

これなしで同期プロセスを実現できます。

そのためには、以下の手順に従う必要があります。

1)アプリがデバイス(iPhone / Android)で初めて開いたときに、サーバーで空白( "")の日付を渡します。だからそれはあなたにすべてのデータを与えるでしょう。

2)オフラインで使用するためにすべてのデータをローカルデータベースに保存します。また、サーバーの日付をローカルに保存します。

3)これで、ユーザーが次回アプリを開くときに、以前に保存されたデータをサーバーに渡すと、最新の追加/更新されたデータのみが提供されます。

4)ローカルデータベースで必要な変更を追加/編集します。

5)このようにして、Webと両方のアプリ(iPhoneとAndroid)に同じデータがあります。

6)ユーザーがローカルデータに変更を加えたら、ローカルデータベースでそのビットを「TRUE」に設定します。したがって、次に同期を実行するときに、SETビットを確認し、すべてのデータをサーバーにアップロードします。

7)したがって、すべてのデータはすべてのWeb、iphone、およびandroidで最新になります。

あなたがアイデアを得たことを願っています。

ハッピーコーディング。

乾杯!

于 2013-01-29T10:37:56.927 に答える