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”的问题或许是由以下的一个或多个原因引起:

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

参考:

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'

应用内购(In-App Purchase)常见问题解答的更多相关文章

  1. [IPA]IOS In App Purchase(内购)验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  2. ios IAP 内购验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  3. 苹果开发——App内购以及验证store的收据(一)

    原地址:http://zengwu3915.blog.163.com/blog/static/27834897201375105236580?suggestedreading 发了几天时间在网上折腾了 ...

  4. [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试

    目录:[Swift]Xcode实际操作 本文将演示如何为IAP(支付方式)内购功能的具体实现和测试. 内购是苹果市场上的一种常见的盈利方式. 在项目中确保已经安装了第三方库[Pod],双击[Podfi ...

  5. 苹果内购小结 - iOS

    此篇针对 iOS 支付进行一次小结,很久没碰这块了,有些方法 Apple 官方也进行了优化,故也将随之进行更新. 首先,code 部分将分为两部分,一部分在 appdelegate 中,另一部分单独封 ...

  6. [Swift通天遁地]四、网络和线程-(15)程序内购功能

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. AppStore 内购验证的方法

    AppStore增加了验证内购(In App Purchasement)的方法, 就是苹果提供一个url地址, 开发测试用: https://sandbox.itunes.apple.com/veri ...

  8. iOS开发支付篇-内购(IAP)

    一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...

  9. iOS开发支付篇——内购(IAP)详解

    1 <em>内购所需要的资料整理总结,史上最完整的,哈哈哈哈哈哈</em> 思维导图 重点总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 1.获取内购列表( ...

随机推荐

  1. bzoj 1093 [ZJOI2007]最大半连通子图——缩点+拓扑

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 缩点+拓扑,更新长度的时候维护方案数. 结果没想到处理缩点后的重边,这样的话方案数会算 ...

  2. TZ_14_Zuul网关

    1.spring-cloud的微服务大致是 2.zuul是 Netflix开源的微服务网关, 它可以和 Eureka. Ribbon. Hystrix等组件配合使用.zul的核心是一系列的过滤器,这些 ...

  3. Vue. 之 Element table 高度自适应

    Vue. 之 Element table 高度自适应 使用vue创建table后,其高度自适应浏览器高度. 在创建的 el-table 中添加:height属性,其值为一个变量(tableHeight ...

  4. PYTHON网络爬虫与信息提取[网络爬虫协议](单元二)

    robots.txt在网站的根目录下 遵守 自动或人工识别robots.txt再进行内容爬取 约束性:建议性,不遵守协议,存在法律风险. 基本语法: User-agent: * Disallow: / ...

  5. SQL Sever实验二 交互式 SQL

    一. 实验目的 1.观察查询结果, 体会 SELECT 语句实际应用: 2.要求学生能够使用 SELECT 语句进行数据库查询. 3. 熟练掌握各种查询的操作方法. 二. 实验准备 1. 完成实验一所 ...

  6. UE4物理模块(三)---碰撞查询(上)

    在前一文中介绍了如何在UE4中创建简单碰撞或者直接使用其mesh表示的复杂碰撞: Jerry:UE4物理模块(二)---建立物体碰撞​zhuanlan.zhihu.com 那么在拿到碰撞之后,就可以进 ...

  7. TSQL:让监控分析更简单更高效

    1. 前言 阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数.用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析. 2. 为什么需 ...

  8. C++之正则表示,字符串是否为全字母或者全数字

    bool isLetter(std::string& inputtext){ tr1::regex reg("^[A-Za-z]+$"); bool bValid = tr ...

  9. Webpack ERROR in Path must be a string. Received undefined

    在学习webpack过程中,我遇到的下面这个问题及解决方法. 问题如下: node版本如下截图: package.json文件截图: webpack.config.js文件截图: 然后,我运行项目,报 ...

  10. JavaScript--取消a标签和form的submit提交默认行为

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...