【问题标题】:Using a Generic In-app Purchase使用通用应用内购买
【发布时间】:2026-02-13 21:45:01
【问题描述】:

我正在完成一个 iOS 应用程序的工作,该应用程序允许用户浏览、购买和下载来自 Rails 应用程序在线托管的大型多媒体库中的项目。图书馆目前有数百种可购买的物品,未来可能会大大扩展。

起初,我打算为库中的每个项目创建一个单独的应用内购买项目(在 iTunes Connect 上)。但是,我认为创建所有这些数百个应用内购买项目会很痛苦。此外,我希望能够通过我的 CMS 对可购买的物品进行添加和更改,而不必在 iTunesConnect 上进行更改。

相反,我现在让应用用户使用 rails 应用创建一个帐户。当他们去购买一个项目时,他们首先购买一个通用的应用内购买项目。交易完成后,应用程序会连接到我的 rails 应用程序,记录购买并下载购买的内容。

让我对这种方法感到紧张的一件事是,用户可能成功地通过 Apple 进行了应用内购买,但后来不知何故未能成功连接到 rails 应用程序。在这种情况下,即使用户进行了支付,购买也不会被记录,内容也不会被下载。此外,Apple 的内置购买恢复方法将不起作用,因为购买项目是通用的。只有我的 rails 应用会记住用户购买了哪些商品。

所以,我将围绕整个过程添加大量错误检查和状态恢复。以确保它在遇到问题时能够恢复。

我只是想把它放在那里,以防有人有意见或建议要分享。

谢谢!

查理

更新

现在已经很久了,但我最终没有使用通用的应用内购买。这似乎是一个太大的风险。毕竟,对于单独的应用内购买,Apple 会跟踪购买并提供恢复它们的方法。因此,利用这一点而不是强迫自己维护自己的用户及其购买数据库是有意义的。

将所有应用内购买项目添加到 iTC 真是让人头疼。 iTC界面太可怕了。我遇到了很多问题。但最终他们都进入了那里,现在事情或多或少地进展顺利。

所以最后,我想说,尽管创建所有这些购买很痛苦,但它是值得的。或者说应该值得。如果在 iTC 中创建该购买记录似乎不值得您通过出售它来获得收益,那么您的商业模式可能会遇到更大的问题!

【问题讨论】:

  • 虽然看起来是一种非常明智的方法来绕过 Apple 目前创建产品 ID 的笨拙过程,但我很想知道您的应用程序是否已获得 Apple 的批准?事实上,他们似乎必须在上线之前批准每个应用内产品 ID 的内容,这让我怀疑他们可能不会批准......
  • 您的应用是否使用通用应用内购买项目获得批准?

标签: iphone ruby-on-rails-3 in-app-purchase app-store-connect


【解决方案1】:

一旦苹果返回成功的应用内消息...

1.最好将ProductID存储在字典中,并在成功更新服务器后从字典中删除ProductID。

2.在事务完成之前忽略任何事件。

3.更好地跟踪交易,即在服务器端存储交易信息(产品ID、用户、交易收据)。

3.您可以选择通过网站提供服务,如果用户在应用内购买过程中损失了钱,可以邮寄给您。

【讨论】:

  • 感谢您的回答。实际上,存储 productID 无济于事,因为我使用的是通用的应用内购买。但是,我将存储有关在设备上购买的旅行的元数据,直到交易成功记录在我的服务器上。因此,真正出错的唯一方法是,如果我完成服务器事务的代码失败,或者用户从苹果购买并在记录服务器事务之前以某种方式从他们的设备上擦除应用程序。不过,这让我很紧张!一旦他们付款,我想确保他们得到他们所支付的。
【解决方案2】:

交易完成后,您可以做的一件事是在本地保存购买收据(保存到 NSUserDefaults 或您使用的任何持久性方法),这样如果您无法“完成购买”(即记录它并从服务器下载您的内容)您可以随时恢复它。

如果您仍然担心此操作(即在更新服务器之前将购买收据保存在本地)可能由于某种原因而失败,或者甚至担心用户可能会在付款后和无法记录之前删除/重新安装应用程序在您的服务器上,您始终可以在您的服务器上记录用户在实际进行应用内购买之前启动应用内购买,然后在他完成/取消后更新其状态。

顺便说一句,您没有提到它,只是为了安全起见:您只是将购买收据从您的客户端传递到服务器,对吗?这是您在交易中唯一需要的,因为您可以(并且应该)然后 verify the receipt with Apple 并使用它来提取所有其他购买信息(如产品 ID 等)。

【讨论】:

  • 感谢您的回答!你的第一个建议正是我正在做的。让我担心的只是应用内购买和在我的服务器上记录之间的差距,但这可能不会成为一个非常普遍的问题。您的最终建议不适用于我的系统,因为我目前已经设置了它。那是因为我对所有应用内购买都使用通用应用内购买产品。从苹果购买的产品没有任何信息说明我的服务器上实际购买了哪个产品。
  • 好的,但至少检查从收据中检索到的价格是否与您预期的价格相符:)(否则,您可能会尝试使用收据购买更便宜的产品 - 也就是说,如果您有多个价格不同的产品)。
  • 确实!现在所有商品都有统一的价格,但如果我们开始有不同的价格点,我将不得不这样做。