iOS 进阶IAP 苹果支付

iOS内购IAP(十八) —— 自动续订订阅(一)

2019-05-07  本文已影响268人  刀客传奇

版本记录

版本号 时间
V1.0 2019.05.07 星期二

前言

大家都知道,iOS虚拟商品如宝石、金币等都需要走内购,和苹果三七分成,如果这类商品不走内购那么上不去架或者上架以后被发现而被下架。最近有一个项目需要增加内购支付功能,所以最近又重新集成并整理了下,希望对大家有所帮助。感兴趣的可以参考上面几篇。
1. iOS内购IAP(一) —— 基础配置篇(一)
2. iOS内购IAP(二) —— 工程实践(一)
3. iOS内购IAP(三) —— 编程指南之关于内购(一)
4. iOS内购IAP(四) —— 编程指南之设计您的应用程序的产品(一)
5. iOS内购IAP(五) —— 编程指南之检索产品信息(一)
6. iOS内购IAP(六) —— 编程指南之请求支付(一)
7. iOS内购IAP(七) —— 编程指南之促进应用内购买(一)
8. iOS内购IAP(八) —— 编程指南之提供产品(一)
9. iOS内购IAP(九) —— 编程指南之处理订阅(一)
10. iOS内购IAP(十) —— 编程指南之恢复购买的产品(一)
11. iOS内购IAP(十一) —— 编程指南之准备App审核(一)
12. iOS内购IAP(十二) —— 一个详细的内购流程(一)
13. iOS内购IAP(十三) —— 一个详细的内购流程(二)
14. iOS内购IAP(十四) —— IAP的收据验证(一)
15. iOS内购IAP(十五) —— IAP的收据验证(二)
16. iOS内购IAP(十六) —— 添加介绍性定价选项(一)
17. iOS内购IAP(十七) —— 添加介绍性定价选项(二)

开始

首先看下写作环境

Swift 5, iOS 12, Xcode 10

自动续订订阅非常棒。他们可以帮助您将已经非常棒的应用程序提升到一个新的水平,并帮助您在此过程中获得额外的收入。如果您的应用提供一致或可更新的内容或集合,则添加对应用内购买(IAP)订阅的支持可能是个好主意。

自动续订订阅提供了一种为用户提供持续访问应用更新内容的方式 - 为他们提供出色的用户体验和访问他们关注的内容,同时为您提供吸引人的商业模式。

通过自动续订订阅,您不必坚持苹果通常提供的旧70/30收入分配。为了激励您为用户提供持续的价值,Apple会在第二年开始时将您的份额提高到85%。

注意:如果用户取消订阅 - 并且未在60天内续订 - 或切换到另一个订阅组(稍后更多),则重置计入一年标记的天数。因此,请确保您的订阅提供了用户长期希望保留的体验。

您是否已经确信您的应用可以从自动续订订阅中受益?太棒了,因为在本教程中你将学习如何做到这一点。

前面提到几件重要的事情。首先,对于本教程 - 并且通常与IAP一起工作 - 您将需要一个付费的Apple Developer帐户。免费版本不允许您设置应用内购买。其次,您需要在本教程中使用真实设备。模拟器不支持应用内购买。

为了演示向您的应用添加自动续订订阅的过程,您将使用令人喜爱的“Words of Wisdom by Winnie the Pooh”应用。这是一个非常简单的应用程序,非常适合演示IAP订阅。

该应用程序的初始版本提供了一个可自动更新的IAP - 从Winnie the Pooh获得随机智慧之言一整个月的权利!这足以照亮任何人的一天。但是,由于显然人们希望继续使用它的时间更长,因此您还应该提供年度订阅选项。这对于应用程序的忠实用户来说将更有价值。

但是,在深入了解实施细节之前,您可能了解应用程序内购买。

这里有一些重要的免责声明:


Setting Up the Project

好的,所以你有启动项目。要使其工作,您需要在项目本身和App Store Connect上进行更改。完成所有这些步骤后,您将拥有一个可运行的应用程序,其中包含一个可自动更新的订阅产品。

在创建自动续订订阅的过程中,App Store Connect会要求您定义订阅组(subscription group)。订阅组基本上是订阅产品的集合。您可以在下一部分中了解有关订阅组的更多信息,但是现在,只需为新的自动续订订阅创建一个新的订阅组。称之为PoohWisdomSubs

确保完成新创建的应用程序内购买的所有元数据,包括审阅信息(Review Information)。您可以将此图片this image用于评论截图。

请注意“订阅持续时间”(Subscription Duration)字段,该字段特定于“可续订订阅”(Renewable Subscriptions)。这是订阅将自动续订的持续时间,除非用户选择退出。在许多情况下,您的应用提供的各种IAP选项之间的唯一区别将是订阅持续时间和与之相关的价格。内容本身不会更改 - 您的用户可以在多个订阅选项之间进行选择,以便访问相同的内容。

将持续时间设置为1个月(1 Month),将订阅价格(Subscription Price)设置为0.99美元。

SUBSCRIPTION GROUPS下的左侧导航栏中选择PoohWisdomSubs并添加本地化。

完成后,您的新应用程序内购买的状态将显示为准备提交Ready to Submit

好的,现在是开始项目的时候了! 只需几个步骤,您将拥有一个有效的初始应用程序:

接下来,在您要测试的设备上,打开iOS Settings应用,然后点击iTunes & App Store

点按您的Apple ID,然后点按Sign Out。 此时,实际上并未使用沙箱用户登录。 当您尝试在应用中购买IAP时,您将执行此操作。

构建并运行项目,您将在项目控制台中看到:

Not purchased: $MyIAPID
Loaded list of products...
Found product: $MyIAPID $GroupID $Pricing

如果你看到这个 - 恭喜! 您有一个可自动续订IAP的工作应用程序。 但是不要太舒服。 你刚刚开始。

如果您看到其他内容,请确保您在上述步骤中没有遗漏任何内容:

点击购买(Purchase)

输入您在App Store Connect上创建的沙箱帐户的用户名和密码,点击Continue,然后点击以下弹出窗口中的OK。 如果一切顺利,你现在应该看到你的第一个Winnie the Pooh quote! 我希望这是一个很好的!

好的,既然您已经完成了这项工作,那么从订阅组开始,您将深入了解自动更新的订阅细节。


Subscription Groups

App Store Connect上设置自动续订订阅时,您遇到了订阅组的概念。如上所述,这基本上是一组订阅产品,但它还有更多。

您已经知道每个订阅必须是订阅组的一部分。用户可以根据每个订阅选项的价格和持续时间选择最适合他们的订阅选项。

您可能不知道的是,用户一次只能在一个组内购买一个订阅。如果您想要防止用户意外购买相同内容的多个订阅,这非常有用。要防止出现这种情况,您需要做的就是为所有相关订阅产品使用单个订阅组。

如果您确实希望同时提供多个订阅,并且每个订阅都授予对不同类型内容的访问权限,则应使用多个订阅组。确保您的用户了解他们实际上订阅了多个服务,并且不希望只有一个有效订阅。这可能导致沮丧的用户取消订阅并留下负面评论,这反过来可能阻止其他用户订阅,并且没有人想要这样做。

要防止出现这种情况,请确保您的订阅选项清晰易懂。您的订阅组的名称仅对您可见,而不是对您的用户可见,因此请以对您最有意义的方式使用它。

您可以在每个组中对您的订阅进行排名。提供对大多数内容,功能或服务的访问权限,忽略订阅持续时间,都应位于顶部。如果产品相同,您可以在每个级别拥有多个订阅。您可以通过拖动组中的订阅来进行设置。将一个拖到另一个上面以将它们设置在同一级别。

用户可以选择在App Store的帐户subscription page中升级,跨级(crossgrade)或降级订阅:

注意:这些都不会影响付费服务一年标记的计数。 但是,转移到不同组中的订阅会重置服务日期。


Adding More Subscriptions

您现在要为应用添加另一个自动续订订阅:yearly。 由于该应用程序仅提供一种类型的内容 - life changing quotes by Winnie the Pooh - 您将保持新的自动续订订阅与现有订阅处于同一水平。

转到App Store Connect并添加另一个可自动更新的订阅产品。 当系统提示您选择新产品的订阅组时,请选择您之前创建的相同PoohWisdomSubs组。

将订阅Duration字段设置为1 Year,并填写所有其他必要信息。 单击“保存”并确认状态为Ready to Submit。 复制新的自动续订订阅的Product ID。 你很快就会需要它。

现在,回到Xcode。

打开Main.storyboard并将Purchase按钮标题更改为Subscriptions,因为您要更改按钮以便用户在两个可用的自动更新订阅选项之间进行选择。

转到ViewController.swift,找到displayRandomQuote()并删除以下代码行:

purchaseBttn.isHidden = true

这将在成功购买后保持订阅按钮可见,并允许您的用户在订阅之间切换。

现在,找到purchaseSubscription(_ :)并将整个buyProduct闭包移动到名为purchaseItemIndex(index:Int)的新方法。 请注意,从不使用index参数。 将第一行的products[0]更改为products[index]。 新方法应如下所示:

PoohWisdomProducts.store.buyProduct(products[index]) { [weak self] success, productId in
  guard let self = self else { return }
  guard success else {
    let alertController = UIAlertController(title: "Failed to purchase product",
                                            message: "Check logs for details",
                                            preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "OK", style: .default))
    self.present(alertController, animated: true, completion: nil)
    return
  }
  self.displayRandomQuote()
}

您现在可以使用此新方法根据用户的选择购买相关订阅。 您将根据作为products[index]传递的值选择订阅。

回到purchaseSubscription(_ :),您需要添加alert以允许用户选择他们的首选订阅选项。 在guard下方添加以下内容:

let alertController = UIAlertController(
  title: "Choose your subscription",
  message: "Which subscription option works best for you",
  preferredStyle: .alert)

alertController.addAction(
  UIAlertAction(title: "Monthly",
                style: .default,
                handler: { action in
                  self.purchaseItemIndex(index: 0)})
)

alertController.addAction(
  UIAlertAction(title: "Yearly",
                style: .default,
                handler: { action in
                  self.purchaseItemIndex(index: 1)})
)

present(alertController, animated: true, completion: nil)

您刚刚添加了一个alert控制器,它有两个选项:每月订阅和每年订阅。 您将向应用商店发送请求,以根据用户在此alert中的选择(由index标识)购买相关订阅。

现在,剩下的就是将新product ID添加到产品数组中,这样用户实际上就有两个订阅选项可供选择。

转到PoohWisdomProducts.swift并将poohWisdomSub的名称更改为monthlySub。 然后,在其下方添加另一个product ID。 将其命名为yearlySub

public static let monthlySub = "com.razeware.poohWisdom.monthlySub"
public static let yearlySub = "com.razeware.poohWisdom.yearlySub"

确保将两个订阅的product ID替换为您在App Store Connect上创建的product ID

更改productIDs数组的初始化以包含两个订阅产品:

private static let productIDs: Set<ProductID> =
  [PoohWisdomProducts.monthlySub, PoohWisdomProducts.yearlySub]}

现在,productID包含两个可用的订阅,应用程序将根据用户在订阅alert中的选择从Apple的服务器请求相关的订阅。

最后,返回ViewController.swift并在viewDidLoad()中,如果用户购买了poohWisdomSub并检查了两个可用订阅中的任何一个,则替换条件检查。 你的情况现在应该是这样的:

if (PoohWisdomProducts.store.isProductPurchased(PoohWisdomProducts.monthlySub) ||
  PoohWisdomProducts.store.isProductPurchased(PoohWisdomProducts.yearlySub)){
  displayRandomQuote()
} else {
  displayPurchaseQuotes()
}

如果用户购买了任一订阅,您现在正在显示quote


Seeing it All Come Together

现在,既然您已经在App Store Connect和应用程序本身上设置了两个订阅,那么就该进行测试了。 使用相同的沙箱用户,通过点击Subscriptions然后选择Yearly来升级到年度订阅。

如果您想直接测试购买年度订阅,则需要创建一个新的沙箱用户。

但是在你对各种测试场景疯狂之前(我强烈建议你这样做,因为测试非常重要 - 特别是可能不被注意的边缘情况),当涉及到自动更新续订时,你需要了解有关沙箱与生产的信息。

您真的不想在几天,几个月或几年的时间内测试您的自动更新(auto-renewable)。 因此,只要您处于测试环境中,续订就会以加速的速度发生:

也知道续订每天限制为六次。 因此,如果要测试各种方案,您可能会发现自己正在与多个测试用户合作。


Auto Renewable Subscriptions Best Practices

您现在有一个基本的工作应用程序,有多个订阅选项供您的用户选择。 现在是涵盖一些自动续订订阅最佳实践的好时机:

您现在应该非常了解如何设置自动续订订阅。 如果您对进一步阅读感兴趣,我强烈建议:

当您添加对自动续订订阅的支持时,请始终牢记用户。 实现利润最大化的最佳方法是为用户提供他们真正需要或想要的东西,并以用户友好的方式进行。 这将使他们和他们的钱回来更多!

后记

本篇主要讲述了自动续订订阅,感兴趣的给个赞或者关注~~~

上一篇下一篇

猜你喜欢

热点阅读