版本记录
版本号 | 时间 |
---|---|
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
获得随机智慧之言一整个月的权利!这足以照亮任何人的一天。但是,由于显然人们希望继续使用它的时间更长,因此您还应该提供年度订阅选项。这对于应用程序的忠实用户来说将更有价值。
但是,在深入了解实施细节之前,您可能了解应用程序内购买。
这里有一些重要的免责声明:
- 在示例应用程序中,您将使用硬编码的产品标识符
(Product Identifiers)
。在现实生活中,您更喜欢从服务器获取这些内容的灵活性。 - 您将使用
UserDefaults
来指示用户已购买产品。在真实的应用程序中,您需要执行收据验证(receipt validation)
,而不是在本地保存此指示。
Setting Up the Project
好的,所以你有启动项目。要使其工作,您需要在项目本身和App Store Connect
上进行更改。完成所有这些步骤后,您将拥有一个可运行的应用程序,其中包含一个可自动更新的订阅产品。
- 1) 在Apple Developer Portal中创建应用程序ID
(App ID)
。请务必使用显式应用程序ID(Explicit App ID)
并记下您使用的Bundle ID
。 - 2) 确保您已接受
App Store Connect
中的所有法律协议,否则您将无法在以下步骤中看到正确的选项。如果需要帮助,请参阅Checking Your Agreements
。 - 3) 使用所述
Bundle ID
在App Store Connect中创建iOS应用程序。 - 4) 创建
IAP Auto-Renewable Subscription
产品。在填写必填字段时,请阅读以下内容。
在创建自动续订订阅的过程中,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。
- 5) 复制先前步骤中的应用和产品ID
(App and Product IDs)
以便于访问。 - 6) 在回到项目之前,您需要做的最后一件事是创建一个沙箱用户进行测试。 请记住,您需要使用真实的电子邮件地址 - 您实际可以访问的地址,以便您可以验证该帐户。
好的,现在是开始项目的时候了! 只需几个步骤,您将拥有一个有效的初始应用程序:
- 1) 将
Bundle Identifier
设置为您创建的Bundle Identifier
。 - 2) 将常规
(General)
选项卡上的团队Team
切换到开发人员团队。 - 3) 搜索
com.razeware.poohWisdom.monthlySub
并将其替换为您创建的IAP的产品ID(Product ID )
。
接下来,在您要测试的设备上,打开iOS Settings
应用,然后点击iTunes & App Store
。
点按您的Apple ID
,然后点按Sign Out
。 此时,实际上并未使用沙箱用户登录。 当您尝试在应用中购买IAP时,您将执行此操作。
构建并运行项目,您将在项目控制台中看到:
Not purchased: $MyIAPID
Loaded list of products...
Found product: $MyIAPID $GroupID $Pricing
如果你看到这个 - 恭喜! 您有一个可自动续订IAP的工作应用程序。 但是不要太舒服。 你刚刚开始。
如果您看到其他内容,请确保您在上述步骤中没有遗漏任何内容:
- 你在
App Store Connect
上设置了一切吗? - 您的新
IAP
产品状态是否Ready to Submit
? - 您是否在项目的“常规”选项卡上设置了
Team
和Bundle Identifier
? - 您是否用自己的
product ID
替换了com.razeware.poohWisdom.monthlySub
? - 您是否接受了
App Store Connect
中的所有协议,并且它们是否都显示为Active
?
点击购买(Purchase)
。
输入您在App Store Connect
上创建的沙箱帐户的用户名和密码,点击Continue
,然后点击以下弹出窗口中的OK
。 如果一切顺利,你现在应该看到你的第一个Winnie the Pooh quote
! 我希望这是一个很好的!
好的,既然您已经完成了这项工作,那么从订阅组开始,您将深入了解自动更新的订阅细节。
Subscription Groups
在App Store Connect
上设置自动续订订阅时,您遇到了订阅组的概念。如上所述,这基本上是一组订阅产品,但它还有更多。
您已经知道每个订阅必须是订阅组的一部分。用户可以根据每个订阅选项的价格和持续时间选择最适合他们的订阅选项。
您可能不知道的是,用户一次只能在一个组内购买一个订阅。如果您想要防止用户意外购买相同内容的多个订阅,这非常有用。要防止出现这种情况,您需要做的就是为所有相关订阅产品使用单个订阅组。
如果您确实希望同时提供多个订阅,并且每个订阅都授予对不同类型内容的访问权限,则应使用多个订阅组。确保您的用户了解他们实际上订阅了多个服务,并且不希望只有一个有效订阅。这可能导致沮丧的用户取消订阅并留下负面评论,这反过来可能阻止其他用户订阅,并且没有人想要这样做。
要防止出现这种情况,请确保您的订阅选项清晰易懂。您的订阅组的名称仅对您可见,而不是对您的用户可见,因此请以对您最有意义的方式使用它。
您可以在每个组中对您的订阅进行排名。提供对大多数内容,功能或服务的访问权限,忽略订阅持续时间,都应位于顶部。如果产品相同,您可以在每个级别拥有多个订阅。您可以通过拖动组中的订阅来进行设置。将一个拖到另一个上面以将它们设置在同一级别。
用户可以选择在App Store
的帐户subscription page中升级,跨级(crossgrade)
或降级订阅:
- 当用户升级
(upgrades)
时,交易立即生效,并且他们会收到原始订阅的按比例分配的退款。 - 当用户降级
(downgrades)
时,原始订阅将继续,直到下一个续订日期,然后在较低级别续订。 - 当用户进行交叉分级
(crossgrades)
时,如果订阅持续时间相同,则新订阅立即开始。 否则,新订阅将在下一个续订日期生效。
注意:这些都不会影响付费服务一年标记的计数。 但是,转移到不同组中的订阅会重置服务日期。
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
您现在有一个基本的工作应用程序,有多个订阅选项供您的用户选择。 现在是涵盖一些自动续订订阅最佳实践的好时机:
- 您已经知道不应该在应用程序中对
product ID
进行硬编码,而是从服务器中获取它们。这将使您可以更灵活地选择提供的选项和时间。 - 您永远不应该在您的应用中存储其他订阅数据 - 例如价格,描述等。您应始终依靠Apple获取此最新数据。这将使您能够更改价格并制作独特的促销产品,而无需考虑升级到较新版本的用户。
- 您应该考虑在应用中提供订阅管理选项。这将使您有机会创建为您的特定应用量身定制的订阅体验。您可以提供品牌化的上下文体验,用于升级,交叉评级甚至降级,同时在用户决定取消订阅时提供设置的深层链接。
- 确保您清楚地描述了您的订阅,以便您的用户准确了解他们将要购买的内容。这可能不仅可以帮助您吸引更多订阅者,还可以帮助防止付费订阅但获得的不是期望内容的沮丧用户。
- 除了吸引新订阅者之外,您还应该考虑保留现有订阅者。要考虑的一件事是管理价格。您可能会有兴趣提高其中一个订阅选项的价格。这对新用户来说没问题,但现有用户呢?您可以决定让现有用户保持旧订阅价格,只提高新用户的价格,或者您可以决定为每个人提高价格并希望获得最佳价格。如果您决定提高现有用户的价格,并且以不同的价格拥有多组现有用户,请确保首先提高最接近当前价格的用户的价格,然后是下一个最接近的用户,依此类推。否则,Apple可能会多次提示您的用户接受越来越高的价格。
- 最重要的是,始终要注意Apple的指导方针
(guidelines)
。这与您在iOS上所做的一切相关,但由于本教程是关于应用程序内购买的,因此您应该查看Apple指南中的相关部分relevant section,并确保在开始处理下一个应用程序之前一切对您有意义。
您现在应该非常了解如何设置自动续订订阅。 如果您对进一步阅读感兴趣,我强烈建议:
- Apple的Auto-renewable Subscriptions页面。
- WWDC 2018的Best Practices and What’s New with In-App Purchases。
- 有关如何验证收据的详细信息,请参阅Apple的About Receipt Validation文档。
当您添加对自动续订订阅的支持时,请始终牢记用户。 实现利润最大化的最佳方法是为用户提供他们真正需要或想要的东西,并以用户友好的方式进行。 这将使他们和他们的钱回来更多!
后记
本篇主要讲述了自动续订订阅,感兴趣的给个赞或者关注~~~
网友评论