首页 > 解决方案 > 沙盒帐户经常需要登录

问题描述

为了测试我的应用内购买,我使用了沙盒帐户。然而,在测试之后,我收到了令人讨厌的警报,上面写着

 Sign-In Required 
Enter the password for .

[Environment Sandbox]

我已删除沙盒帐户,这意味着我不再无法登录该帐户。

我已采取的步骤(不起作用)
·删除并重新安装应用程序
·从我的个人 Apple ID 注销并登录
·使用我的备份恢复我的 iPhone
·循环通过 SKPaymentTransaction 并调用 finishTransaction

应用委托

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
・・・
        IAPManagerClear.shared.startObserving()

・・・
}

IAPClearViewController

class IAPClearViewController: UIViewController  {

    var products = [SKProduct]()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func viewDidAppear(_ animated: Bool) {
        viewDidSetup()
    }

    func viewDidSetup() {
        IAPManagerClear.shared.getProducts { (result) in
            DispatchQueue.main.async {
                switch result {
                case .success(let products): self.buy(products: products)
                    case .failure(let error): print(error)
                }
            }
        }
    }

    func buy(products:[SKProduct] ){
        print(products[0])
        IAPManagerClear.shared.buy(product: products[0]) { (result) in

        }
    }
}

IAPManager清除

class IAPManagerClear: NSObject {

    enum IAPManagerError: Error {
        case noProductIDsFound
        case noProductsFound
        case paymentWasCancelled
        case productRequestFailed
    }

    static let shared = IAPManagerClear()
    var onReceiveProductsHandler: ((Result<[SKProduct], IAPManagerError>) -> Void)?
    var onBuyProductHandler: ((Result<Bool, Error>) -> Void)?

    private override init() {
        super.init()
    }

    func getProducts(withHandler productsReceiveHandler: @escaping (_ result: Result<[SKProduct], IAPManagerError>) -> Void) {
        onReceiveProductsHandler = productsReceiveHandler
        let request = SKProductsRequest(productIdentifiers: Set(arrayLiteral: "com.appname.premium.subscription.monthly"))
        request.delegate = self
        request.start()
    }

    func startObserving() {
        SKPaymentQueue.default().add(self)
    }


    func stopObserving() {
        SKPaymentQueue.default().remove(self)
    }

    func buy(product: SKProduct, withHandler handler: @escaping ((_ result: Result<Bool, Error>) -> Void)) {
        let payment = SKPayment(product: product)
        SKPaymentQueue.default().add(payment)

        // Keep the completion handler.
        onBuyProductHandler = handler
    }
}

extension IAPManagerClear: SKPaymentTransactionObserver {
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        print("called")
        print(transactions)

//        let currentQueue : SKPaymentQueue = SKPaymentQueue.default()
//        print(currentQueue)
//        print(currentQueue.transactions)

        for transaction in transactions {
            print(transaction.error ?? "")
            if transaction.transactionState == .failed{
                queue.finishTransaction(transaction)
            }
        }
    }
}


extension IAPManagerClear: SKProductsRequestDelegate {
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
           let products = response.products

           // Check if there are any products available.
           if products.count > 0 {
               // Call the following handler passing the received products.
               onReceiveProductsHandler?(.success(products))
           } else {
               // No products were found.
               onReceiveProductsHandler?(.failure(.noProductsFound))
           }
    }


}

extension IAPManagerClear.IAPManagerError: LocalizedError {
    var errorDescription: String? {
        switch self {
        case .noProductIDsFound: return "No In-App Purchase product identifiers were found."
        case .noProductsFound: return "No In-App Purchases were found."
        case .productRequestFailed: return "Unable to fetch available In-App Purchase products at the moment."
        case .paymentWasCancelled: return "In-App Purchase process was cancelled."
        }
    }
}

出现警报时不调用 SKPaymentTransactionObserver。有没有人设法解决这个问题?

标签: iosswifttestingin-app-purchasestorekit

解决方案


推荐阅读