Swift5.X版本StoreKit原生内购
内购是移动端一值在讨论的话题,每次上架内购功能要做好被拒的准备,小萌在2年前也做过内购,是OC版本,回想那段往事一把血泪呀,被拒了无数次才把内购功能送上AppStore
小萌之前的OC内购,中间也经历了不少的困难,详情请看苹果内购审核那些被拒的原因,不过之前是用OC封装的,现在小萌的主要语言是Swift,闲暇之余做了Swift5.X内购StoreKit原生的封装,特别齐全,可以直接使用哦Swift版StoreKit的内购Demo
语言: Swift5
Xcode: 11.4.1
环境: Mac CataLina 10.15.4
注意⚠️: 不建议大家升级,不能传送大文件,小萌升级之后上传AppStore就没有成功过
一、内购的流程
网上有很多,也是各种各样,不过小萌对下面的这张图很感兴趣,好好的研究了一下这张图,看完之后茅塞顿开呀
总结内购流程:
1、获取内购列表(从App内读取或从自己服务器读取(推荐服务器获取))
2、App Store请求可用的内购列表(其实就是判断从服务器获取的产品列表是否可用)
3、向用户展示内购列表
4、用户选择了要购买的产品,发个购买请求,收到购买完成的回调(购买完成后会把钱打给申请内购的银行卡内)
5、购买流程结束后, 向服务器发起验证凭证以及支付结果的请求
6、自己的服务器将支付结果信息返回给前端并发放虚拟产品
7、服务端的工作比较简单,分4步:
7.1、接收ios端发过来的购买凭证。7.2、判断凭证是否已经存在或验证过,然后存储该凭证。7.3、将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。7.4、如果需要,修改用户相应的会员权限。7.5、考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。
简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。
二、审核流程
网上特别多,小萌在这里就不分享了,小萌主要分享一下,上架的时候注意事项
三、创建产品流程
小萌在创建产品的之后提交AppStore上,因为创建的产品不符合要求,也被拒绝过一次,所以在这里分享一下内购产品创建需要注意的地方
第一步:填写参考名称和内购产品的ID
第二步:选择定价,保持一致
第三步:填写说明和描述,说明可以随意填,但是一定要有意义,描述一定是消耗多少人民币获得多少自己定义的币
第四步:App Store推广 无特殊需要不用传图片
第五步:截屏一定包含内购信息,否则会审核不通过,审核备注里面自己的测试账号和密码写进去,方便测试人员测试哦
四、注意事项
注意⚠️:
1、别提示是否登录,如果没有登录,点击直接跳到登录界面即可,一定不要询问哦
2、别提示是否购买,直接购买即可,美国就是这么直接呀,不买不要点击嘛,增加审核通过率
3、充值说明一定要有,并且声明仅限iOS系统使用,其他系统无权使用
4、创建项目的时候App Store 推广那里的图片是可选的,不必要选哦,如下图⬇️所示
5、还有其他需要注意的地方,详情看苹果内购审核那些被拒的原因,一次又一次被拒的血泪!
五、苹果的二次验证
第一次:交易完成后在移动端验证,返回正确的数据,验证完毕
第二次:小萌交给了后台去做验证,传了Base64位编码数据给后台
六、DemoSwift版StoreKit的内购Demo
小萌已经做了Swift的StoreKit原生的封装,下载直接可以使用
//交易完成在这里完成苹果验证func completeTransaction(transaction:SKPaymentTransaction){// let environmentStr = String(data: transaction, encoding: .utf8)// 验证凭据,获取到苹果返回的交易凭据// appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址let receiptURL = Bundle.main.appStoreReceiptURL// 从沙盒中获取到购买凭据let receiptData = NSData(contentsOf: receiptURL!)// 发送网络POST请求,对购买凭据进行验证var urls : URL?let receiptURLString = receiptURL?.absoluteStringif receiptURLString?.contains("sandbox") == true { //判断是沙盒路径还是正式环境urls = URL(string: ITMS_SANDBOX_VERIFY_RECEIPT_URL)}else{urls = URL(string: VERIFY_RECEIPT_URL)}// 国内访问苹果服务器比较慢,timeoutInterval需要长一点var requset = URLRequest(url: urls!, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)requset.httpMethod = "POST"// 在网络中传输数据,大多情况下是传输的字符串而不是二进制数据// 传输的是BASE64编码的字符串/**BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性BASE64是可以编码和解码的*/let encodeStr = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions.endLineWithLineFeed)let payload = NSString(string: "{\"receipt-data\" : \"" + encodeStr! + "\"}")
// print(payload)let payloadData = payload.data(using: String.Encoding.utf8.rawValue)requset.httpBody = payloadData;weak var weakSelf = self //避免循环引用let result = URLSession.shared.dataTask(with: requset) { (data, response, error) inif data == nil{print("验证失败")return}if response == nil {print("验证失败")return}let dict = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers)if dict != nil {// print(dict!)}NotificationCenter.default.post(name: NSNotification.Name(rawValue: ProductPurchasedNotification), object: nil)weakSelf?.finishTransaction(transaction: transaction)}result.resume()}
这是验证流程,具体封装代码可以下载Swift版StoreKit的内购Demo,直接使用项目中的StoreObserver.swift文件即可,单例模式设计,很简单哦
Swift5.X版本StoreKit原生内购相关推荐
- cocos creator 发布IOS版本(六)内购
cocos creator 版本3.3 参考文档: iOS 内购(In-App Purchase)总结 | 笑忘书店 iOS的应用内支付In-app purchase的开发 - 胡东东博客 App内购 ...
- IOS,苹果内购和添加广告
内购--应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告(降低用户体验 应用程序名称带Lite可以添加广告) O2O -> Online推 ...
- 苹果内购IAP记录-2 StoreKit新版
苹果内购新版的StoreKit2只支持iOS15以上,新的nsync同步接口,简单的使用如下: @available(iOS 15.0, *) public class MXLiveIAPStoreV ...
- iOS 内购StoreKit 框架介绍
StoreKit 框架介绍 一.StoreKit 能做什么? In-App Purchase 提供和促进内容和服务的应用内购买. Apple Music 检查用户的Apple Music功能并提供订阅 ...
- iOS开发内购详细版本说明
转自:http://www.jianshu.com/p/c252b2ccb078 一.最近公司很多的项目用到了内购,抽空整理下内购的详细内容吧. 1.先从内购的iTunesConnect里配置说起吧, ...
- swift5 接入内购全流程
公司需要对接内购,顺便记录一下过程. 填写苹果协议 app store connect 协议 填写其中的付费 App,填写点公司名称.公司简介.公司帐号.公司之类的. 由于已经填写过了无法截图,可以去 ...
- 苹果 iOS 内购三步曲:App 内退款、历史订单查询、绑定用户防掉单
????????关注后回复 "进群" ,拉你进程序员交流群???????? 转自:掘金 37手游iOS技术运营团队 https://juejin.cn/post/697473339 ...
- 苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21
一.前言 如果大家的 App 有使用 IAP 功能,那么可能会遇到用户反馈苹果充值成功,但是服务没有到账的情况,用户一般会提供这样的苹果收据: 用户反馈时提供的苹果收据中,有一个字段中 ORDER I ...
- App Store内购机制
如今,不同系统平台都有专属的商店应用,Android平台有Google Play,Windows平台有Windows Store,iOS与macOS平台则有App Store.苹果公司的成功,很大程度 ...
最新文章
- 查看java内存_怎么查看java虚拟机存储空间使用情况
- 通过神经图稳定对脑机接口的即插即用控制,四肢瘫痪患者可以轻松控制电脑光标...
- day for people, night for material
- WARNING: The host '$hostname' could not be looked up with resolveip. (转)
- python列表添加元素到中间_python在列表的元素中间插入空行
- 如何实现轮播图的内容的多少随div的大小动态变化_小程序学习日志8:swiper滑动轮播组件(轮播图)(上)...
- CSS的预编译——less语言基本语法教程(入门)
- L1-045 宇宙无敌大招呼-PAT团体程序设计天梯赛GPLT
- Android Paint 详细讲解
- C# Excel绘制组合图
- 嵌入式系统开发流程是怎样的?
- 【Scratch画图100例】图39-scratch实心圆 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例
- 干货 | 使用京东云搭建视频直播网站
- 关于iTerm2 你不知道的一些事
- “番茄”让时间变成我们的朋友
- alex机器人 ser_机器人Alex
- 系统调优---emqx百万连接测试系统、网络、erlang虚拟机参数调优
- 纸片人算什么?教你造真“3D小姐姐”!可以动的模型
- ios 常用的宏定义
- TI am335x 内核分析2--资源遍历代码分析
热门文章
- 基于声信号的长距离供水管道泄漏监测系统方案
- linux 映射远程文件夹,Linux远程映射磁盘的方法
- 嵌入式linux哪个版本,嵌入式Linux的主流版本及开发商
- 解决因缺少msvcp71.dll无法启动Windows程序
- 复习Java第二个项目仿QQ聊天系统 03(两种通信类、登录以及注册功能完善) Java面试题并发编程相关知识生活【记录一个咸鱼大学生三个月的奋进生活】025
- VMware ESXi 8.0c Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)
- 手机上怎么用记事本?
- 深入浅出Activity插件化相关原理
- 文档管理使人力资源部门受益的 7 种主要方式
- 浅谈HTTP FTP和P2P网络大文件传输的优劣势