SwiftyStoreKit 使用

本文介绍了如何在Swift中使用SwiftyStoreKit库来管理应用内购买,包括获取产品列表、购买商品、验证收据以及恢复购买等功能。

import SwiftyStoreKit
import SwiftyJSON

class CDIAPManager: NSObject {
    class func getPurchaseProductList(retur:@escaping (_ productArr:[CDAppBuyInfo]) ->Void){
        SwiftyStoreKit.retrieveProductsInfo(["xxx","xxx","xxx"]) { result in
            var arr:[NKAppBuyInfo] = []
            if result.retrievedProducts.count > 0 {
                print("app 内购获取列表成功")
                for product in result.retrievedProducts {
                    let info = CDAppBuyInfo()
                    info.productIdentifier = product.productIdentifier
                    info.price = product.localizedPrice!
                    info.title = product.localizedTitle
                retur(newArr)
            }else{
                print("app 内购获取列表失败 = \(String(describing: result.error?.localizedDescription))")
            }
            
        }
    }
    
    class func purchaseProduct(productIDs:String,complete:@escaping (Bool)->Void){
        SwiftyStoreKit.purchaseProduct(productIDs, quantity: 1, atomically: true) { result in
            switch result {
            case .success(let purchase):
                print("Purchase Success: \(purchase.productId)")
                verifyReceipt(service: .production, isRestor: false, product_id: purchase.productId)
                complete(true)
            case .error(let error):
                complete(false)
                print("Purchase Faile: \(error.code)")
                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")
                case .privacyAcknowledgementRequired: break
                case .unauthorizedRequestData:break
                case .invalidOfferIdentifier:break
                case .invalidSignature:break
                case .missingOfferParams:break
                case .invalidOfferPrice:break
                case .overlayCancelled:break
                case .overlayInvalidConfiguration:break
                case .overlayTimeout:break
                case .ineligibleForOffer:break
                case .unsupportedPlatform:break
                case .overlayPresentedInBackgroundScene:break
                @unknown default:break

                }
            }
        }
    }
    
    class func restoreProduct(){
        SwiftyStoreKit.restorePurchases(atomically: true, applicationUsername: "") { result in
            if result.restoreFailedPurchases.count > 0 {
                //恢复失败
                print("restore Failed:\(result.restoredPurchases)")
            }else if result.restoredPurchases.count > 0 {
                print("restore Success")
                verifyReceipt(service: .production, isRestor: true, product_id: "")
            }else{
                print("Nothing to Restore")
            }
        }
    }
    
    class func verifyReceipt(service:AppleReceiptValidator.VerifyReceiptURLType,isRestor:Bool,product_id:String){
        let receipt = AppleReceiptValidator(service: service, sharedSecret: IAPPubKey)
        SwiftyStoreKit.verifyReceipt(using: receipt) { result in
            switch result {
            case .success(let receipt):
                let json = JSON(receipt)
                let status = json["status"].intValue
                if status == 0{
                    print("订单验证成功receipt = \(receipt)")
                    //验证是否过期
                    DispatchQueue.main.async {
                        let in_apps = json["latest_receipt_info"].arrayValue
                        for appJson in in_apps {
                            let expiresTime = appJson["expires_date_ms"].intValue
                            let productId = appJson["product_id"].stringValue
                            let current =  GetTimestamp(nil) * 1000
                            if expiresTime > current {
                                print("订单验证OK,过期时间:\(expiresTime),当前时间:\(current)")
                                if isRestor {
                                   // Restor  success do something
                                    }
                                }else{
                                    // purchase  success do something
                                }
                            }
                        }
                    }
                }else if status == 21007 {
                    print("订单验证是沙盒模式-继续验证")
                    self.verifyReceipt(service: .sandbox, isRestor: isRestor, product_id: product_id)
                }else if status == 21006{
                    print("收据是有效的,但订阅服务已经过期")
                }else if status == 21003{
                    print("receipt无法通过验证")
                }
            case .error(let error):
                print("订单验证失败:\(error.localizedDescription)")

            }
        }
    }
    
    
    
    
}

### 如何在 Swift StoreKit 中实现应用内购买折扣 为了实现在 `Swift` 和 `StoreKit` 框架中的应用内购买 (In-App Purchase, IAP) 折扣功能,开发者可以利用一次性购买、订阅优惠或家庭共享等功能。对于提供折扣而言,通常涉及到的是订阅类型的IAP。 #### 订阅促销和折扣机制 Apple 提供了几种方式让用户享受订阅服务的价格优惠: - **免费试用期**:允许新用户提供有限时间内的完全免费访问权限。 - **引入优惠**:给予首次订阅者一定期限的低价位体验。 - **续订折扣**:为现有用户提供降低后的价格继续其订阅。 这些选项都可以通过 `SKProductDiscount` 类来表示,并且可以通过 `SKMutableSubscriptionOptions` 来配置新的订阅优惠[^1]。 #### 实现步骤概述 创建带有折扣的应用内购项目涉及几个主要方面: ##### 配置 iTunes Connect 上的产品详情 确保已经在 App Store Connect 的 "Features" 页面下启用了自动更新订阅以及任何所需的特别报价设置。这一步骤不在编程范围内,而是应用程序发布前准备工作的组成部分之一。 ##### 请求可用的产品列表 使用 `SKProductsRequest` 对象向 Apple 查询有关特定产品的信息,包括是否有活动的促销或折扣适用。一旦收到响应,则会触发委托方法 `productsRequest(_:didReceive:)` ,从中可以获得包含当前有效折扣在内的产品数据[^3]。 ```swift let productIdentifiers: Set<String> = ["com.example.app.subscription"] let request = SKProductsRequest(productIdentifiers: productIdentifiers) request.delegate = self request.start() ``` ##### 处理接收到的产品信息 当实现了 `SKProductsRequestDelegate` 协议的方法后,在这里可以根据返回的数据判断是否存在有效的折扣。如果存在的话,就可以展示给用户相应的折扣价了。 ```swift func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { guard let validProduct = response.products.first else { return } // Check if there is an active discount available. if !validProduct.introductoryPrice.isNil { print("Introductory price found.") // Display the discounted amount to users here... } else { print("No introductory price offered at this time.") } } ``` 请注意上述代码片段假设只查询了一个产品ID;实际开发过程中可能需要遍历整个 `response.products` 数组以找到目标商品并检查它们各自的折扣情况。 ##### 应用程序内部逻辑调整 最后一点是要确保应用程序本身能够正确反映所选计划的实际成本变化——无论是显示界面还是后台结算过程都应考虑到这一点。此外还需要注意不同地区货币单位之间的转换问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值