应用内购买:动态添加非消耗品

15
我正在开发一个应用程序,用户可以购买数字地图、图表等内容。我想将它们包装成应用内购买项目(in-app-purchases)。问题是,我不知道会有多少个图表,因为它们来自网络上的另一个来源。可能会有数百个。
我有一个服务器,定期从该来源获取图表并在本地存储;未来可能会出现新的图表或消失现有的图表,而无需人工干预。
这里有三种不同类型的图表。
我的第一种解决方案是创建三个可消耗项(consumable items),让用户购买这些项;这很好用,但不幸的是,苹果公司拒绝了它,因为他们要求图表是“非消耗品”。
但我不知道如何使用非消耗品实现我想要的功能。如果我将这三种类型设置为非消耗品,并且用户购买其中一种,他将免费获得该组中的所有其他图表,因为非消耗品只能购买一次。
我唯一能想到的解决方案是为每个单独的图表创建一个非消耗品项目。但那是我想尽一切办法避免的事情:现在,图表定期从远程源获取,我不需要进行任何手动操作。我希望保持这种状态。我不想每次出现新图表时手动创建新的非消耗品购买。
有什么办法可以使它具有可扩展性吗?
4个回答

20

我不能只用代码完全解释给你,但是你可以有两种方法来处理这个问题:

货币。 您不销售非消耗品,例如地图。您出售货币。使用该货币购买地图。每当用户访问您的商店时,您会动态提供地图。这样,您只需要跟踪几个购买选项。

另一种选择: 我为之工作的公司最初设置得非常简单。我们的应用程序将启动,然后我们将联系一个PHP脚本,该脚本将返回我们所拥有的应用商店ID。此时,我们将验证它们并使用有效返回。此选项允许我们通过iTunes Connect更改应用内购买,然后在脚本中进行更改,一切都很好。


货币模型听起来很有趣,你能详细解释一下吗?应该将应用内购买的货币设置为可消耗品吗?这样我就可以拥有一个应用内购买项目,比如“地图货币”(可消耗),用户可以使用它从服务器下载任何地图。我在想这是否会完全规避苹果的应用内购买指南,他们会因此而拒绝它。谢谢。 - Thomas Wana
好的,根据App Store审核指南(第11.4节),只要应用内货币不会过期并且在应用内使用,就可以使用应用内货币。我想我会尝试这个方法。感谢您指引我,奖励已发放! - Thomas Wana
@ThomasWana 好奇想知道,这个被苹果公司批准了吗? - Pranav Jaiswal
我们已发布多个获得苹果批准的应用。其中一个下载量超过250k。它符合苹果指南的要求。 - Sandoze

5
这是一篇较早的文章,但我有同样的问题,在这里了解到现在可以通过将产品标识符列表托管在自己的服务器上来动态提供非消耗品:
每个你在应用中销售的产品都有一个唯一的产品标识符。您的应用程序使用这些产品标识符从 App Store 获取有关产品的信息,例如定价,并在用户购买这些产品时提交付款请求。您的应用程序可以从其应用程序包中的文件中读取其产品标识符列表或从您的服务器获取它们。
如果您的应用程序具有固定的产品列表,例如在应用内购买以删除广告或启用功能,请将列表嵌入应用程序包中。如果产品标识符列表可以在不需要更新应用程序的情况下更改,例如支持其他级别或角色的游戏,请让您的应用程序从您的服务器获取列表。
在运行时没有获取 iTunes Connect 中为特定应用程序配置的所有产品的列表的机制。您负责管理应用程序的产品列表并向您的应用程序提供该信息。如果您需要管理大量的产品,请考虑在 iTunes Connect 中使用批量 XML 上传/下载功能。
参考:Apple Developer In-App Purchasing Guide

3
我认为你对项目的限制非常巨大,可能达到了10,000左右。
预先创建大量项目,并添加一些代码来检查您网站上的最高图表编号,并确保用户只能购买您拥有的图表。
应用程序从您的服务器下载图表名称和相应的产品ID,然后您只需购买产品即可。
苹果不关心实际产品是否已在应用程序中解锁并从其服务器下载,或者是从您的网站提供。

我也对项目限制感到好奇。 "对于每个应用程序,您可以创建多达1000个单独的应用内购买产品" 〜iTunes Connect应用内购买配置指南:配置产品 - Korey Hinton

3
无论您是直接通过IAP购买还是通过某种应用内“货币”购买的,您都可以使用命名系统来为每个要出售的物品保证唯一的地图名称,从而简化将来需要进行的工作量。例如:
 NSString *myMapName = [NSString stringWithFormat:@"%@%@%@%@", app_identifier, map_type, top_left_corner_location, scale];

如果您的服务器传递了新地图的信息,那么就有一种编程方式可以知道IAP标识符应该是什么——只需将其设置为字符串myMapName的值即可。
如果您使用货币(这听起来比另一种选择更容易,并且许多大型应用程序似乎正在使用),则只需在地图中使用一些数据来创建哈希,以便人们无法猜测您存储在他们的钥匙串/属性列表中的代码,并神奇地获取所有地图而不支付任何费用:)
如果您实际上对每个地图都有单独的IAP,则必须为每个可能的地图制作一个IAP。 (但您可以雇用一些孩子以最低工资完成此部分,对吧?这只是数据输入)。它们可以是基本外壳,但是一旦验证购买了地图,实际信息将通过您的服务器提供,如上所述。
希望这可以帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接