应用内购(In-App Purchase)常见问题解答

http://www.cocoachina.com/ios/20150612/12110.html

 

本文档为您解答应用内购相关的常见问题。

配置(Configuration)

1.我必须上传一个二进制文件来测试应用内购么?

不,测试应用内购(In-App Purchase,以下简称IAP)不需要上传二进制文件。

注:在应用程序准备好接受审核批准之前,不要将开发中的二进制文件上传到iTunes Connect。如果二进制文件出现在iTunes Connect中,但功能不完整,那么App Review将审查二进制文件,很有可能会拒绝该文件。在iTunes Connect中,如果App Review拒绝了最新的二进制文件,测试IAP将会失败。一个变通方案是上传没有IAP功能的二进制文件通过App Review。一旦二进制文件通过审核,就可以测试IAP功能。

2.我如何启用通配符App ID来支持IAP?

参考如下步骤:

  • 在Xcode或者iTunes Connect中识别确认app当前的Bundle ID。更多信息请查看About Bundle IDs。

  • 参考Registering App IDs中的步骤1-6和8-10,更新通配符App ID以支持IAP。

3.支持自动订阅商品的最低版本是什么?

  • iOS系统:iOS 4.2 

  • OS系统:OS X 10.9

4.何时使用SKPaymentQueue的restoreCompletedTransactions方法?

在如下两种情况下,你只能使用SKPaymentQueue的restoreCompletedTransactions方法来恢复自动订阅或者非消耗性商品:

1.在消费者拥有的其他设备上安装它们。

2.在相关应用程序被删除的设备上重新安装它们。

5.在iTunes Connect中,可以为每个应用程序创建多少个IAP商品ID?

阅读Configuring a Product可以找到答案。

错误信息(Error Messages)

1.您的账户信息已经更改(Your account info has changed)

由于你在设备上登陆App Store时使用的是测试账户,所以你会收到一条“您的账户信息已经更改”的消息。一旦使用这个账户登陆商品购买环境,沙盒(Sandbox)就会检测到你的用户账户不可用。要解决这个问题,需要在设备的设置应用程序中退出当前账号,在iTunes Connect中创建一个新的测试账户,当Store Kit提示确认从你的应用内购买时,使用这个账户。

2.不能连接到iTunes Store(Cannot connect to iTunes Store)

 “Cannot connect to iTunes Store”的问题或许是由以下的一个或多个原因引起:

  • 沙盒不可达。

  • 你的应用程序没有bundle version(CFBundleVersion)。更多信息请查看Setting the Version Number and Build String

  • 你的应用程序是在模拟器上运行,不支持应用内购买。

  • 你尝试购买的商品不在出售之列。更多信息请查看Query the App Store for product information before presenting your app’s store UI

3.该Apple ID尚未在iTunes Store中使用(This Apple ID has not yet been used in this iTunes Store)

收到该条消息意味着你使用测试账号登陆了iTunes Store。要解决这个问题,你需要在设备中的设置应用程序中退出当前账号,在iTunes Connect中创建一个新的测试账户,当Store Kit提示确认从你的应用程序内购买时,使用这个账户。

4.你已经购买该商品,点击确定再次免费下载该商品(You've already purchased this. Tap OK to download it again for free)

该条消息并不是一个通知而非错误提示。它的意思是你正在购买一个已经购买过的非消耗性商品。你无需为已经购买过的非消耗性商品付费。

5.你已购买该应用内购买商品,但尚未下载(You've already purchased this In-App Purchase but it hasn't been downloaded)

收到该条消息是因为你在应用程序中没有调用SKPaymentQueue的finishTransaction:method方法。调用finishTransaction:方法可以从购买队列中删除一个事务。

6.该账户不是测试账户,请在沙盒环境中创建一个新账户(This is not a test user account. Please create a new account in the Sandbox environment)

当Store Kit提示确认购买时,你使用iTunes账户登录,会收到这个信息。要解决这个问题,需要在设备中的设置应用程序中退出App Store,当Store Kit提示确认从你的应用程序内购买时,使用沙盒测试用户账户。

本土化(Localization)

在iTunes Connect中我的应用内购已本土化为多种语言。但是,localizedDescription和localizedTitle属性总是返回英文信息,即便测试设备的语言不是英文。

localizedDescription和localizedTitle返回的本土化信息语言是基于当前iTunes Store的语言而不是当前设备所设置的语言。比如,在iTunes Connect中你的应用内购针对德语进行了本地化,但你使用英文测试账户登录,那么localizedDescription和localizedTitle都将返回英文信息。如果需要返回德语信息,在你的测试设备上使用德语测试账号登陆。

Receipt

1.我应该使用哪个URL来验证Receipt?(What url should I use to verify my receipt?)

  • 在沙盒中测试应用程序以及应用程序处于审核状态时,使用沙盒URL:https://sandbox.itunes.apple.com/verifyReceipt 

  • 当应用程序通过审核上架App Store时,使用商品URL:https://buy.itunes.apple.com/verifyReceipt 

注:确保将应用程序用于验证的receipt发送至App Store。

一定要先使用商品URL核实你的receipt;如果收到一个21007状态码,那接下来要使用沙盒URl验证。按照这个步骤,当app处于测试状态或在sandbox环境下进行审核,或者上架App Store,可让你避免在URL之间切换。

21007状态码表示该receipt是一个sandbox receipt,但已被发送至商品服务进行验证。0状态码表示已正确验证receipt。

2.当前receipt 无效或者与当前用户ID不匹配(Current receipt invalid or mismatched ds person id)

收到这条消息是因为你的应用程序中缺少OS X App Store receipt。更多关于如何从应用程序中获取receipt的消息请查看:Receipt Validation Programming Guide

3.Receipt验证失败,状态为<一串数字>(Verifying my receipt fails with a status of)

可能原因:

  • 在iOS app中,你没有使用base64编码对回单数据进行编码。

  • 发布到App Store的对象不是JSON格式。Listing 1是自动订阅的正确JSON对象:

Listing 1  验证自动订阅的有效receipt示例:

1
2
3
4
{
     "receipt-data"  "..." ,
         "password"  "..."
}

4.应用审核不能查看已购买成功的目录

如果应用程序在购买成功后通过App Store验证receipt,请检查你的应用程序是否使用了正确的App Store URL来验证receipt。更多信息请查看What url should I use to verify my receipt? 

5.在购买成功后,我的应用程序使用paymentQueue:updatedTransactions:验证receipt。但是,返回的receipt中包含了一个空in_app数组而不是预期的产品。

空in_app数组表示Store Kit没有为当前用户记录任何交易。或许是没有更新应用程序receipt,若果是这样,应用程序可以通知用户尚未出现receipt,是否要进行刷新。如果用户同意,应用程序会使用SKReceiptRefreshRequest类来更新receipt。此时,如果Store Kit已经记录用户购买信息,那应用程序receipt将会显示在in_app数组中。更多关于如何更新receipt的信息请查看:Refreshing the App Receipt

订阅(Subscriptions)

1.使用Xcode 6不能将托管内容上传至iTunes Connect

这是目前存在的一个bug。为了解决这个问题,请使用Application Loader上传包含托管内同的包。步骤如下:

  • 在Xcode Archives Organizer中,选择包含托管内容的文档。

  • 单击Export

  • 在弹出的对话框中,选择Export as an Installer Package.

  • 单击Next开始生成你的包,然后选择Export保存你的包(一个文件扩展名为.pkg的文件)。

  • 使用Application Loader上传这个包,更多信息请查看:Using Application Loader

下图演示为托管内容生成一个包,图中的数字对应上述步骤。 

应用内购(In-App Purchase)常见问题解答_第1张图片

2.如何从自动更新订阅服务更改为IAP商品?

参考如下步骤:

  • 在iTunes Connect中关掉Clear for Sale标志,从而移除当前自动更新订阅的商品/服务,然后将其从代码中移除。此时将会禁止商品/服务的自动更新,并会给用户发一封邮件。记住,你必须为用户提供已付费的商品/服务,直到订阅终止。此外,之前自动更新订阅的商品/服务都是可恢复的。例如,如果你的用户在4月1号购买了一个月的订阅,但是这个订阅将在4月19日下线,那你也必须提供已购买的内容直到5月1日。

  • 创建一个新的IAP商品类型,然后更新二进制文件来使用它。更多信息请查看:Creating In-App Purchase Products

注:需要该步骤是因为一旦应用内购类型被创建,则不能再更改。

3.通过App Store中验证应用程序receipt,然后分析是否需要向你的用户提供相关功能。更多信息请查看:Receipt Validation Programming Guide

3.如何知道用户是否将其联系信息分享给我?

使用receipt中的Subscription Expiration Date (expires_date)字段来检测用户是否将自己的信息共享给你。

假设你决定为购买一个月订阅服务并愿意分享个人信息的顾客提供7天免费试用,Store Kit将为你提供一个receipt,这个receipt的expires_date存储了7天再加1个月的长度。在首次购买后,你的订阅服务将于1月零7天后到期,此后的每个月都将为其开启自动更新。

4.即使在前台运行,我的应用程序也未收到任何自动更新提醒

如果你的应用程序有一个稳定的交易观察者,那么在打开或者从后台恢复时,它都将接收到所有自动更新提醒。更多信息请查看:Add a transaction queue observer at application launch

疑难解答(Troubleshooting)
1.为什么我的产品标识符在invalidProductIdentifiers数组中被退返?

或许由于以下一个或多个原因:

1.没有使用Explicit App ID。

2.在iTunes Connect中,苹果拒绝了你最新向iTunes Connect提交的二进制码。

3.你没有清除iTunes Connect中在售的IAP产品。

4.没有使用与正确的App ID相关联的Provisioning Profile注册你的应用程序。

5.可能修改了商品,但是这些修改没有在所有App Store的服务器中生效。

6.未能完成所有财政需求表。更多信息请查看:Contracts, Tax, and Banking

7.你的商品由苹果托管上,内容尚未上传至iTunes Connect上。更多关于上传托管内容的信息请查看:Hosting Non-Consumable Products with Apple

注:商品内容上传到iTunes Connect上之前,你的商品标识符将是无效的。如果内容还没准备好,那么可在iTunes Connect中禁用Hosting Content with Apple功能便可以解决这个问题。一旦内容准备好可以上传了,就可重新启用该功能。

8.在iTunes Connect中指定的商品标示符与应用程序中SKProductsRequest对象所使用的标示符不匹配。更多关于商品标示符的信息请查看:Technical Q&A, QA1329, 'In-App Purchase Product Identifiers'。

2.调用payment queue的restoreCompletedTransactions 方法不能恢复app中的任何商品

可能由以下一个或多个原因引起:

1.你的商品有尚未完成的交易。如果付费队列中有未完成的交易,则恢复进程不返回商品。更多关于结束交易的信息请查看:Finish the transaction。

2.你没有任何先前购买过的非消耗类、自动更新订阅以及免费订阅的商品。

3.你试图恢复的非更新订阅或消耗类商品是不可恢复的类型。restoreCompletedTransactions方法只能恢复非消耗类商品、自动更新订阅以及免费订阅的商品。

注:在无可恢复产品的情况下,Store Kit不会调用paymentQueue:updatedTransactions:方法。

4.应用程序的编译版本号(CFBundleVersion) 没有按照开发指南创建版本号。CFBundleVersion是一个由点号隔开的三个无符号整数组成的字符串。更多信息请查看:Setting the Version Number and Build String。

参考:

App Distribution Guide

iTunes Connect Developer Guide

In-App Purchase Programming Guide

Receipt Validation Programming Guide

Getting Started with In-App Purchase on iOS and OS X

Technical Note TN2387 In-App Purchase Best Practices

In-App Purchase Configuration Guide for iTunes Connect

Technical Q&A, QA1329, 'In-App Purchase Product Identifiers'

转载于:https://www.cnblogs.com/itlover2013/p/4574502.html

你可能感兴趣的:(应用内购(In-App Purchase)常见问题解答)