应用内购(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.获取内购列表( ...
随机推荐
- 前端路由的实现(三) —— History的pushState和replaceState用法
HTML5中history提供的pushState, replaceState这两个API.它们提供了操作浏览器历史栈的方法. pushState能够在不加载页面的情况下改变浏览器的URL.这个方法接 ...
- 作业-[luogu4396][AHOI2013]-莫队
<题面> 卡常终究比不上算法的优化…… 这是莫队的有点小坑的题, 首先不一定能想到,想到不一定打对,打对不一定打好. 首先你会发现,这个题的时限是很长的- $n$和$m$也是很大的. 于是 ...
- mysql 常用命令语法
登录到mysql client 以windows下为例,打开cmd命令窗口,进入到mysql安装目录bin目录下,首先要启动mysql服务,执行命令: net start mysql,这里不需要分号. ...
- git出现“The file will have its original line endings in your working directory”错误
一.现象: git add *时出现如下现象: The file will have its original line endings in your working directory 解决: G ...
- MyEclipse编写ExtJS卡死问题解决方法
MyEclipse 8.6 在 jsp 中编写 ExtJS时,会出现卡死现象,让人甚是头疼.网上找了很多方法,折腾半天,还是不管用. 什么MyEclipse 优化,Validation 取消,MyE ...
- jeecg Access restriction 问题解决
最近导入新项目,导入所有用到的jar包,发现其中一个引用报错 import com.sun.istack.internal.Nullable; 具体信息如下: Access restriction: ...
- SQL优化系列(三)- 用最少的索引获得最大的性能提升
从全局出发优化索引 对于高负载的数据库,如何创建最少的索引,让数据库的整体性能提高呢?例如,对于100 条SQL语句,如何创建最佳的5条索引? SQL自动优化工具SQL Tuning Expert P ...
- KiCad 工程用 Git 管理需要忽略哪些文件?
KiCAD 工程用 Git 管理需要忽略哪些文件? KiCAD 使用的 文本格式,天生可以用 Git 来管理. 但是并非所有文件需要使用 Git 管理,以下文件可以忽略. *.bak fp-info- ...
- Leetcode762.Prime Number of Set Bits in Binary Representation二进制表示中质数个计算置位
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 10101 有 3 个计算置位.还有, ...
- 云计算、大数据、编程语言学习指南下载,100+技术课程免费学!这份诚意满满的新年技术大礼包,你Get了吗?
开发者认证.云学院.技术社群,更多精彩,尽在开发者会场 近年来,新技术发展迅速.互联网行业持续高速增长,平均薪资水平持续提升,互联网技术学习已俨然成为学生.在职人员都感兴趣的“业余项目”. 阿里云大学 ...