iOS Swift 开发内购实现 SwiftyStoreKit


title: Xcode 8.3.2 Swift 实现内购
date: 2017-05-25 14:58:32
categories:

  • Document
  • Code

tags:
- SwiftyStoreKit
- IAP


iOS 开发内购实现

代码环境

  • iOS IAP by Swift 3.1.1 , Xcode 8.3.2
  • Really Really Easy to use

需要的轮子

开始使用 (ItunesConnect)

Github Demo 地址

你需要有一个 App ( 肯定要有 付费的开发者账号 )

  • 在 itunesconnect.apple.com,中配置内购项目,如图右侧有一个(查看公共秘钥)(验证购买时需要使用)


    jpg14956962545142.jpg
  • 点击加号新建购买项目


    png4CB8F5CE-A1A5-4036-83DA-7ADEB3F2336E.png
  • 根据你们产品的不同选择对应的项目

  • 创建就很简单了,每一项都有介绍这里就不多说了

  • 创建沙箱技术测试员用于内购测试使用


    png08C982C8-C3C9-4405-8014-61947C73F3DD.png
  • 内容可以随便填写,需要注意的是 邮箱 和 密码需要记住(后面需要使用)


    png66BDEA86-FCE4-4510-BFBA-BF99A35F7206.png

使用此 App 的bundleID 唯一标示

  • 创建一个项目,项目的 bundleID 要与 iTunesconnect 中项目的id相同。

Cocoapods 导入 SwiftyStoreKit

  • pod 'SwiftyStoreKit' (内购轮子)
  • pod 'Alamofire' (网络请求轮子)

一切准备就绪-下面代码部分

  • AppDelegate 添加以下代码,在启动时添加应用程序的观察者可确保在应用程序的所有启动过程中都会持续,从而允许您的应用程序接收所有支付队列通知。如果此时有任何待处理的事务,将触发block,以便可以更新应用程序状态和UI。如果没有待处理的事务,则不会调用。
import SwiftyStoreKit


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    SwiftyStoreKit.completeTransactions(atomically: true) { purchases in
    
        for purchase in purchases {
    
            if purchase.transaction.transactionState == .purchased || purchase.transaction.transactionState == .restored {
    
               if purchase.needsFinishTransaction {
                   // Deliver content from server, then:
                   SwiftyStoreKit.finishTransaction(purchase.transaction)
               }
               print("purchased: \(purchase)")
            }
        }
    }
    return true
}
  • 获取内购项目列表
func getList() {
        SwiftyStoreKit.retrieveProductsInfo(["图1 内购项目的 产品ID 这个一般存储在服务器里"]) { result in
            if let product = result.retrievedProducts.first {
                let priceString = product.localizedPrice!
                print("Product: \(product.localizedDescription), price: \(priceString)")
            } else if let invalidProductId = result.invalidProductIDs.first {
                print("Invalid product identifier: \(invalidProductId)")
            } else {
                print("Error: \(result.error)")
            }
        }
    }

  • 这里是我的列表,因为就创建一个内购项目所以就一个


    pngC65895BF-CF49-47B1-87DD-27BDB7609FED.png
  • 购买 需要使用刚你在沙箱测试添加的邮箱密码登录(退出AppStore账号),购买的时候会提示你输入账号密码,此账号非appid账号,不能登录在appstore 走成功就说明购买成功了,简单点就是扣钱了,这时候是没有验证处理的。

SwiftyStoreKit.purchaseProduct("产品ID", quantity: 1, atomically: true) { result in
    switch result {
    case .success(let purchase):
        print("Purchase Success: \(purchase.productId)")
    case .error(let error):
        switch error.code {
        case .unknown: print("Unknown error. Please contact support")
        case .clientInvalid: print("Not allowed to make the payment")
        case .paymentCancelled: break
        case .paymentInvalid: print("The purchase identifier was invalid")
        case .paymentNotAllowed: print("The device is not allowed to make the payment")
        case .storeProductNotAvailable: print("The product is not available in the current storefront")
        case .cloudServicePermissionDenied: print("Access to cloud service information is not allowed")
        case .cloudServiceNetworkConnectionFailed: print("Could not connect to the network")
        case .cloudServiceRevoked: print("User has revoked permission to use this cloud service")
        }
    }
}
  • 验证购买,
    • 本地验证 (不推荐,越狱设备可能存在刷单漏洞)
    • 服务端验证 (推荐使用)
    // 本地验证(SwiftyStoreKit 已经写好的类) AppleReceiptValidator
    // .production 苹果验证  .sandbox 本地验证
 let receipt = AppleReceiptValidator(service: .production)
 let password = "公共秘钥"
 SwiftyStoreKit.verifyReceipt(using: receipt, password: password, completion: { (result) in
     switch result {
     case .success(let receipt):
      print("receipt--->\(receipt)")
         break
     case .error(let error):
      print("error--->\(error)")
         break
     }
 })
  • 服务器验证 AppleReceiptValidatorX 是我重写的类,里面就是把得到的data发给服务器让服务器来验证,返回成功失败即可不需要其他数据。

完成了,是不是很简单,是不是很好理解。

  • SwiftyStoreKit 不知能做购买,还能恢复购买,具体使用方法见 SwiftyStoreKit

基本阅读 --> SwiftyStoreKit

延伸阅读

App 内购验证

[官方文档]
(https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html)

License

AppPurchasesDemo is released under the MIT license. See LICENSE for details.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 一.总说内购的内容 协议、税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注...
    默默_David阅读 3,619评论 0 6
  • 一.总说内购的内容 协议、税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注...
    九洲仙人阅读 2,930评论 2 3
  • 自己开发的视频直播项目,牵涉到充值金币,用到了苹果公司的内购,趴坑了两天,这里总结下实现苹果内购。 一. 创建测试...
    Leo丶Dicaprio阅读 3,329评论 8 7
  • 1 、在iTunes Connect中,每个应用程序可以创建多少格内置购买产品 ID ? 阅读 In-App Pu...
    Dosun阅读 3,865评论 0 0
  • 梦娥 静望天边夜幕, 君心不知何处。 月阴转月晴, 误入蟾宫深处。 心宿! 心宿! 只缘嫦娥玉兔。 ...
    高一点儿阅读 635评论 5 15