2012-06-28 47 views
2

我正在爲ios和android開發使用phonegap的應用程序。 我的應用程序將有免費試用5個項目,用戶將不得不支付每個額外的項目。使用phonegap獲取唯一的設備ID

我的問題是帽子我不能使用我的應用程序獲得任何設備的唯一標識符,所以用戶可以使用5免費項目,然後卸載並重新安裝應用程序,並獲得aditional 5免費項目。

我嘗試過使用phonegap API提供的device.udid,但每當我重新安裝它時它都會更改。

任何想法?

回答

5

獲取設備的MAC地址,並做了SHA1哈希對其進行混淆。這裏有開放的源代碼用於Android和iOS設備。

而且這種類型的解決方案的工作原理與您是否繼續使用PhoneGap或將來編寫本機代碼無關。而且,就應用程序審覈流程而言,Apple對於它沒有任何問題。

更新:這對於iOS 6來說是正確的答案,但是對於iOS SDK大於6的所有版本而言,這是不可能的。任何嘗試使用以前工作的低級別呼叫現在都會返回MAC地址2.廣告ID和AdSupport.framework是唯一的方法。如果您擁有越獄手機並且可以獲得root權限,它可能仍然有效。不確定。

+0

手機的任何解決方案?我不使用本機代碼 –

+0

我不使用PhoneGap,我們編寫本機iOS和Java,但我的理解是,PhoneGap允許您編寫本機代碼並將其注入到PhoneGap中。所以你可以在網上寫/發現一些簡單的低級別的方法,它們會得到MAC地址,然後做你想做的事,然後把它傳遞給你的PhoneGap代碼。 –

+0

您好@CliffRibaudo您可以發佈獲取mac地址代碼的可靠鏈接。我想我想問一個問題;我們知道[IMEI](http://en.wikipedia.org/wiki/IMEI)是電話的身份號碼,如果是這樣的話,爲什麼在這個帖子中有可能會返回null,如我的答案? –

1

就我個人而言,我發現唯一的Android ID的最佳方式是生成一個隨機字符串,範圍從16-26個字母數字字符,檢查它不存在於您的服務器上,然後將其保存在本地首選項中。

我已經嘗試了其他方法來獲得唯一的ID(IE.Tel​​ephonyManager),但是我知道所有這些都有機會返回null(這根本不好)。如果其他人有更好的方法,不能返回null,我很樂意聽到它。

1

使用設備IMEI作爲follows--

活動文件:

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" /> 
+0

僅適用於Android僅限於iPhone,但您也可以使用相同的Idea。 –

+0

TelephonyManager有可能返回一個空ID,正如我在下面的答案中所提到的那樣,這是一個不行的辦法。 – Guardanis

+0

是的..但我從來沒有測試過這個。那麼在100中獲得空值的可能性是什麼?請回復。 –