iOS内购
官方文档:https://developer.apple.com/documentation/storekit/in-app_purchase/
IAP 配置流程:https://developer.apple.com/help/app-store-connect/configure-in-app-purchase-settings/overview-for-configuring-in-app-purchases
苹果内购(IAP)的四种类型
此外,每个应用可以创建多达10,000个内购产品,每个内购必须关联一个应用,且可以在多个平台版本(iOS、macOS、tvOS)间共享,但不能跨不同应用共享。实现应用内购需要在你的应用服务器和苹果的服务器之间进行配置,并在App Store Connect中进行设置和管理。
内购接入流程
实现苹果内购(IAP)功能,需要遵循以下详细流程:
接受付费应用协议:作为开发者,你的账户持有者需要在App Store Connect的商务部分接受付费应用协议。
设计你的内购项目:根据人机界面指南和应用审核指南,确保你的内购体验与应用其余部分协调,并有效展示你的产品。 https://developer.apple.com/app-store/review/guidelines/
在App Store Connect中配置内购:
- 创建内购项目,并添加元数据,如产品名称、描述、价格和可用性。 https://developer.apple.com/help/app-store-connect/manage-consumable-and-non-consumable-in-app-purchases/create-in-app-purchases
- 生成内购密钥,并设置税务类别,以便苹果能够为客户交易计算适当的税费。
- https://developer.apple.com/help/app-store-connect/configure-in-app-purchase-settings/generate-keys-for-in-app-purchases
实现StoreKit:在Xcode中为你的应用添加内购功能,确保Xcode中的应用程序标识符和产品标识符与App Store Connect中的相匹配。
测试你的内购:使用苹果提供的沙盒测试环境测试内购,该环境允许你使用测试账户进行免费测试。你还可以使用TestFlight或在Xcode中进一步测试你的应用和内购。
使用App Store服务器通知:
- App Store服务器通知提供有关交易状态和内购相关的关键事件的几乎实时更新,例如退款或订阅状态变更、家庭共享访问等。
- https://developer.apple.com/documentation/appstoreservernotifications
- 你需要在App Store Connect中输入你的生产和沙盒服务器环境的URL,以利用这些通知。
- https://developer.apple.com/help/app-store-connect/configure-in-app-purchase-settings/enter-server-urls-for-app-store-server-notifications
提交内购项目进行审核:在你将内购发布到App Store之前,必须提交审核。如果你是首次提交内购,你必须与应用的新版本一起提交。在提交之前确保不缺少任何必需信息。监控内购状态,了解你的内购项目是否可用或是否需要你的关注。
处理退款 https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/handling_refund_notifications 用户的退款方式:
- 联系 Apple 客户支持
- 登录并使用Apple的自助服务工具reportaproblem.apple.com申请退款
- 要求其付款方式发行机构退款
客户端购买流程(IAP API)
详细步骤:
使用交易监听器监听交易状态变化,通过更新来提供应用运行时的最新服务和内容。
使用产品请求(products(for:) 从 App Store 请求显示在您应用中的产品。
使用(purchase(options:))发起购买
使用交易功能(currentEntitlements)遍历用户的应用内购买,并解锁已购买的内容和服务。
验证从 API 接收到的签名交易和签名订阅状态信息。
云端流程
应用商店服务器通知
App Store Server Notifications https://developer.apple.com/documentation/appstoreservernotifications
订阅生命周期状态图
主要通知类型概览
关键事件处理流程
详细通知类型说明
| 通知类型 | 子类型 | 描述 |
|---|---|---|
| CONSUMPTION_REQUEST | 空 | 通知类型表明客户启动了对消费型应用内购买或自动续订订阅的退款请求,App Store请求您提供消费数据。更多信息请见发送消费信息。 |
| DID_CHANGE_RENEWAL_PREF | UPGRADE | 通知类型及其子类型表明用户更改了他们的订阅计划。如果子类型是UPGRADE,用户升级了他们的订阅。升级立即生效,开始一个新的计费周期,用户将获得之前周期未使用部分的比例退款。 |
| DOWNGRADE | 如果子类型是DOWNGRADE,用户降级了他们的订阅。降级将在下一个续订日期生效,不影响当前活跃计划。 | |
| 空 | 如果子类型为空,用户将他们的续订偏好更改回当前订阅,有效地取消了降级。更多关于订阅级别的信息,请见在组内排序订阅。 | |
| DID_CHANGE_RENEWAL_STATUS | AUTO_RENEW_ENABLED | 通知类型及其子类型表明用户更改了订阅续订状态。如果子类型是AUTO_RENEW_ENABLED,用户重新启用了订阅自动续订。 |
| AUTO_RENEW_DISABLED | 如果子类型是AUTO_RENEW_DISABLED,用户或App Store在用户请求退款后禁用了订阅自动续订。 | |
| DID_FAIL_TO_RENEW | GRACE_PERIOD | 通知类型及其子类型表明订阅因计费问题未能续订。订阅进入计费重试期。如果子类型是GRACE_PERIOD,继续在宽限期内提供服务。 |
| 空 | 如果子类型为空,订阅不在宽限期内,您可以停止提供订阅服务。向用户说明他们的计费信息可能存在问题。App Store将继续尝试计费60天,或直到用户解决其计费问题或取消订阅,以先到者为准。有关更多信息,请查看减少非自愿订阅流失。 | |
| DID_RENEW | BILLING_RECOVERY | 通知类型及其子类型表明订阅成功续订。如果子类型是BILLING_RECOVERY,之前未能续订的过期订阅已成功续订。 |
| 空 | 如果子类型为空,活跃订阅已成功自动续订一个新的交易期。为客户提供订阅内容或服务的访问。 | |
| EXPIRED | VOLUNTARY | 通知类型及其子类型表明订阅已过期。如果子类型是VOLUNTARY,订阅在用户禁用订阅续订后过期。 |
| BILLING_RETRY | 如果子类型是BILLING_RETRY,订阅因计费重试期结束而未能成功进行计费交易而过期。 | |
| PRICE_INCREASE | 如果子类型是PRICE_INCREASE,订阅因用户未同意需要用户同意的价格上涨而过期。 | |
| PRODUCT_NOT_FOR_SALE | 如果子类型是PRODUCT_NOT_FOR_SALE,订阅因产品在订阅尝试续订时不可购买而过期。 | |
| REFUND | 空 | 通知类型表明App Store成功退款了一笔消费型应用内购买、非消费型应用内购买、自动续订订阅或非续订订阅的交易。revocationDate包含退款交易的时间戳。originalTransactionId和productId识别原始交易和产品。revocationReason包含原因。要请求用户的所有退款交易列表,请参见App Store Server API中的获取退款历史。 |
App Store Server API
https://developer.apple.com/documentation/appstoreserverapi/
官方 SDK,支持 Java 版本 https://github.com/apple/app-store-server-library-java https://developer.apple.com/documentation/appstoreserverapi/simplifying_your_implementation_by_using_the_app_store_server_library
查询交易信息 https://developer.apple.com/documentation/appstoreserverapi/get_transaction_info
参考资料
https://ouyangrong.com/posts/iOS-In-App-Purchase/
App Store Server API 实践总结 https://blog.csdn.net/olsQ93038o99S/article/details/125531909
iOS StoreKit 2 新特性解析 https://juejin.cn/post/7096063372159877150