我正处于完成我的第一个应用程序的边缘,剩下的最后一件事就是实现IAP计费,这就是为什么我目前正在阅读相关主题(包括加密,混淆和东西等安全问题).
我的应用程序是免费版本,能够通过IAP升级到完整版本,因此只有一个托管购买项目"溢价".我有几个问题:
在Google IAP API示例(trivialdrivesample)中,总是在MainActivity中检查IAP以查看用户是否购买了高级版本,通过
mHelper.queryInventoryAsync(mGotInventoryListener);
我的第一个问题:这是否意味着用户始终需要在应用启动时拥有互联网/数据连接,才能切换到高级版本?如果用户没有互联网连接怎么办?他会选择我猜的精简版,我觉得这很烦人.
所以我想到了如何在SharedPrefs或app数据库中本地保存isPremium状态.现在,我知道你无法阻止黑客对应用程序进行逆向工程,无论如何,即便如此,因为我没有服务器来进行服务器端验证.
然而,一个人根本无法在某处保存"isPremium"标志,因为这太容易被发现.
所以我在考虑这样的事情:
- 用户购买Premium
- 应用程序获取IMEI/Device-ID,XOR使用硬编码的String键对其进行编码,并将其保存在应用程序数据库中.
现在,当用户再次启动应用程序时:
- App从数据库中获取编码的String,对其进行解码并检查decodeString == IMEI.如果是 - >溢价
- 如果不是,则将调用正常的queryInventoryAsync以查看用户是否购买了premium.
您如何看待这种方法?我知道这不是超级固定,但对我而言,更重要的是用户不会烦恼(比如强制性的互联网连接),而不是应用程序将无法解决(无论如何这是不可能的).你有其他一些提示吗?
另一件事,我目前还不知道,是当用户卸载/重新安装应用程序时如何恢复事务状态.我知道API有一些机制,并且我的数据库可以通过应用程序导出和导入(因此编码的isPremium标志也可以导出/导入).好吧,我猜这将是另一个问题,当时机成熟时;-)
对这种方法的任何想法和评论都是受欢迎的,您认为这是一个很好的解决方案吗?或者我错过了什么/朝着错误的方向前进?