2014-06-06 25 views
2

我想嚮應用添加應用內購買功能,並且我想知道推薦的方式來存儲產品的可用計數(例如100個硬幣)。在設備上存儲應用內商品數據

具有根訪問的用戶可以:

  • 訪問/操縱應用程序存儲(所以他可以改變 數目硬幣的)未加密的數據。
  • 保存encryped(或混淆)數據,再後來取代它找回 狀態,當他有更多的硬幣

因此,即使加密,這是比較容易作弊。我的問題是:

  • 我應該進一步加密嗎? (這是否值得付出努力?)
  • 用戶是否常常濫用此功能?
  • 有沒有更好的方法來存儲物品數量?
  • 有什麼做法?
+0

更好地保存在服務器上 –

+0

如果用戶下線會怎麼樣?我仍然需要在本地存儲它以允許離線模式。 – kupsef

+0

在本地保存這些數據在使用root訪問時總是很脆弱。 –

回答

4

本地存儲您的遊戲幣,並讓交易在沒有網絡連接的情況下在本地進行,但是當用戶重新連接到互聯網時,請將本地硬幣與服務器顯示的購買金額進行覈對。

基本上,當您有網絡連接時,請從Google下載任何購買的應用內商品。檢查您的廣告資源,然後根據用戶在離線狀態下進行的操作,消費應減少的產品。這樣做之後,如果本地總量與服務器顯示的內容(消耗之後)之間存在差異,則將其標記爲潛在的黑客攻擊。否則,你很好(一切均衡)。

當使用像這樣的可消費應用內產品時(這聽起來像是您正在嘗試這樣做),實際上並沒有完全離線的方式來做到這一點。您依靠Google的應用內結算服務,因此您必須不時檢查其服務器,以協調/刷新購買的廣告資源。從谷歌的in-app billing documentation

要錄製購買消費,送consumePurchase方法 的應用內結算服務,並通過在識別購買要刪除的purchaseToken字符串值 。 purchaseTokenINAPP_PURCHASE_DATA字符串中由Google 成功購買請求後返回的數據中的部分 。在此示例中, 您正在記錄使用令牌變量中的purchaseToken標識爲 的產品的消耗。

int response = mService.consumePurchase(3, getPackageName(), token);

警告:不要叫主線程上consumePurchase方法。 調用此方法會觸發一個可能會阻止您的主線程的網絡請求。相反,請創建一個單獨的線程,並從該線程內調用方法 consumePurchase

這是你的責任,控制和跟蹤如何在應用程序的產品 被提供給用戶。例如,如果用戶購買了遊戲中的貨幣 貨幣,則應該使用購買的貨幣數量 更新玩家的廣告資源。

至於如何在離線時存儲和管理庫存,您提到的方式聽起來很好。加密不會造成傷害,但只要您在合理的時間間隔與Google進行協調,就可能不需要加密。實際上只有極少數人嘗試利用應用程序。大多數用戶不是root用戶,對於那些用戶來說,大多數用戶並不知道如何實現這些漏洞。如果你仍然擔心,是的,繼續加密。這應該足夠威懾,以保證絕大多數用戶的誠實。

+0

是的@hungryghost,這裏好點。我不認爲你應該打擾少數作弊者,因爲絕大多數人甚至不會嘗試破解或利用應用內攻擊。 – Leonardo

0

即使你離線時發送的加密字符串密碼和存儲在本地,那些誰多放些精力仍然能夠進行逆向工程您的應用程序,並找出字符串來解密密碼。混淆你的應用只是爲了讓黑客更努力地工作,但並非不可能。否則,黑客根本就不存在。