2

我正在为 ios 和 android 开发一个使用 phonegap 的应用程序。我的应用程序将免费试用 5 件商品,用户必须为每增加一件商品付费。

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

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

有任何想法吗?

4

3 回答 3

5

获取设备的 MAC 地址并对其进行 SHA1 哈希以进行混淆。那里有用于 Android 和 iOS 设备的开源代码。

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

更新:这是直到 iOS 6 为止的正确答案,但是对于所有版本的 iOS SDK GREATER THHAN 6,这不再是可能的了。任何尝试使用以前有效的低级调用现在总是返回 MAC 地址 2。广告 ID 和 AdSupport.framework 是唯一的方法。如果您的手机越狱并且可以获得 root 权限,它可能仍然有效。没有把握。

于 2012-06-28T21:51:33.193 回答
1

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

我已经尝试过其他方法来获取唯一 ID(IE. TelephonyManager),但我所知道的所有方法都有可能返回 null(这根本不好)。如果其他人有更好的方法不能潜在地返回 null,我很想听听。

于 2012-06-28T16:30:54.720 回答
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" />
于 2012-06-28T16:38:36.353 回答