使用iOS应用内购买

与设置和测试应用内购买相比,iOS开发中要做的事情更多。 该过程很费力,需要进行全面的测试,尤其是从业务角度来说,应用内购买至关重要。

iTunes Connect配置-第1部分

本教程基于自动续订订阅,但是您可以通过非常相似的方式配置其他任何应用内购买。

要设置应用内购买,请按照以下步骤操作:

  1. 登录到iTunes Connect。
  2. 打开我的应用程序,然后选择要配置的应用程序。
  3. 打开“ 功能”标题,然后左侧窗格中选择“ 应用内购买 ”。
  4. 点击+图标,然后选择应用内购买类型。 您可以使用4种类型的应用程序内购买:

每种类型都有特定的用例,因此请确保您先阅读说明。

如果看不到自动续订,则说明您尚未接受更新的Apple Developer Program License Agreement或者尚未在iTunes Connect上填写协议,税收和银行信息。

5.假设您选择了“自动续订” ,请提供“ 参考名称”和“ 产品ID”

a)参考名称仅在iTunes Connect和“销售和趋势”报告中使用。 它不会在App Store中显示,因此可以是您喜欢的任何东西。

b)产品ID必须是唯一的,因此建议您使用带有订阅名称的应用反向域名,例如: com.reversed.domain.onemonth

6.选择“ 创建新的订阅组”,或者选择一个现有的组(如果有)。

所有自动续订的订阅必须是组的一部分。 用户一次只能订阅一个组中的一个订阅,但可以更改为同一组中的另一个订阅。 这允许用户升级或降级订阅,而无需为同一服务付费两次。

参考名称相同的订阅组参考名称仅在iTunes Connect和“销售和趋势”报告中使用。

7.应该会出现自动更新的订阅详细信息页面。 选择订阅期限 (从1周到1年)和可选的免费试用期(从3天到1年)。

8.单击“ 设置起始价格”以选择默认货币和价格(必须从定价层中选择),其他国家的价格将自动计算。

9.现在,您可以为各个地区选择不同的价格。 保存更改后,您会发现价格保留为定价层:

10.添加至少一个本地化版本,包括“ 订阅显示名称”和“ 描述” ,最好是支持的所有语言。 这些值将对用户可见,因此请确保它们听起来值得信赖。

11.现在,您需要向订阅组添加至少一个本地化 。 保存更改并在左窗格中选择您在步骤6中创建的组。 填写订阅组显示名称 ,如果您的应用程序名称与服务或发布名称不同,则可以选择设置自定义名称 。 请记住,这些值将对用户可见。

您可能已经注意到,我们跳过了产品详细信息页面上的“ 评论信息”部分。 要填写本节,我们首先需要从我们的应用程序进行App Store调用,以完成配置阶段。

记住要在iTunes Connect上填写您的协议,税收和银行信息。 您可以在iTunes Connect主页上或页面左上角的下拉列表中找到它。

设置测试帐户

为了进行应用内购买测试,您需要创建一个沙盒测试帐户。

  1. 登录到iTunes Connect。
  2. 开放用户和角色
  3. 打开沙箱测试器标题。

4.单击+图标,然后填写测试帐户详细信息。 保留凭据。

您可以使用伪造的电子邮件地址进行测试(一个简单的地址),但是Apple可能会向您发送一封电子邮件以验证测试帐户 ,而使用伪造的帐户则无法执行此操作,因此您需要创建另一个一个是因为从未经验证的帐户购买商品总是会失败。

项目配置

现在,您需要对Xcode项目进行一些更改。

  1. 打开项目设置(单击项目文件树的根)。
  2. 在“ 常规”标题中,向下滚动到“ 链接的框架和库”
  3. 单击+图标,找到StoreKit.framework ,然后单击添加

4.打开“ 功能”标头,然后打开“ 应用内购买 ”。

现在是时候进行一些编码了!

首先,您需要在类中导入StoreKit

 import StoreKit 

在执行任何其他操作之前,应检查用户是否可以付款。 如果他做不到,则可能会启用家长控制。

 SKPaymentQueue.canMakePayments() 

为了进行购买,您需要先下载可购买的产品:

 private let kOneMonthSubscriptionId = "com.reversed.domain.onemonth" 
 func loadProducts() { 
let identifiers = Set([kOneMonthSubscriptionId])
let request = SKProductsRequest(productIdentifiers: identifiers)
request.delegate = self
request.start()
}

加载的产品将在SKProductsRequestDelegate委托的productsRequest方法中SKProductsRequestDelegate 。 要处理商店委托方法,您的类需要实现SKProductsRequestDelegate 。 您可以将其包装在扩展中:

 extension SubscriptionService: SKProductsRequestDelegate { 
 func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
if response.products.count > 0 {
print("Purchasable products available!")
// 1. Save the SKProduct's so you could let user make a purchase
// 2. Update the UI - it lets you change the product prices without updating the app
} else {
print("No purchasable products available.")
// This might happen when your product identifiers are incorrect or your in-app purchases products weren't processed on iTunes Connect yet
}
}
}

如果您无法获取已配置的可购买产品,请注意,您的产品最多可能需要几个小时才能在iTunes Connect上注册。

现在,您可以让用户进行购买。 请记住使用加载程序锁定UI,直到该过程完成为止,以避免重复调用,并确保用户知道正在发生什么事情。

 func purchase(product : SKProduct) { 
let payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(payment)
}

交易结果在SKProductsRequestDelegate委托的paymentQueue方法中处理。 让我们扩展一下:

 extension SubscriptionService: SKProductsRequestDelegate { 
// (...)
 func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
for transaction in transactions {
switch transaction.transactionState {
case .Purchasing:
print("The payment is being processed.")
case .Purchased:
print("Payment processed successfully.")
// Add your logic
case .Restored:
print("Payment restored successfully.")
// Add your logic - it'll happen when your products
could be restored (eg non-consumable products)
case .Failed:
if transaction.error?.code == SKErrorPaymentCancelled {
print("User cancelled the payment.")
break;
}
print("Payment failed with error: \(transaction.error
?? "")")
// Handle the error
case .Deferred:
print("Payment is waiting for outside action.")
}
}
}
}

在让用户打电话之前,请记住要还原可恢复的可购买产品,因为他们无论如何都无法再次购买。

测试中

要完成配置过程,您需要确保您的付款有效,并为App Store审查过程截图。 这既简单又棘手,所以请按照以下步骤操作:

  1. 注销您当前的Apple ID:

a)打开iPhone的设置

b)转到iTunes和App Store

c)选择您的电子邮件地址,然后选择注销

不要使用沙盒帐户登录-您将无法执行此操作。

2.运行您的应用并触发应用内购买。

3.系统将提示您提供一个Apple ID。 使用沙盒帐户凭据,然后继续。

4.将会显示付款信息对话框。 拍摄屏幕截图(同时按住电源/睡眠和主页按钮)。

您必须在真实设备上测试应用内购买。 购买将始终在iOS模拟器上失败。

iTunes Connect配置-第2部分

由于您已经实现了应用内购买并在连接到App Store API时拍摄了系统对话框的屏幕快照,因此您最终可以完成iTunes Connect配置。

返回iTunes Connect上的“应用程序内购买详细信息”页面(“我的应用程序”->“您的应用程序”->“功能”->“应用程序内购买”->“您的购买”),然后向下滚动至“ 评论信息”

上载屏幕截图,然后输入您在Review Notes中使用的沙箱帐户的凭据。

保存更改,并确保将应用内购买的“ 可用性 ”设置为“待售” (在页面顶部)。

请记住,您的首次应用内购买必须使用新的应用版本提交 。 一旦您的二进制文件已上传并且您的首次应用内购买已提交审核,就可以从“应用内购买”部分提交其他应用内购买。

您可以验证用户的订阅在应用程序外部是否仍然有效。 当您的应用程序也可以在其他带有单独商店的平台(例如Android)上使用并且您决定让用户为每个帐户(而非每个平台)只支付一次时,此功能特别有用。

要验证用户的订阅服务器端,您需要一个Shared Secret 。 您可以在应用程序的“应用程序内购买”列表中找到它(“我的应用程序”->“您的应用程序”- >“功能”->“应用程序内购买”),单击“ 应用程序特定的共享机密”以打开一个包含机密的对话框。 如有必要,单击生成共享密钥

共享秘密以及完成应用程序内购买后将收到的收据详细信息将使后端应用程序可以验证用户的订阅是否仍然有效。

一丝不苟

您可能已经注意到, 设置应用内购买非常艰巨 。 但是,值得花时间在细致的逐步配置上,以避免过程中不必要的不​​愉快。

顺便说一句,您知道吗,即使您遵循这些说明, 您的iOS应用也可能会被拒绝? 查看此博客文章以了解原因。

最初发布于 brightinventions.pl

Mateusz Klimczak着,推动事物前进@ Bright发明

电子邮件Twitter Github Stackoverflow