我正在为 ios 和 android 开发一个使用 phonegap 的应用程序。我的应用程序将免费试用 5 件商品,用户必须为每增加一件商品付费。
我的问题是我无法使用我的应用程序获得设备的任何唯一标识符,因此用户可以使用 5 个免费项目,然后卸载并重新安装应用程序并获得额外的 5 个免费项目。
我曾尝试使用 phonegap api 提供的 device.udid ,但每次我重新安装它时它都会改变。
有任何想法吗?
获取设备的 MAC 地址并对其进行 SHA1 哈希以进行混淆。那里有用于 Android 和 iOS 设备的开源代码。
无论您将来是否继续使用 PhoneGap 或编写本机代码,这种类型的解决方案都有效。此外,就 App 审核流程而言,Apple 对此没有任何问题。
更新:这是直到 iOS 6 为止的正确答案,但是对于所有版本的 iOS SDK GREATER THHAN 6,这不再是可能的了。任何尝试使用以前有效的低级调用现在总是返回 MAC 地址 2。广告 ID 和 AdSupport.framework 是唯一的方法。如果您的手机越狱并且可以获得 root 权限,它可能仍然有效。没有把握。
就个人而言,我发现唯一的 Android ID 的最佳方法是生成一个 16-26 个字母数字字符的随机字符串,检查它在您的服务器上不存在,然后将其保存在本地首选项中。
我已经尝试过其他方法来获取唯一 ID(IE. TelephonyManager),但我所知道的所有方法都有可能返回 null(这根本不好)。如果其他人有更好的方法不能潜在地返回 null,我很想听听。
使用设备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" />