应用内购(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
下图演示为托管内容生成一个包,图中的数字对应上述步骤。

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。
参考:
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'
应用内购(In-App Purchase)常见问题解答的更多相关文章
- [IPA]IOS In App Purchase(内购)验证
参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...
- ios IAP 内购验证
参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...
- 苹果开发——App内购以及验证store的收据(一)
原地址:http://zengwu3915.blog.163.com/blog/static/27834897201375105236580?suggestedreading 发了几天时间在网上折腾了 ...
- [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试
目录:[Swift]Xcode实际操作 本文将演示如何为IAP(支付方式)内购功能的具体实现和测试. 内购是苹果市场上的一种常见的盈利方式. 在项目中确保已经安装了第三方库[Pod],双击[Podfi ...
- 苹果内购小结 - iOS
此篇针对 iOS 支付进行一次小结,很久没碰这块了,有些方法 Apple 官方也进行了优化,故也将随之进行更新. 首先,code 部分将分为两部分,一部分在 appdelegate 中,另一部分单独封 ...
- [Swift通天遁地]四、网络和线程-(15)程序内购功能
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- AppStore 内购验证的方法
AppStore增加了验证内购(In App Purchasement)的方法, 就是苹果提供一个url地址, 开发测试用: https://sandbox.itunes.apple.com/veri ...
- iOS开发支付篇-内购(IAP)
一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...
- iOS开发支付篇——内购(IAP)详解
1 <em>内购所需要的资料整理总结,史上最完整的,哈哈哈哈哈哈</em> 思维导图 重点总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 1.获取内购列表( ...
随机推荐
- Vijos 学姐的逛街计划
传送门 题解传送门 线性规划,最小费用最大流. 神奇的操作. //Achen #include<algorithm> #include<iostream> #include&l ...
- 怎么比较两个list中相同的值个数!
怎么比较两个list中相同的值个数!int count=0;for(int i=0;i<list1.size();i++){ for(int j=0;j<list2.size();j++) ...
- warning: deprecated conversion from string constant to 'char*
warning: deprecated conversion from string constant to 'char* #include<iostream> using namespa ...
- 【JZOJ5338】【NOIP2017提高A组模拟8.25】影子 点分治?/ 排序
题面 65 看到路径问题,就想到了套路:点分治. 对于一个分治中心,先把在其子树的结点的sum和mn求出来,分别表示该节点到分治中心的边权和和点权最小值. 然后把mn离散化,并插入权值线段树中,以su ...
- springMVC原理解析
1:SpringMVC运行原理 2:工作流程 (1)客户端(浏览器)发送请求,直接请求到DispatcherServlet. (2)DispatcherServlet根据请求信息调用HandlerMa ...
- 访问者模式(Visitor、Element、accept、ObjectStructure、)(操作外置,与数据结构分离)
访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个 ...
- C# 模拟POST上传图片
做到一个上传图片的需求,网页已经可以了,模拟网页在客户端上传图片,试了很多次都没成功, 最后发现是少了一个换行符,而且是网页上的字符全部一字不漏的转换成文件流,上传. 先看下网页下的完整请求: 前面这 ...
- python mooc 3维可视化<第一周第二&三单元>
小结: 创建 数据对象 structuredGrid grid 使用contourfilter con PolyDataMapper m Actor a 使用 MaskPoint3D mask gly ...
- SDUT-3400_数据结构实验之排序三:bucket sort
数据结构实验之排序三:bucket sort Time Limit: 250 ms Memory Limit: 65536 KiB Problem Description 根据人口普查结果,知道目前淄 ...
- 阿里云 EMAS HTTPDNS 联合函数计算重磅推出 SDNS 服务,三大能力获得突破
1. 什么是 HTTPDNS ? 传统的 DNS(Domain Name System)使开发者常面临着域名劫持.调度不精准的问题. HTTPDNS 使用 HTTP 协议替换常用的 UDP 协议,完成 ...