55f8c9aeb0c4ff76c8617030955dfcab
内购新特性以及使用 server-to-server 通知

WWDC 2019 Session 302: In-App Purchases and Using Server-to-Server Notifications

这个篇幅较长的 Session 中,苹果提供了较多文档性质的内容,这部分内容重要,但更适合你去亲自阅读、仔细研究。所以笔者不会做过多文档性质的说明,在点明必不可少的重点之后,篇幅会适当给评论性的内容多分配一些。

1. 引言

应用内购买(简称内购)作为开发者以及苹果一项重要的收入手段,一直是开发者关注的重点,苹果也在持续完善、改进这套系统。例如,不久之前苹果发布了方便应用内订阅项目进行促销活动的系统级方案,用以吸引新用户、争取回曾经的用户。此外,服务端对服务端的通知,是苹果在内购系统中提供的一项备选方案,用来辅助开发者进行用户订阅状态的管理,同时提升用户订阅的使用体验。在这次的 Session 302 中,苹果又为内购系统添加了许多实用的新特性。

2. 概览

本 Session 包括以下内容:

  • 使用订阅促销来减少用户自然流失(增加了对 watchOS 的支持)
  • 使用新特性 SKStorefront 来为不同地区的用户动态化提供商品
  • 使用收据中的新字段来鉴别预购了你应用的用户(游戏行业很开心)
  • 使用服务端对服务端的通知,并且对账单事件做出响应(增加了四种新通知类型)
  • 订阅服务新特性:账单缓冲期
  • 对以上新特性应用的示例,以及内购生命周期的讲解(建议观看)

其中,最重要的就是服务端对服务端通知的新类型。因为其他特性业界基本都有手动实现的方案,现在只不过更方便成本更低。而服务端对服务端通知新类型的添加,则对用户订阅状态的管理方案带来了实质性进步,因此苹果也为此处分配了很长的篇幅。

3. What's new in StoreKit

3.1 Subscription Offers(订阅优惠)

从 iOS 12.2(以及 tvOS 12.2、macOS 10.14.4)开始,苹果为应用内订阅服务提供了订阅优惠的支持,包括一定时长的免费试用、一定时长的低价订阅等类型。开发者可以在 iTunes Connect 里为订阅类型的商品设置促销,促销对新用户和曾经订阅过的老用户有效。苹果会自动判断当前用户是否符合优惠条件,从而在调起系统的内购面板时,自动展示促销文案或者正常价格。
此外,本次 WWDC 苹果提供了 Session 305 订阅优惠最佳实践

3.2 SKStorefront

SKStorefront

苹果为 SKPaymentQueue 对象添加了一个 SKStorefront 类型的属性,名为 storefront。
从 SKStorefront 这个名字推测,这个类应该是用来描述当前用户的 App Store。目前它只有一个 countryCode 属性可用,表示用户的应用商店所设置的国家或者地区。未来应该会有更多的属性被添加进来。
苹果给出了示例,在进行内购商品展示前,主动获取 SKStorefront, 然后对内购商品一一核对,确定该商品在当前国家是否要提供。这样一来,内购商品的展示逻辑就放在了客户端。然而,很多公司出于灵活性等考虑,商品列表的数据是放在服务端的,这样可以随时配置线上的商品。而对于不同国家展示不同商品这个需求,之前也有很容易实现的方案,举个例子:服务端根据请求的 ip 判断所处地区,动态返回对应地区的商品列表。因此,笔者对于这个新特性的感受是:有会更好,没有也无大碍。

paymentQueueDidChangeStorefront

上面的是我们主动获取 SKStorefront 值的例子。由于在程序运行期间,SKStorefront 也可能发生变化(比如用户更改了自己 App Store 的设置),所以苹果为我们熟悉的 SKPaymentTransactionObserver 协议添加了一个新方法:- paymentQueueDidChangeStorefront:。用来通知应用 SKStorefront 发生了变化。

SKPaymentQueueDelegate

自然可以想到,如果在一次内购进行的过程中 SKStorefront 发生了变化,应用对用户购买的响应结果有可能想要随之进行变更,比如用户如果变到了另一个国家,你就不想让他买这个商品了。对此,苹果添加了一个新的协议:SKPaymentQueueDelegate,目前仅有一个方法 - paymentQueue:shouldContinueTransaction:inStorefront:,它会在内购进行期间 SKStorefront 发生变化的时候被调用,你通过返回值告知系统是否希望此种情况下交易继续进行。需要强调的一点是,出于用户体验的考虑,这个方法需要尽快返回(猜测这个方法执行期间用户行为会被中断)。因此,诸如网络请求询问服务端的处理方式就是很不合适的。
如果你为这个方法返回了 true,用户的购买行为正常继续。如果返回了 false,那么此次购买就会终止。随之,- paymentQueue:updatedTransactions: 方法被调用,你收到一个被标记为失败的 transaction,错误码是 storeProductNotAvailable。购买行为被中断时,用户需要知道发生了什么,此刻就是你给出提示(弹窗或者 toast)的好时机。

3.3 App Pre-Orders

应用预定是苹果之前推出的特性。开启预定的应用,在上架之前就可以上线产品介绍页,用户可以提前购买或者免费获取该应用。在最新版 App Store 中,“游戏” tab 会经常出现一个 “现可预定”分类,里面就是可预定中的游戏。游戏行业有个运营的惯例是提前预约的用户在公测或正式上线后可以获得特殊奖励,提高玩家预定的积极性,从而在上线前造势。
针对这类需求,苹果在收据中新添加了一个字段,用来标记当前用户是否来自于预定。此特性宣布时现场响起了欢呼声,看来苦这个需求久矣。

top Created with Sketch.