使用phonegap获取唯一的设备ID

时间:2012-06-28 16:21:45

标签: android iphone mobile cordova udid

我正在为ios和android开发一个使用phonegap的应用程序。 我的应用程序将免费试用5个项目,用户必须支付的每个额外项目。

我的问题是我无法使用我的应用程序获取设备的任何唯一标识符,因此用户可以使用5个免费项目,然后卸载并重新安装应用程序并获得5个免费项目。

我尝试过使用phonegap api提供的device.udid,但每次重新安装时都会更改。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

获取设备的MAC地址并对其执行SHA1哈希以进行模糊处理。有开源代码可供Android和iOS设备使用。

无论您将来是否继续使用PhoneGap或编写本机代码,此类解决方案都能正常运行。此外,就App审核流程而言,Apple没有任何问题。

更新:这是通过iOS 6获得的正确答案,但是对于iOS SDK大于6的所有版本,这是不再可能的。任何使用以前工作的低级别呼叫的尝试总是返回2的MAC地址。广告ID和AdSupport.framework是唯一的方法。如果你有越狱手机并且可以获得root权限,它可能仍然有效。不确定。

答案 1 :(得分:1)

就个人而言,我发现一个独特的Android ID的最佳方法是生成一个16-26个字母数字字符的随机字符串,检查它在您的服务器上是否存在,然后将其保存在本地首选项中。

我已尝试过其他方法来获取唯一ID(IE。电话管理器),但我所知道的所有方法都有可能返回null(这根本不好)。如果其他人有更好的方式无法返回null,我很乐意听到它。

答案 2 :(得分:1)

使用设备IMEI如下 -

活动文件:

public class Welcome extends Activity {

    private TextView display;
    private Button checkAgain;
    private TelephonyManager telephonyManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        display = (TextView) findViewById(R.id.display);
        checkAgain = (Button) findViewById(R.id.buttonCheckAgain);

        display.setText("");

        telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        updateDisplay();

        checkAgain.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                updateDisplay();
            }
        });

    }

    private void updateDisplay() {
        display.setText(getDeviceID(telephonyManager));
        System.out.println("Display upadated");
    }

    private String getDeviceID(TelephonyManager phonyManager) {

        String id = phonyManager.getDeviceId();
        if (id == null) {
            id = "not available";
        }

        int phoneType = phonyManager.getPhoneType();
        switch (phoneType) {
        case TelephonyManager.PHONE_TYPE_NONE:
            return "NONE: " + id;

        case TelephonyManager.PHONE_TYPE_GSM:
            return "GSM: IMEI=" + id;

        case TelephonyManager.PHONE_TYPE_CDMA:
            return "CDMA: MEID/ESN=" + id;

        default:
            return "UNKNOWN: ID=" + id;
        }
    }
}

您需要此权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />