1

因此,我正在研究一个 Web 应用程序的数据库架构,该应用程序也将开发其 android 和 iphone 应用程序。

为此,我想创建一个列名device_idmysql database跟踪用户是否通过web-appandroid-appiphone-app使用应用程序。

以下是几个功能点:

创建/注册

  • 可以通过 web-app / android-app / iphone-app 完成。

登录

  • 无论从哪里创建用户,用户都可以基于 Web 上的中央数据库从所有用户登录(使用登录 Web 服务)。

问题域

没有任何事实,但我的一些技术团队建议:

之前会提供UDIDANDROID_ID的IphoneAndroid在未来的版本中不会这样做。

现在,

即使没有互联网连接,移动应用程序也可以工作,因此我开发了一个同步工具,它可以通过单击按钮将设备上的数据同步到网络网络到设备。

某些情况下可能包括同一用户,他也在各种设备和 Web 上使用该应用程序,以便数据在设备和 Web 上无缝同步。

因此,最好的解决方法是什么,我可以自动生成一些独特的序列,而不是依赖设备 ID 进行同步过程。

- -编辑 - -

在出厂重置和植根设备上,它确保设备不会返回唯一的 ID,而且还有各种开发公司致力于 android 定制,因此它不能保证唯一的设备 ID。那么,我怎么能通过我的末端和网络上的一些逻辑来获得更好的解决方法。

4

2 回答 2

3

猜想你已经完成了同步过程(@Nishant B 的帖子),现在对于唯一 ID,这里是几乎适用于所有 Android 设备(Tab + Mobile)的代码片段。

现在如您所知,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 地址和蓝牙地址(出厂重置时不将 ANDROID_ID 作为其更改)。m_szUniqueID结合这些密钥,可以在 MD5 的帮助下生成唯一密钥( )。

我确信在上面的帮助下,您每次都可以生成一个唯一的密钥。

好点:

  • 它在同一设备上的连续生成中没有变化,这意味着一个设备将只有一个 ID,即唯一。
  • 甚至可以使用未注册的设备,即没有 IMEI 号码的设备。
  • 也适用于平板电脑。
于 2013-01-29T11:11:14.277 回答
2

您在同步过程中处于正确的轨道上。

设备 UDID(适用于 iPhone)和 Android_ID(适用于 Android)仅用于推送通知。

您可以在没有这个的情况下实现同步过程。

为此,您需要执行以下步骤:

1) 当应用程序第一次在设备 (iPhone/Android) 中打开时,然后在服务器上传递空白 ("") 日期。所以它会给你所有的数据。

2)将所有数据存储在本地数据库中以供离线使用。并且还在本地存储服务器日期。

3)现在,当用户下次打开应用程序时,然后将先前存储的数据传递到服务器上,它将只提供最新添加/更新的数据。

4)在本地数据库中进行必要的更改添加/编辑。

5) 这样,您将在网络和两个应用程序(iPhone 和 Android)中拥有相同的数据。

6) 当用户对本地数据进行更改时,在本地数据库中将其设置为“TRUE”。因此,当下一次同步执行时,检查 SET 位并将所有数据上传到服务器。

7) 因此,所有网络、iphone 和 android 上的所有数据都将是最新的。

希望你有一个想法。

快乐编码。

干杯!

于 2013-01-29T10:37:56.927 回答