Android 在设备上存储应用内项目数据

Android 在设备上存储应用内项目数据,android,encryption,in-app-purchase,Android,Encryption,In App Purchase,我想在我的应用程序中添加应用程序内购买功能,我想知道存储产品可用数量(例如100枚硬币)的推荐方法 具有root访问权限的用户可以: 访问/操作应用程序存储的未加密数据(以便他可以更改 硬币数量) 保存加密(或模糊)的数据,然后稍后替换它以恢复数据 说明他什么时候有更多的硬币 因此,即使使用加密,也相对容易作弊。我的问题是: 我应该走得比encrytion更远吗?(这样做值得吗?) 用户滥用此功能是否常见 有没有更好的方法来存储物品计数 这种做法是什么 在本地存储您的游戏世界货币,让交易在

我想在我的应用程序中添加应用程序内购买功能,我想知道存储产品可用数量(例如100枚硬币)的推荐方法

具有root访问权限的用户可以:

  • 访问/操作应用程序存储的未加密数据(以便他可以更改 硬币数量)
  • 保存加密(或模糊)的数据,然后稍后替换它以恢复数据 说明他什么时候有更多的硬币
因此,即使使用加密,也相对容易作弊。我的问题是:

  • 我应该走得比encrytion更远吗?(这样做值得吗?)
  • 用户滥用此功能是否常见
  • 有没有更好的方法来存储物品计数
  • 这种做法是什么

在本地存储您的游戏世界货币,让交易在本地进行,无需网络连接,但当用户重新连接到互联网时,请将本地硬币与服务器显示的已购买硬币进行核对

基本上,当你有网络连接时,从谷歌下载任何购买的应用内产品。检查您的库存,然后根据用户在脱机时所做的操作,消费应减少的任何产品。执行此操作后,如果本地总数与服务器显示的内容(消费后)存在差异,则将其标记为潜在黑客。否则,你就很好(一切都很平衡)

当使用像这样的可消费的应用程序内产品时(听起来像你正在尝试这么做),真的没有完全离线的方式。你依赖谷歌的应用内计费服务,因此你必须不时检查他们的服务器,以核对/刷新购买的库存。来自谷歌的:

要记录购买消费,请将
consumerpurchase
方法发送到 应用内计费服务并传入
purchaseToken
字符串值 标识要删除的采购的。
purchaseToken
是一部分 Google在
INAPP\u PURCHASE\u data
字符串中返回的数据的 在成功的购买请求后播放服务。在这个例子中, 您正在记录标识为的产品的消费量 令牌变量中的purchaseToken

int response=mService.consumerpurchase(3,getPackageName(),令牌)

警告:不要在主线程上调用
consumerpurchase
方法。 调用此方法会触发网络请求,该请求可能会阻止 主线程。相反,创建一个单独的线程并调用
consumerpurchase
方法

您有责任控制和跟踪应用程序内产品的运行方式 已向用户提供。例如,如果用户在游戏中购买 货币,你应该更新玩家的库存量 购买的货币


至于如何在离线时存储和管理库存,您提到的方法听起来不错。加密不会有什么坏处,但只要你在合理的时间间隔内与谷歌和解,就可能没有必要。只有一小部分人真正尝试利用应用程序。大多数用户不使用root,而对于那些使用root的用户来说,他们实际上不知道如何利用这些漏洞。如果您仍然担心它,是的,请继续加密。这应该足以让绝大多数用户保持诚实。

即使你在脱机时用字符串加密密码并在本地存储,那些付出更多努力的人仍然能够对你的应用程序进行反向工程,找到字符串来解密密码。混淆你的应用程序只是为了让黑客更加努力工作,但并非不可能。否则,黑客根本就不存在。

最好保存在服务器中,如果用户离线怎么办?我仍然必须将其存储在本地以允许脱机模式。在本地保存这些数据总是容易受到root访问的攻击。我知道。这就是我问这个问题的原因:)我必须将其存储在本地,这是一个常规的移动应用程序。离线模式是必须的。为什么不将它们存储在服务器上,并且不允许在离线时进行购买呢?是的@hungryghost,这一点很好。我认为你不应该为少数作弊者操心,因为绝大多数人甚至不会尝试黑客或利用应用内黑客。