程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用单一产品在Swift中进行应用内购买大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用单一产品在Swift中进行应用内购买?

开发过程中遇到使用单一产品在Swift中进行应用内购买的问题如何解决?下面主要结合日常开发的经验,给出你关于使用单一产品在Swift中进行应用内购买的解决方法建议,希望对你解决使用单一产品在Swift中进行应用内购买有所启发或帮助;

步骤0:在您的iTunes Connect帐户中,创建一个应用内购买。

对于单次购买,请使用以下方法:

  1. 进口

    import StoreKit

  2. 符合StoreKit委托

    class YOURVIEwController: UIVIEwController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
  1. 使用用户默认值来跟踪交易
    let defaults = NSUserDefaults.standardUserDefaults()
  1. 产品编号。这将与您在iTunes Connect中购买的应用程序相同
    var product_ID: Nsstring?

    overrIDe func vIEwDIDLoad() {        
        product_ID = "YOUR_PRODUCT_ID"
        super.vIEwDIDLoad()
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)

        //Check if product is purchased

        if (defaults.boolForKey("purchased")){  
           // HIDe a vIEw or show content depends on your requirement
           overlayVIEw.hIDden = true     
        } else if (!defaults.boolForKey("stonerPurchased")) {
            print("false")            
        }
    }
  1. 解锁内容。这是按钮操作,它将初始化购买
    @IBAction func unlockAction(sender: AnyObject) {

       print("About to fetch the products")

       // We check that we are allow to make the purchase.
       if (SKPaymentQueue.canMakePayments()) {
            var productID:NSSet = NSSet(object: self.product_ID!);
            var productsRequest:SKProductsRequest = SKProductsRequest(productIDentifIErs: productID);
            productsRequest.delegate = self;
            productsRequest.start();
            println("Fetching Products");
        } else {
            print("can't make purchases");
        }    
    }
  1. 辅助方法
    func buyProduct(product: SKProduct) {
        println("Sending the Payment Request to Apple");
        var payment = SKPayment(product: product)
        SKPaymentQueue.defaultQueue().addPayment(payment);
    }
  1. IAP的代表方法
    func productsRequest (request: SKProductsRequest, dIDReceiveResponse response: SKProductsResponse) {

        var count : Int = response.products.count
        if (count>0) {
            var valIDProducts = response.products
            var valIDProduct: SKProduct = response.products[0] as SKProduct
            if (valIDProduct.productIDentifIEr == self.product_ID) {
                print(valIDProduct.localizedTitle)
                print(valIDProduct.localizedDescription)
                print(valIDProduct.price)
                buyProduct(valIDProduct);
            } else {
                print(valIDProduct.productIDentifIEr)
            }
        } else {
            print("nothing")
        }
    }    

    func request(request: SKRequest!, dIDFailWithError error: NSError!) {
        print("Error Fetching product information");
    }

    func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)    {
        print("Received Payment Transaction Response from Apple");

        for transaction:AnyObject in transactions {
            if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
                switch trans.transactionState {
                case .Purchased:
                    print("Product Purchased");
                    SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                    defaults.setBool(true , forKey: "purchased")
                    overlayVIEw.hIDden = true
                    break;
                case .Failed:
                    print("Purchased Failed");
                    SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                    break;
                case .Restored:
                    print("Already Purchased");
                    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()    
                default:
                    break;
                }
            }
        }        
    }

    import StoreKit
    class YOURVIEWController:UIVIEwController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

    let product_ID: Nsstring = "com.some.inappID" // <!-- Change it to your inapp ID

在您的vIEwDIDLoad添加中

    overrIDe func vIEwDIDLoad() {
        super.vIEwDIDLoad()
        SKPaymentQueue.default().add(self)

在您的购买按钮操作中

    @IBAction func buyNowAction(_ sender: UIbutton) {


        if (SKPaymentQueue.canMakePayments()) {
            let productID:NSSet = NSSet(array: [self.product_ID as Nsstring]);
            let productsRequest:SKProductsRequest = SKProductsRequest(productIDentifIErs: productID as! Set<String>);
            productsRequest.delegate = self;
            productsRequest.start();
            print("Fetching Products");
        } else {
            print("can't make purchases");
        }
    }

在“还原”按钮中

    // MARK: - Restore In App Purchase
        @IBAction func restoreAction(_ sender: UIbutton) {

        if (SKPaymentQueue.canMakePayments()) {
            SKPaymentQueue.default().add(self)
            SKPaymentQueue.default().restoreCompletedTransactions()
        } else {
            // show error
        }

    }

添加代表:

    // SKProductRequest Delegate

    func productsRequest(_ request: SKProductsRequest, dIDReceive response: SKProductsResponse) {

        print(response.products)
        let count : Int = response.products.count
        if (count>0) {

            let valIDProduct: SKProduct = response.products[0] as SKProduct
            if (valIDProduct.productIDentifIEr == self.product_ID as String) {
                print(valIDProduct.localizedTitle)
                print(valIDProduct.localizedDescription)
                print(valIDProduct.price)
                self.buyProduct(product: valIDProduct)
            } else {
                print(valIDProduct.productIDentifIEr)
            }
        } else {
            print("nothing")
        }
    }

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction:AnyObject in transactions {
            if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{

                self.dismisspurchaseBtn.isEnabled = true
                self.restorePurchaseBtn.isEnabled = true
                self.buyNowBtn.isEnabled = true

                switch trans.transactionState {
                case .purchased:
                    print("Product Purchased")
                    //Do unlocking etc stuff here in case of new purchase
                    SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)

                    break;
                case .Failed:
                    print("Purchased Failed");
                    SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
                    break;
                case .restored:
                    print("Already Purchased")
                    //Do unlocking etc stuff here in case of restor

                    SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
                default:
                    break;
                }
            }
        }
    }


    //If an error occurs, the code will go to this function
        func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
            // Show some alert
        }

解决方法

是否有一种简单的方法可以针对单个产品快速实施应用内购买?

我想要一个可以触发应用内购买的按钮,例如[广告删除]或[解锁高级内容]

我不明白它的全部逻辑。

我正在尝试从[Techotopia] http://www.techotopia.com/index.php/An_iOS_7_In-
App_Purchase_Tutorial中阅读并翻译此教程

但这是我第一次使用StoreKit框架,也是使用Swift。

我只想了解Swift StoreKit框架内应用内购买交易的逻辑。

谢谢!

大佬总结

以上是大佬教程为你收集整理的使用单一产品在Swift中进行应用内购买全部内容,希望文章能够帮你解决使用单一产品在Swift中进行应用内购买所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: