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

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

 

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

配置(Configuration)数组

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

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

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

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

参考以下步骤:测试

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

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

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”的问题或许是由如下的一个或多个缘由引发:

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

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

708.png

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'

相关文章
相关标签/搜索