IOS内购经常遇到的一些问题,和一些容易混淆的点。

2023-11-09

Q1:内购和Apple Pay的区别?

  • A1:内购是内购,Apple Pay是Apple Pay。我不知道有多少人第一次接触时,会把这俩概念混淆掉,这里你可以简单这么理解,虚拟的物品就是用内购,实际的物品就是用Apple Pay。Apple Pay是一种支付方式,你可以类比为支付宝,微信那种。但人家只支持实际物品,如果你东西是虚拟的话,你却集成Apple Pay上架是要被拒绝的哦~当然反过来,实际物品你却集成内购上架,也是一样被拒。对于大部分的国内开发者而言,你很少会遇到需要集成Apple Pay的App的。能用支付宝/微信的场景还要求支持Apple Pay的产品毕竟是少数。

Q2:内购项目的类型区别?

  • A2:首先内购项目分为以下4种,消耗型项目,非消耗型项目,自动续期订阅,非续期订阅。我们来一个个介绍。
    消耗型项目:只可使用一次的产品,使用之后即失效,必须再次购买。就是大家最广为所知的虚拟币,比如直播平台斗鱼的鱼翅,熊猫的竹子,哔哩哔哩的B币等,这个概念大家应该很好理解,不过多解释了。

  • 非消耗型项目:只需购买一次,不会过期或随着使用而减少的产品。这个一般是游戏那里用的多,一般是付费解锁关卡的场景,用户买过一次,卸载重装或者同一个Apple id但换App账号时,也要能保证用户重新获得该内购商品。所以App内部需要额外去实现恢复购买的逻辑。

  • 自动续期订阅:允许用户在固定时间段内购买动态内容的产品。除非用户选择取消,否则此类订阅会自动续期。iTunces上给的示例是:每月订阅提供流媒体服务的 App。对比我们熟悉的,网易云音乐的内购商品-连续包月黑胶VIP,就是此类型。一般来说,没啥必要不要选这一种,如果是VIP的那种场景推荐下面非续期订阅类型去做。自动续期订阅的坑非常多,比另外几种内购类型都要复制。

  • 非续期订阅:一般来说VIP可以用这种方法来做订阅,我们公司项目的VIP购买就是这种方式。他的实现方式你可以完全照搬消耗性项目,不用做什么额外处理,也不用去管返回的订阅日期什么的东西,就是以服务器那边为准。服务器的日期开始,服务器的日期结束。既简单又保险,不需要额外的做什么处理。

Q3:VIP一定要用内购做吗?

  • A3:其实判断你们公司的App到底需不需要用内购,很简单,就是看跟实际物品有没有关系。如果你的VIP功能是类似饿了么这种,点外卖可以打折/多领红包 那么就不需要用内购,上架的时候说清楚就行了。如果你的VIP功能是虚拟的,比如头像更炫酷,尊贵的VIP身份标示,独特的入场动画等等虚拟相关的,比如QQ会员,就必须要用内购去做。需要说明的是,那种是VIP才能和某某用户聊天的场景,是VIP才能得到App里某某用户的服务【语音,视频】时,这一类的场景苹果一样认为是虚拟的,一样要用内购去做。

Q4:VIP内购一定是非续期/自动续期订阅吗?我可不可以用虚拟币购买VIP呢?

  • A4:这个问题我自己经历过。我的答案是你也可以用虚拟币购买VIP的这种方式,但如果被拒绝,你只能老老实实的按前种方式去做。如果你们的App既有虚拟币又有VIP,产品希望你VIP是直接用虚拟币去购买,这样整个流程都很方便。那么你一定要记住。千万不要在1.0版本这么做,这是血泪教训。1.0版本会抓的很严很严,同时虚拟币+VIP功能,百分百苹果会要求你VIP要用续期订阅去实现。最保险的做法呢,1.0版本不要做任何内购,迭代几个小版本后,加入虚拟币内购,在迭代几个小版本,加入VIP直接用虚拟币购买的功能,这是最最保险的做法。记住:1.0的审核力度是真的很严,能先不做内购就不要做内购,老板或许不懂,1.0版本什么都想要,但往往因为内购,会让你们的产品反复被拒。这一块如果大家感兴趣,可以看看,我的1.0版本就是加了内购,反复被拒5次。血泪教训

Q5:我们老板心疼那百分之30的手续费,我能不能不用内购啊,有没办法绕过内购?

  • A5:办法是有的。但是有风险。我16年做过绕开内购的方法。思路很简单,就是App里集成支付宝/微信/内购这种功能,后台做控制开关,审核时,开关打开,给审核人员看内购功能,审核通过后,开关关闭,给正常用户是用支付宝/微信功能。这个方法,我17年的时候听到很多群友说不行了,你在上架审核时,苹果会扫描你的包,检测到第三方支付sdk时,会拒绝掉。后来又有群友说可以用H5的方式实现支付功能。另外可能会有别的绕开苹果审核的实现方式,如果有哪位朋友知道,不妨留言告知。但不管是哪种方式,都是有风险的,苹果对内购一直抓的很严,如果让它知道你们在钱的方面上欺骗过他,后果还是很严重的。iOS上的用户付费率还是很不错的,付费意愿基本上可以是安卓用户的十几倍。所以如果你们的产品真的有前景,并且想长久做下去,还是奉劝不要做欺骗苹果的事情了。

Q6:网上有好多讲丢单的博客,看的是一脸懵逼,有的看懂后,在看下一篇又不懂了,感觉都好复杂。

  • A6:我在刚接触内购的时候也是这样,我觉得有些博客讲的真有点过了,它为了考虑一些用户的极端操作,多出来很多逻辑处理,导致博客异常的复杂,我记得有博客讲必须要把receipt_data等信息存到keychain里,因为用户有可能卸载App,如果你只存到NSUserDefaults里,那样就丢单了。 …那么有没有这种情况呢?我觉得是肯定有的。但我们来算算几率,首先他内购成功,在向服务器调接口的时候,他手机突然没电了/断网了/程序崩溃了/网络差等的久他自己杀死进程了 巴拉巴拉。 然后他在下一次手机恢复正常的时候,果断卸载掉App,重新去App Store上下载安装,进入App后,发现内购没到账。
    867088104DC1554FE5CDF4E962061E43.jpg

  • 网上博客还爱用那种切换账号的场景举例,A内购成功了,但用户各种骚操作后,自己换到B账号,然后服务器那边把商品发到B账号上了,等等。

  • 这些情况都是存在的,因为苹果的内购机制问题,你是不能百分百保证不丢单的,不要把丢单情况看的那么严重,逻辑写的那么复杂。你看看所有大厂的App上都会写充值遇到问题,点我联系客服 巴拉巴拉。关于丢单,我的做法是这样的,在苹果内购成功的回调里,NSUserDefaults存每一笔支付成功的订单,如果服务器校验成功,就把本地存的这笔订单删除。如果没收到服务器的响应,就一直保留。然后每次App启动就会去把本地存的丢单信息扔向服务器校验,校验成功删除,校验失败不管。这里还是看开发时间,当时我写内购功能的时候,预算时间就两天不到,所以写的飞快,就简单的用这个办法去防止丢单,目前来看,没有发现过一笔真正用户充钱但商品没到账的例子。如果大家开发时间充足,可以慢慢去弥补极端操作漏洞。

Q7:内购为什么会有这么多坑啊?看网上好多博客都在说,我自己做微信/支付宝的时候,没感觉有这么多坑啊

A7:苹果的内购坑主要有以下几点
applicationUsername该字段可能为nil 导致客户端没办法用这个参数给服务器透传订单编号,来形成一个交易订单号的绑定。
校验订单流程是必须服务器主动去询问苹果服务器,而支付宝/微信 却是他们的服务器会在用户支付成功时主动给我们服务器回调。正是这个原因,让iOS开发者饱受折磨,大部分的丢单漏单都是苹果的这个设计造成的。苹果不会主动回调给我们服务器,也就意味着我们服务器需要主动去苹果那里询问这笔订单,到底成没成功。但服务器询问的时机,又是客户端告诉服务器的。这就鸡儿坑了,一些情况下,用户在付费成功后,突然断网了/崩溃了/出现意外了等等,客户端没办法告诉服务器,这就出现了,用户钱成功了,内购商品却没到账。所以网上才会有这么多篇讲防止丢单的博客。
越狱下,插件也能破解掉苹果内购,然后校验状态status还返回成功。也就是本篇博客开头讲的那种情况。这一点真的是无力吐槽,亏你特么回调给我的receipt_data那么一大长串,有卵用?
苹果的订单机制。苹果为了保护用户隐私,你是看不到一条条流水明细的。你看到的只有这种。

在这里插入图片描述

每一种内购类型的总收入,或者总销量。导致对账查询的时候加了不少麻烦。
苹果的退款机制。这个比上面一点更坑,iOS用户,内购了某商品,你可以在完全用完了后,联系苹果客服,说我误操作了巴拉巴拉或者说感觉这个商品不值那么多被开发者欺骗了巴拉巴拉,快给我退款,客服就会温柔的告诉你,不要急,她会帮你处理,1-2个工作日把,你就会发现你的钱就退回来了。没记错的话,一段时间内,一个Apple Id可以申请1-2次。但不能多,多了的话就会被苹果拒绝。而这一切,开发者这边是完全不知情的。你不知道哪个用户退款了,你知道的只是一个图,类似下面的这种。

0A762A89-3A96-4503-995D-028A96518958.png

用户消费了你的内购商品,公司却收不到钱,很多公司的内购服务都是要成本的。如果这种用户一旦多起来,坏账率会飙升,公司就会被活活的拖垮。一个好的项目也就凉凉掉。淘宝上关于iOS内购退款专门有一个超级庞大的黑色产业链。从弄账号到专门联系苹果客服再到道具销赃变现,各司其职,一环套一环,每个环节人都赚的盆满钵满。苦的都是公司,因为苹果没有任何损失,他也不会补偿你公司1毛钱,一切损失都是公司自己承担。没记错的话,15-16年,很多很多游戏公司都是因为这个被活活拖垮的。幸运的是,这种恶意退款一般都是针对游戏公司,因为游戏道具可以快速变现。像正常的App甚少碰到,因为他退款了也没毛用,没法及时变现。毕竟他们可不稀罕跟你们的女用户1v1视频聊天。

Q8:对于开发者来讲,用通过内购充值,那开发者到时候怎么得到这笔钱?

A8:做内购的时候,会填写银行税务等等这些信息。苹果会按期把钱打入到你们当时填写的银行卡账户中。这里要注意,如果你当月内购收入很低,比如只有几十美金,那苹果是不会给你打款的。具体的额度好像是以150美金分界限,当你内购收入超过150美金的时候,苹果会下月给你打款。如果你不够150美金,那苹果会累积到下个月打款,如果下个月还不够,那就会继续累积。
这里注意两点:
150美金是个大概的数值,我自己没有确实求证过,我实际经历来说遇到的当月收入都远超过这个数字,所以很准确的最低打款金额,我也不好评估。
苹果的打款日期,并没有严格的规律。上旬,中旬,下旬打款我都遇到过,另外有时候,即便你当月金额有很多,苹果也可能下个月不给你打款,而是给你累积到下下个月。但至多不会超过两个月以上,如果你遇到这种情况,需要及时和苹果客户沟通。
综上:
只要你银行卡,税务等相关财务信息填写正确,账户里收入超过150美金,大多数情况下,下个月上旬就能收到苹果的打款。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOS内购经常遇到的一些问题,和一些容易混淆的点。 的相关文章

  • 将 UITableViewDataSource 与具有子视图的自定义单元格结合使用

    在 UITableView 中使用自定义单元格时 我遇到了奇怪的表格重叠 Problem 向下滚动 最后两行上面画有顶部两行 向上滚动 前两行上面画有下面两行 这是 UITableViewDataSource 的代码 func tableV
  • 如何在 AVAudioSession 内使用 iPhone XS 中内置的立体声(2 通道)麦克风?

    我试图从 iPhone XS 的所谓立体声后置麦克风获取两个通道 但在不同位置只能看到一个通道AVAudioSession and AVAudioSessionPortDescription与后置摄像头相关联 我尝试过使用AVAudioSe
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • iOS8 CoreData“使用未实现的初始化程序”

    我尝试运行我的应用程序时收到以下错误 致命错误 对类 rcresttest CatalogItem 使用未实现的初始化程序 init entity insertIntoManagedObjectContext 我可以通过将数据模型中的实体类
  • 检查定位服务是否开启

    我一直在对 CoreLocation 进行一些研究 最近 我遇到了一个在其他地方 但在 Objective C 和 iOS 8 中 已经讨论过的问题 我觉得问这个问题有点傻 但是如何在 iOS 9 上使用 swift 检查是否启用了位置服务
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 将永久字符添加到 UITextField

    有没有办法将字母永久添加到 UITextField 中 用户无法删除它 我想添加一个字符 用户无法删除它 但他们仍然可以在之后添加字母 Cheers 附注这是适用于 iOS 的 A UITextField有一个名为 应该更改范围内的字符 的
  • 打乱 NSMutableArray 而不重复并显示在 UIButton 中

    在我看来 我有 12 个按钮 一个数组包含 6 个名称 我想在其中打印数组名称UIButton标题 这是我的代码 texts NSMutableArray alloc initWithObjects 1 2 3 4 5 6 nil UIBu
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • 在 WKWebView 中禁用放大手势

    我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的 捏合缩放 放大手势 OS X 有一个 magnification BOOL 属性 但在 iOS 上似乎不可用 WKWebView h if TARGET OS IPHONE
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • UIScrollView setZoomScale 将应用的旋转设置回零

    我已经从事地图替换工作很长一段时间了 整个事情的工作原理是UIScrollView由一个支持CATiledLayer 为了旋转我的地图 我旋转图层本身 使用CATransform3DMakeRotation 到目前为止效果很好 但如果我打电
  • 在 Xcode 5 中重命名 iOS 项目[重复]

    这个问题在这里已经有答案了 我需要重命名一个 iOS 项目 有没有办法在不开始一个全新项目的情况下做到这一点 我发现的所有其他信息都与 Xcode 4 或旧版本相关 这些方法似乎使项目崩溃 我在尝试任何名称更改之前创建了一个快照 在 Xco
  • 覆盖层不与 UITableView 一起滚动 - iOS

    我有一个 UITableView 类 它使用以下方法在转到下一个屏幕时调用加载覆盖 问题是这个加载屏幕不随列表滚动 所以如果你滚动一点并单击某些东西 加载屏幕不会显示 因为它位于顶部 如何让加载屏幕始终保持在 UITableView 的顶部
  • 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用来禁用弱密码

    我正在尝试禁用一些密码 弱 例如单个 DES 单个 DES 40 位等 我尝试过使用这段代码在 Cocoa 中使用 CFSocket CFStream 时如何设置 SSL 密码 https stackoverflow com questio
  • Apple Watch 预构建操作可更改故事板 customModule 引用

    我目前有一个项目 其中包含同一应用程序的 3 个不同版本 不同的品牌等 该项目运行得很好 从那时起 我添加了 3 个新的 Apple Watch 目标 每个应用程序 版本 1 个 其中 2 个引用 主 Apple Watch 目标中的文件
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后
  • iOS - UITableViewCell 使文本加粗

    我有一个字符串 NSString userInfo James Johnson james 我想做的就是大胆James Johnson并保留 james正常字体 所以我尝试过的是使用NSAttributedString但为了完成这个过程 我

随机推荐

  • Java操作excel之POI和easyExcel 教程详解 狂神笔记

    文章目录 1 应用场景 2 Apache POI 简介 项目准备 代码演示 大文件写HSSF 03 大文件写XSSF 07 大文件写SXSSF 07升级版 POI Excel读 3 easyExcel 简介 项目准备 EasyExcel写入
  • 宝塔php7.0shell,BT_Panel 宝塔开心面板/V7.0.1开心版

    脚本简介 本次面板版本 7 0 1 本脚本支持一键安装开心版宝塔面板 以及 已经安装宝塔面板升级开心版 感谢大家使用 书记的脚本 本脚本未加密 有没有后门大家自己看就知道了 如果你使用了类似 书记的脚 出现问题 以及 脚本地址非本人的 或者
  • 金碟生产相关表

    生产订单表 SELECT FInterID from AIS20151222141907 dbo ICMO where left convert varchar FPlanCommitDate 120 10 gt 2020 08 01 an
  • Bridge桥接模式

    作用 将抽象部份与它的实现部份分离 使它们都可以独立地变化 将抽象 Abstraction 与实现 Implementation 分离 使得二者可以独立地变化 桥接模式号称设计模式中最难理解的模式之一 关键就是这个抽象和实现的分离非常让人奇
  • JVM基础知识

    目录 1 前言 2 JVM运行流程 3 JVM运行时数据区 4 JVM类加载 5 有关垃圾回收 1 前言 本文只是针对面试中比较常见的有关JVM的问题做出补充 俗称八股文 同时帮助大家对JVM建立一个感性的认识 所以并不会对JVM有过多的深
  • [原]Qt Designer中自定义控件的使用(提升法与插件法)

    准备乱写一点Qt自定义Widget在Designer中的使用 可是又不想重复提升法 promotion 及插件法基本用法 因为Manual中Using Custom Widgets with Qt Designer已经说的很清楚了 使用de
  • 解决:Jetson系列python3 import 报错 “Illegal instruction core dumped “

    解决 Jetson系列python3 import 报错 Illegal instruction cpre dumped 解决方法 解决方法 编辑环境变量 sudo gedit bashrc 在最后一行添加 export OPENBLAS
  • mongod: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file:

    mongod error while loading shared libraries libcrypto so 1 0 0 cannot open shared object file No such file or directory
  • 14个提高代码质量的好问题

    阅读本文大概需要 2 6 分钟 并不是代码写的越多 代码的质量就越高 思考才是 解决一个问题 打开电脑就手撕代码 最终的结果往往是各种代码问题 经过一系列迭代后 代码积重难返 最终的结果就是推到重来 前期的付出都白费 最典型的就是现在所谓的
  • 图像中不规则物体的长轴与短轴:OpenCV实现指南

    1 首先 读取图像并将其转换为灰度图像 2 进行图像预处理 包括使用高斯模糊和阈值化 以便更好地处理图像 3 通过使用OpenCV的cv2 findContours 函数 找到图像中的所有轮廓 4 遍历所有轮廓 如果轮廓点的数量大于等于5个
  • Ai绘画到底是创造艺术还是窃取艺术呢

    随着智能AI技术的发展 AI绘画已经成为一个非常热门的领域 AI绘画的应用范围非常广泛 它对于设计 摄影等领域产生了积极影响 但同时 由于AI绘画的版权究竟归属于谁 AI绘画也引起了版权的争议 那么 AI到底是创造艺术还是窃取艺术呢 本文将
  • 02线程池的结构体描述信息

    02线程池的结构体描述信息 01线程池原理剖析 02线程池的结构体描述信息 03线程池的各个函数解析 04线程池完整的头文件和实现文件 c 直接看代码 代码里有详细的注释 描述任务队列的结构体 typedef struct void fun
  • html+css实现一个响应式管理平台架构模板

    文本将会带你使用html css实现一个响应式的管理平台架构模板 目前来说市面上的管理平台架构模板大同小异 文本的知识点都会符合场景所需 目录 1 管理平台的架构内容 2 顶部的布局 3 下半部分布局 4 左侧菜单区域实现 5 右侧主体区域
  • 【EasyExcel 教程】详解写入Excel -- 写入

    愿你如阳光 明媚不忧伤 目録 4 详解写入Excel 4 1 简单写入Excel 4 2 根据参数导出指定列 排除或指定 4 3 指定写入的列 4 4 复杂头写入 4 5 日期 数字或者自定义格式的转换 4 6 图片导出 列宽 行高注解 4
  • react简介

    1 React简介 1 1 react发展历史 react是facebook开发的 vue 尤雨溪 angular 谷歌 收购的 facebook在构建instagram网站的时候遇见两个问题 数据绑定的时候 大量操作真实dom 性能成本太
  • python爬虫遇到的问题:selenium引用chromedriver出现的问题

    traceback Traceback most recent call last File D Anaconda35 lib site packages selenium webdriver chrome service py line
  • 大佬,一款小而美的Application组件,了解一下

    简介 Android开发过程中 Application类的角色不容忽视 它不仅是程序启动的入口 同时也代表着整个应用程序的生命周期 在Application中 我们通常执行以下操作 初始化各种第三方库 注册ActivityLifecycle
  • jQuery 入门教程(16): 设置或取得元素的CSS class

    jQuery支持方法用来操作HTML元素的CSS 属性 下面的方法为jQuery 提供的CSS操作方法 addClass 为指定的元素添加一个或多个CSS类 removeClass 为指定的元素删除一个或多个CSS类 toggleClass
  • Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

    技术背景 我们在Android平台实现GB28181设备接入 把摄像头和麦克风数据 采集过去 用于移动单兵 智能车载 智慧安防 智能家居 工业仿真等行业时 发现大多场景对视频水印的要求越来越高 从之前的固定位置静态文字水印 png水印等慢慢
  • IOS内购经常遇到的一些问题,和一些容易混淆的点。

    Q1 内购和Apple Pay的区别 A1 内购是内购 Apple Pay是Apple Pay 我不知道有多少人第一次接触时 会把这俩概念混淆掉 这里你可以简单这么理解 虚拟的物品就是用内购 实际的物品就是用Apple Pay Apple