5

在可通过 Google Play 获得的 Android 应用中,我想提供可通过应用内结算购买的其他商品。

我想提供的项目类型是媒体内容,例如图形和声音,通常会进入res应用程序的文件夹。

当然,问题是这些资源必须受到保护。在其文档中,Google 建议不要将内容存储在应用程序包中,而是在购买项目后获取密钥,然后将密钥发送到远程服务器,在那里检查密钥,如果成功,提供的图形/声音下载到应用程序。

从安全的角度来看,这听起来不错。但是如果我这样做了,我就不能像正常访问资源那样容易地使用内容了。例如,如果用户可以获得额外的背景 PNG,我不能使用R.drawable.new_background但必须以编程方式解码位图,对吗?

那么,通过应用内计费下载其他媒体内容是否有任何替代方案或最佳实践?

我想说,既然每个有足够决心的人都可以对代码进行逆向工程,那么为什么不只是将内容存储在应用程序中,而是要严格检查用户是否会使用该内容。

4

4 回答 4

3

答案在某种程度上取决于您的具体问题,根据您的问题,可能是以下 1 或 2:

1) 我担心有人可以我的应用程序中使用我的资源而无需付费,或者

2) 我担心用户(已付费或未付费的用户)删除我的资源并在我的应用程序之外使用它们。

您的问题(但其他人试图解决的问题)似乎没有表明另一种可能性是:

3)我担心我的初始APK下载太大,因为下载了大量的资源,只有他们用户会决定使用其中的一部分。

如果您唯一关心的是第 1 项,那么您可以像往常一样存储您的资源,但在您的应用程序内部,拒绝加载/使用您尚未收到应用程序内付款的任何资源。这当然是最简单的方法。

如果您关心的是第 2 项,那么您可以在您的 APK 中包含原始文件夹中的加密二进制存档,并在该资源被授权(例如,通过付款)供应用程序使用时从中解码特定资源。正如其他人所指出的,这在处理器负载方面并不是什么大问题,它确实提供了一些防止意外盗窃的保护。当然,如果您要与那些破坏您的加密并窃取您的资源的“创意抄袭”矛盾者之一打交道,总是有版权法。

如果您关心的是第 3 项,那么您将需要一个可以从中检索您的项目的外部服务器。在应用程序外部实施这种存储时,Google App Engine 是一种流行的托管选择。您可能只想将任何购买/下载的资源缓存在应用程序自己的外部文件夹中的加密存档中(由 getExternalFilesDir() 返回),然后按照上面的第 2 项读取和解密它。当您的应用程序被卸载时,这些文件将被自动删除。

于 2013-02-05T03:46:25.153 回答
2

不在应用程序中存储额外内容的明显原因之一是应用程序的应用程序下载大小。如果您将音频作为附加内容提供,它会显着增加应用程序的大小。用户关心它。此外,它还可以更轻松地发布其他内容,因为您可以通过服务器端/开发人员控制台来完成,而无需发布应用程序更新。此外,如果您想提供高质量的图形,您将能够直接向设备提供适当版本的图像,而无需存储所有密度/屏幕尺寸版本。

如果您担心安全性,您始终可以使用加密和签名来访问资源,并通过适当地混淆您的代码(甚至将与安全/解密相关的代码移动到本机端,这也将使其更快)使攻击者的生活更加困难。

是的,这会产生一个缺点,您必须以编程方式对它们进行解码,并且对此无能为力。老实说,我不明白它为什么这么重要,相反,我认为您将拥有更多数据驱动的资源访问权限非常方便。

作为总结,我真的不认为有任何标准可以做到这一点,这取决于您的应用程序和内容类型。如果您提供固定数量的 5-10 张图片,那么将它们保存在本地是完全可以的,如果内容更丰富、项目更多、资源更重,那么客户端-服务器更适合您。

于 2013-02-04T17:57:57.530 回答
1

一种解决方案肯定是以下方法,其中两个应用程序共享相同的用户 ID。但这显然不如应用内购买那么优雅,而且有点hacky。

  1. 创建两个应用相同android:sharedUserId的应用AndroidManifest.xml
  2. 将付费内容存储在第二个应用程序中,即从现在开始的库应用程序,仅包含那些图像(除了必要的文件夹和清单)
  3. 使用相同的密钥为两个 APK 签名
  4. 像往常一样免费提供第一个应用程序,并将第二个应用程序设为付费应用程序
  5. 在免费应用程序中,使用PackageManager检查是否安装了第二个 APK
  6. 如果是,则使用为第二个应用程序createPackageContext()创建一个Context,然后用于从第一个应用程序访问第二个应用程序的资源
于 2013-01-29T19:32:57.953 回答
0

Google Play 提供可购买的扩展包。这些是可以在购买后下载的大型扩展程序,并且与您的应用程序是分开的。这是一种可能性。

http://developer.android.com/google/play/expansion-files.html

根据您想要的安全程度以及媒体的大小,您可以使用密钥加密媒体,并将其与您的应用程序一起存储。它将与应用程序一起下载并安装,但无法访问。应用内购买完成后,您可以解密内容并将其提供给用户。您可以将密钥存储在应用程序的源代码中以对其进行解密,也可以在您自己的服务器上验证购买并从您的服务器检索密钥。

于 2013-01-29T17:07:21.617 回答