如果您正在构建一个需要购买多次内容的游戏或应用程序,你需要整合应用内购买消费品(IAPS)到您的应用程序。在我的前一篇IAP博文中,我教你设置你的应用程序为IAP交易基础, 添加IAP项目到谷歌应用商店或者iTunes连接,并介绍了Xamarin应用收费插件,大大简化了添加IAP应用程序的代码的过程。今天,我们将看一下消耗品,以及它们对开发过程的细微调整。

可消费品的概念是,它们是在应用程序生命周期中消耗掉的项目,因此,可多次购买。这些例子都是游戏币,如上面显示的猴子信用,额外的健康,并一次性服务,如歌曲。

建立耗材

谷歌不作非消费品和消费品之间的真正区别,只有API在它们之间有所不同。对于iOS,苹果要求开发者在iTunes连接中创建IAP时预先指定这些信息。

Consumables

这里的想法是,当我们向iTunes服务器发出请求时,这个选择将在购买过程中触发正确的流。

购买和消费

对于iOS和Android,我们要确保我们的应用收费插件应用收费插件通过NuGet安装在我们的解决方案中的所有项目。  iOS和Android各自处理耗材的方式有点不同,我们先从iOS开始,它与我们前面讨论过的非消耗品有非常相似的流程。

这个图显示的购买决策的步骤;我们必须:

  1. 请求我们在队列中付款。
  2. 将请求发送到服务器。
  3. iTunes处理和返回。
  4. 应用中的进程接收。
  5. 在应用程序中显示购买信息。

如果这个图看起来很熟悉,那是因为它和非消耗品的流动完全相同。因此,我们要做的就是打电话给PurchaseAsync的方法和我们的消费品购买和准备!由于我们将IAP作为一种消耗品,我们可以不断地购买该产品。

 try
{
    var productId = "mysku";
 
    var connected = await CrossInAppBilling.Current.ConnectAsync();
 
    if (!connected)
    {
        //Couldn't connect to billing, could be offline, alert user
        return;
    }
 
    //try to purchase item
    var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase, "apppayload");
    if(purchase == null)
    {
        //Not purchased, alert the user
    }
    else
    {
        //Purchased, save this information
        var id = purchase.Id;
        var token = purchase.PurchaseToken;
        var state = purchase.State;
    }
}
catch (Exception ex)
{
    //Something bad has occurred, alert user
}
finally
{
    //Disconnect, it is okay if we never connected
    await CrossInAppBilling.Current.DisconnectAsync();
} 

对于Android,在这个过程中还有一个步骤。我们必须首先调用上面的代码来实际购买易耗品,然而,谷歌的消耗品的集成集成了用户可以购买消费品并在将来实际使用它的场景,例如购买硬币,但后来在游戏中兑现它们。这意味着我们不能再购买消耗品,直到我们真正确定购买和“消费”它。为此,该插件有一个额外的方法,ConsumePurchaseAsync,以在具体的购买信息。如果调用此方法在iOS上,它只会返回null。我们可以使用设备信息插件,Android上叫ConsumePurchaseAsync来为我们完成购买:

 // Called after we have a successful purchase or later on (must call ConnectAsync() ahead of time):
if(CrossDeviceInfo.Current.Platform == Platform.Android)
{
     var consumedItem = await CrossInAppBilling.Current.ConsumePurchaseAsync(purchase.ProductId, purchase.PurchaseToken);

    if(consumedItem != null)
    {
        // Item has been consumed
    }
} 

了解更多

还有很多更多的IAPs,包括订阅和产品信息,这些信息暴露在应用程序插件插件中。你可以在GitHub项目找到更多关于这个README文件中的信息。同样的文档还可以帮助你了解应用程序集成的完整设置、测试和故障排除指南。另外,我强烈推荐阅读完整的文档在iOSAndroid应用内购买。