在 Xamarin.iOS 中购买非易耗型产品

非易耗型产品由客户“拥有”。 预期是,即使设备丢失/被盗或购买新设备,客户也始终有权访问这些产品。 它们适用于书籍、杂志问题、游戏级别、照片筛选器、“专业功能”等。一旦用户购买了非易耗型产品,他们就再也不必再付费了。 如果代码意外让他们再次付费,StoreKit 也将显示已购买的消息。

非易耗型产品示例

此示例包含名为“NonConsumables”的项目。 该代码示例演示如何使用照片筛选器作为示例实现非易耗型产品。 购买筛选器后,可以反复将它应用于照片。 你永远不需要重新购买它。

此系列屏幕截图显示了购买过程 -“购买”按钮将成为功能激活按钮:

此系列屏幕截图显示了购买过程

购买过程与易耗品的购买过程相同;主要区别在于如何在应用程序代码中跟踪购买。 在此示例中,仅当产品尚未购买时,“购买”按钮才可用,否则该按钮将激活该功能本身。

下图显示了类与 App Store 服务器之间的交互,用于执行非易耗型产品的购买:

类与 App Store 服务器之间的交互,用于执行非易耗品购买

易耗型产品示例的主要区别在于,一旦购买完成,用户界面就会更新,以防止重新购买。 在此示例中,成功交易的通知会更新用户界面,以便“购买”按钮转换为激活功能本身的按钮。

重新购买非易耗型产品

成功购买产品后,代码通常会隐藏或重新调整购买按钮的用途,以防止用户再次尝试购买该产品。 示例应用程序通过将“购买”按钮更改为使示例照片筛选器正常工作的按钮来执行此操作。

在某些情况下,应用程序无法判断是否已购买非易耗型产品:

  • 如果在设备上删除并重新安装应用程序,则所有购买记录都将消失(除非/直到用户执行备份还原)。
  • 如果用户在两台(或更多)设备上安装了应用程序,并在其中一台设备上进行购买。 其他设备将继续显示该产品可供购买。
  • 如果客户尝试在这些情况下重新购买非易耗型产品,App Store 将再次提供该产品,而无需付费。 用户界面最初将显示为执行购买(例如,显示确认警报,并且需要 Apple ID),但用户随后将看到一条消息,告知他们产品已购买。

此方案中的代码路径与常规购买的完全相同,唯一的区别是:

  • 用户无需再次为产品付费。
  • 传递给应用程序的 SKPaymentTransaction 对象将具有一个 OriginalTransaction 属性,该属性引用最初购买产品时生成的事务。
  • 销售非易耗型产品的应用程序还必须实现 StoreKit 的“还原”功能,以帮助用户检索现有购买。