title: Xcode 8.3.2 Swift 實現(xiàn)內(nèi)購
date: 2017-05-25 14:58:32
categories:
- Document
- Code
tags:
- SwiftyStoreKit
- IAP
iOS 開發(fā)內(nèi)購實現(xiàn)
代碼環(huán)境
- iOS IAP by Swift 3.1.1 , Xcode 8.3.2
- Really Really Easy to use
需要的輪子
開始使用 (ItunesConnect)
你需要有一個 App ( 肯定要有 付費的開發(fā)者賬號 )
-
在 itunesconnect.apple.com弹渔,中配置內(nèi)購項目隙疚,如圖右側有一個(查看公共秘鑰)(驗證購買時需要使用)
-
點擊加號新建購買項目
根據(jù)你們產(chǎn)品的不同選擇對應的項目
創(chuàng)建就很簡單了拦耐,每一項都有介紹這里就不多說了
-
創(chuàng)建沙箱技術測試員用于內(nèi)購測試使用
-
內(nèi)容可以隨便填寫,需要注意的是 郵箱 和 密碼需要記住(后面需要使用)
使用此 App 的bundleID 唯一標示
- 創(chuàng)建一個項目躏筏,項目的 bundleID 要與 iTunesconnect 中項目的id相同镰吵。
Cocoapods 導入 SwiftyStoreKit
- pod 'SwiftyStoreKit' (內(nèi)購輪子)
- pod 'Alamofire' (網(wǎng)絡請求輪子)
一切準備就緒-下面代碼部分
- AppDelegate 添加以下代碼,在啟動時添加應用程序的觀察者可確保在應用程序的所有啟動過程中都會持續(xù)斜做,從而允許您的應用程序接收所有支付隊列通知。如果此時有任何待處理的事務湾揽,將觸發(fā)block瓤逼,以便可以更新應用程序狀態(tài)和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
}
- 獲取內(nèi)購項目列表
func getList() {
SwiftyStoreKit.retrieveProductsInfo(["圖1 內(nèi)購項目的 產(chǎn)品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)")
}
}
}
-
這里是我的列表,因為就創(chuàng)建一個內(nèi)購項目所以就一個
購買 需要使用剛你在沙箱測試添加的郵箱密碼登錄(退出AppStore賬號)戚揭,購買的時候會提示你輸入賬號密碼诱告,此賬號非appid賬號,不能登錄在appstore 走成功就說明購買成功了民晒,簡單點就是扣錢了精居,這時候是沒有驗證處理的锄禽。
SwiftyStoreKit.purchaseProduct("產(chǎn)品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 已經(jīng)寫好的類) 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發(fā)給服務器讓服務器來驗證,返回成功失敗即可不需要其他數(shù)據(jù)空猜。
完成了绽慈,是不是很簡單,是不是很好理解辈毯。
- SwiftyStoreKit 不知能做購買坝疼,還能恢復購買,具體使用方法見 SwiftyStoreKit
基本閱讀 --> SwiftyStoreKit
- Apple - WWDC16, Session 702: Using Store Kit for In-app Purchases with Swift 3
- Apple - TN2387: In-App Purchase Best Practices
- Apple - About Receipt Validation
- Apple - Receipt Validation Programming Guide
- Apple - Validating Receipts Locally
- Apple - Working with Subscriptions
- Apple - Offering Subscriptions
- Apple - Restoring Purchased Products
- objc.io - Receipt Validation
- Apple TN 2413 - Why are my product identifiers being returned in the invalidProductIdentifiers array?
- Invalid Product IDs: Checklist of common mistakes
延伸閱讀
License
AppPurchasesDemo is released under the MIT license. See LICENSE for details.