当前位置: 首页 > 面试题库 >

使用单一产品在Swift中进行应用内购买

袁泰平
2023-03-14
问题内容

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

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

我不明白它的全部逻辑。

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

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

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

谢谢!


问题答案:

步骤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;
                }
            }
        }        
    }

迅捷 > 3.0

    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
        }


 类似资料:
  • 我正在尝试为我的android应用程序购买应用程序: 我已经阅读了关于测试的Android开发者网站,我已经成功地与游戏商店合作,内置测试/假冒产品,如android.test.purchased、android.test.canceled... 现在我想用我自己的真实产品测试应用内购买。因此,我在Google Play Store开发者控制台中指定了自己的产品。 我的问题是:根据android开

  • 我正在尝试在我的应用程序中设置付费产品。 我遵循了Flutter_Inapp_Purchase插件的所有指南,它们都说: 其中iapId是“我的应用程序的ID”。我围绕这个实现的所有其他代码都运行良好,因为当我使用'android.test.purveed'作为我的iapId字符串时,测试产品就会被找到并完美地加载到应用程序中。所以问题是我使用的字符串,因为没有其他的解释或例子给出关于它的任何地方

  • 我试图在Android中测试应用内购买。 我已经将一个私人签名的apk上传到Google Player Developer Console。它目前是“Alpha测试”部分的草稿。 当我尝试购买商品时,出现以下错误: 这让我感到困惑,因为我使用的是测试帐户,而不是用于发布此应用程序的帐户。 我怀疑它可能会失败,因为我的手机上有开发者帐户,但这是我的个人手机,所以我不想从手机上删除该帐户(特别是如果我

  • 我的 Alpha 测试人员可以很好地执行应用内购买。 我想在已经存在的一次性可购买升级中添加一个元素。例如,一次性升级已经包括“加电A”,但我想在升级中也包括“加电B”。 由于我所有的alpha测试人员都已经在以前版本的应用程序中购买了应用程序内升级,我可以验证他们现在可以访问A和B...但是我如何将我的alpha测试人员设置回“未购买”,以便我可以简单地测试购买流程,而无需求助于虚假的电子邮件帐

  • 准备工作 付费应用协议 如果你还没有,你需要在 iTunes Connect 签署付费应用协议, 并设置您的银行和税务信息。 iTunes Connect 开发人员帮助: 协议、税务和银行概述 创建您的应用内购买 然后,您需要在iTunes Connect中配置您的应用内购买,并包含名称,定价和说明等详细信息,以突出显示您的应用内购买的功能。 iTunes Connect开发人员帮助:创建应用程序

  • 我做了一个查询,计算有多少产品一起购买,但我不想有产品的两种方式在它 代码 输出 所以我只想拥有一次而不是两次,那可能吗(基于数量)?