1

我有一个应用程序,每个用户有几个实体。用户可以为每个实体做 IAP。当我将付款添加到 SKPaymentQueue 时,我知道购买是针对哪个实体完成的。

如何从updatedTransactions回调中获取此信息?

我尝试将购买交易中的交易标识符与购买交易中的交易标识符进行匹配该值仅存在于购买交易中。

我尝试使用应用程序用户名:

func buyProduct(_ product: SKProduct) {
    let payment = SKMutablePayment(product: product)
    payment.applicationUsername = "character ID"
    SKPaymentQueue.default().add(payment)
}

但是文档提到它不可靠,仅用于欺诈检测。

它在大多数情况下都有效,但 Apple 不保证在回调事务中返回它。

4

2 回答 2

1

产品类型

您可以提供四种产品类型:

  • 消耗品
  • 非消耗品
  • 自动更新订阅
  • 非续订订阅

让我们在这里跳过订阅,关注(非)消耗品。有什么不同?

  • 消耗品
    • 用户可以多次购买
    • 它们未同步且无法恢复
    • 一个例子 - 在应用货币中,你可以重复购买任何数量,......
  • 非消耗品
    • 用户可以购买一次(仅限数量 1)
    • 它们已同步并可恢复
    • 一个例子 - 解锁应用程序功能,功能包,......

身份标识

每个产品都有一个唯一标识符 ( productIdentifier)。它可以从任何地方访问:

自定义数据

您可以将自定义数据分配给交易吗?不,只有 applicationUsername你提到的。但它有以下缺陷:

不保证该applicationUsername属性在您将支付交易添加到队列和队列更新交易之间持续存在。请勿尝试将此属性用于提供欺诈检测以外的目的。

您不能将其用于自定义数据。即使你试图滥用它,它仍然没有用,因为它不能保证持续存在。

购买非消耗品

这是简单的部分,因为它允许用户只购买一次。您拥有productIdentifier随处可用的内容,然后您可以解锁功能、下载内容、...

但这显然不是你想要的。无论如何,您也可以通过这种方式实现您想要的,但是您必须为每个实体以及实体和用户组合创建一个独特的产品。这可能会导致数百万个产品标识符。我可以想象这将是一场维护噩梦。

购买消耗品

这部分比较棘手,因为作为应用程序开发人员,您需要负责:

  • 将其转换为任何应用商品(货币、游戏角色……)
  • 使其在所有用户的设备上可用
  • 使用户能够恢复过去的购买

换句话说-消耗品的行为与任何其他支付网关(Stripe,...)一样-您知道用户为特定支付了您的费用productIdentifier,仅此而已-其他所有内容都必须在您的应用程序中,在您的服务器上处理,...

一个例子

想象一下,您有一个游戏,用户可以在其中购买新的游戏角色。有两种方法可以实现这一目标。

非消耗品

  • 每个游戏角色都有独特的productIdentifier
  • 用户只能购买每个角色一次
  • 您可以恢复这些购买

优点:

  • 您身边的少量工作

缺点:

  • s的列表productIdentifier可以增长很多,特别是如果你有很多字符,它们对于每个用户来说确实是不同的,等等。

消耗品

  • 您有一个自定义应用程序货币,用户可以用它来兑换任何游戏角色
  • 您可以在应用程序中提供购买产品,例如
    • 学分 10
    • 学分 50
    • 信用 100
    • ...
  • 你必须在上面建立自己的商店StoreKit
    • 向用户展示他有多少信用
    • 允许他购买任何游戏角色
    • 信用够吗?只需将其标记为已购买
    • 信用不够?通知用户并让他购买更多信用
      • 同时,将他想购买特定游戏角色的地方存储起来
      • 当他有足够的信用(在应用程序购买中)时,查看您的存储并将其兑换为游戏角色

优点:

  • 灵活性
  • productIdentifier短名单

缺点:

  • 同步在你身上
  • 恢复在你身上
  • 顶部的自定义商店StoreKit在您身上
  • StoreKit充当您的任何其他支付网关
于 2020-07-19T21:46:49.397 回答
0

Apple 的 API 中无法将交易与特定实体关联,因此您必须自己进行关联。

我只能想到两种方式:

  1. 您可以注册一个有状态的回调处理程序来处理特定实体,但您必须在应用程序中阻止来自同一用户的多个并发购买。购买完成(成功/失败)后,您将删除处理程序。
  2. 如果您可以订购的实体数量有限(例如,每个用户最多 10 个),您可以注册 10 个产品(product-for-entity-1、product-for-entity-2 等 - 每个实体一个)和当用户为编号实体购买时,购买正确的。这样您就知道订阅应用到了哪个实体。

除此之外,Apple 的 API 不会将已启动的事务与已完成的事务关联起来(例如,通过事务 id 或允许元数据)——这使得将用户操作与其初始原因相关联变得非常困难。

这在用户体验方面非常糟糕,因为用户必须在一个可能长时间运行的过程中进行两次交互,而没有明显的原因。

于 2020-07-23T12:36:58.020 回答