HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在iOS 11中处理应用内购买的应用商店付款?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现新的 paymentQueue(_:shouldAddStorePayment:for:)方法,以便我的应用程序可以直接从App Store处理IAP.

我正在使用itms-services:// url来测试它,就像它说的那样here.

问题是,我的SKPaymenttransactionObserver是一个特定的视图控制器,如果在打开itms-services://链接时它不可见,则不会调用委托方法.

我@R_616_10753@?我想我必须检测用户是否来自App Store推送正确的视图控制器,但我不知道如何.我现在能想到的唯一另一个选择是让App Delegate成为SKPaymenttransactionObserver,但这看起来真的很麻烦,当我尝试它时我无法让它工作.还有别的办法吗?

解决方法

这是我所做的一个可以帮助你实现你想要的类,只需复制下面的代码并将其粘贴到一个文件中,然后你可以简单地访问类StoreManager.shared到你想要访问的任何方法/变量.

1-要初始化此类,只需从didFinishLaunchingWithOptions调用即可@H_301_13@StoreManager.shared.begin()然后添加付款观察员.

import Foundation
import StoreKit


class StoreManager: NSObject{



    /**
     Initialize StoreManager and load subscriptions SKProducts from Store
     */
    static let shared = StoreManager()

    func Begin(){
        print("StoreManager initialized"))
    }


    override init() {
        super.init()


        // Add pyament observer to payment qu
        SKPaymentQueue.default().add(self)


    }


    func requestProductWithID(identifers:Set<String>){

        if SKPaymentQueue.canMakePayments() {
            let request = SKProductsrequest(productIdentifiers:
                identifers)
            request.delegate = self
            request.start()


        } else {
            print("ERROR: Store Not Available")
        }


    }

    func buyProduct(product: SKProduct) {

        print("Buying \(product.productIdentifier)...")
        let payment = SKPayment(product: product)
        SKPaymentQueue.default().add(payment)


    }


    func restorePurchases(){

        SKPaymentQueue.default().restoreCompletedtransactions()
    }
    /*
     Instance variables

     */

}








// MARK:
// MARK: SKProductsrequestDelegate

//The delegate receives the product information that the request was interested in.
extension StoreManager:SKProductsrequestDelegate{

    func productsrequest(_ request: SKProductsrequest,didReceive response: SKProductsResponsE) {

        var products = response.products as [SKProduct]


        var buys = [SKProduct]()

        if (products.count > 0) {

            for i in 0 ..< products.count
            {
                let product = products[i]


                print("Product Found: ",product.localizedtitlE)
            }


        } else {
            print("No products found")
        }

        let productsInvalidIds = response.invalidProductIdentifiers

        for product in productsInvalidIds
        {
            print("Product not found: \(product)")
        }
    }


    func request(_ request: SKrequest,didFailWithError error: Error) {
        print("Something went wrong: \(error.localizedDescription)")
    }
}



// MARK:
// MARK: SKtransactions


extension StoreManager: SKPaymenttransactionObserver {



    public func paymentQueue(_ queue: SKPaymentQueue,updatedtransactions transactions: [SKPaymenttransaction]) {
        for transaction in transactions {
            switch (transaction.transactionStatE) {
            case .purchased:
                completetransaction(transaction: transaction)
                break
            case .Failed:
                Failedtransaction(transaction: transaction)
                break
            case .restored:
                restoretransaction(transaction: transaction)
                break
            case .deferred:
                // TODO show user that is waiTing for approval

                break
            case .purchasing:
                break
            }
        }
    }

    private func completetransaction(transaction: SKPaymenttransaction) {

        print("completetransaction...")

        deliverPurchaseForIdentifier(identifier: transaction.payment.productIdentifier)
        SKPaymentQueue.default().finishtransaction(transaction)
    }

    private func restoretransaction(transaction: SKPaymenttransaction) {


        guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }

        print("restoretransaction... \(productIdentifier)")


        deliverPurchaseForIdentifier(identifier: productIdentifier)
        SKPaymentQueue.default().finishtransaction(transaction)
    }

    private func Failedtransaction(transaction: SKPaymenttransaction) {

        if let error = transaction.error as NSError? {
            if error.domain == SKErrorDomain {
                // handle all possible errors
                switch (error.codE) {
                case SKError.unkNown.rawValue:
                    print("UnkNown error")

                case SKError.clienTinvalid.rawValue:
                    print("client is not allowed to issue the request")


                case SKError.paymentCancelled.rawValue:
                    print("user cancelled the request")

                case SKError.paymenTinvalid.rawValue:
                    print("purchase identifier was invalid")

                case SKError.paymentNotAllowed.rawValue:
                    print("this device is not allowed to make the payment")

                default:
                    break;
                }
            }


        }

        SKPaymentQueue.default().finishtransaction(transaction)
    }

    private func deliverPurchaseForIdentifier(identifier: String?) {

        guard let identifier = identifier else { return }


    }
}



//in-app Purchases App Store
extension StoreManager{

    func paymentQueue(_ queue: SKPaymentQueue,shouldAddStorePayment payment: SKPayment,for product: SKProduct) -> Bool {
        return true

        //To hold
        //return false

        //and then to conTinue
        //SKPaymentQueue.default().add(savedPayment)
    }

}

大佬总结

以上是大佬教程为你收集整理的如何在iOS 11中处理应用内购买的应用商店付款?全部内容,希望文章能够帮你解决如何在iOS 11中处理应用内购买的应用商店付款?所遇到的程序开发问题。

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

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