2

iOSとAndroidの両方でphonegapを使用してアプリケーションを開発しています。私のアプリケーションでは、ユーザーが支払う必要がある追加のアイテムごとに、5 つのアイテムの無料試用版を使用する予定です。

私の問題は、アプリを使用してデバイスの一意の識別子を取得できないことです。そのため、ユーザーは 5 つの無料アイテムを使用してから、アプリをアンインストールして再インストールし、追加の 5 つの無料アイテムを取得できます。

phonegap api が提供する device.udid を使用してみましたが、再インストールするたびに変更されます。

何か案は?

4

3 に答える 3

5

デバイスの MAC アドレスを取得し、それに対して SHA1 ハッシュを実行して難読化します。Android および iOS デバイス用に入手するためのオープン ソース コードが公開されています。

そして、このタイプのソリューションは、今後も PhoneGap を使用し続けるかネイティブ コードを作成するかに関係なく機能します。また、アプリのレビュー プロセスに関する限り、Apple には問題はありません。

更新:これは iOS 6 までは正しい答えでしたが、iOS SDK GREATER THAN 6 のすべてのバージョンでは、これはもはや不可能です。以前は機能していた低レベルの呼び出しを使用しようとすると、常に 2 の MAC アドレスが返されます。広告 ID と AdSupport.framework が唯一の方法です。ジェイルブレイクされた電話があり、ルート権限を取得できる場合は、引き続き機能する可能性があります. わからない。

于 2012-06-28T21:51:33.193 に答える
1

個人的には、一意の Android ID を作成する最善の方法は、16 ~ 26 文字の英数字のランダムな文字列を生成し、それがサーバーに存在しないことを確認してから、ローカルの設定に保存することです。

一意の ID (IE.Tel​​ephonyManager) を取得する他の方法を試してみましたが、私が知っているすべての方法で 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 に答える