Не могу получить список покупок - PullRequest
0 голосов
/ 09 октября 2018

Я добавляю в приложение покупки в приложении.Я создал приложение в AppleStoreConnect, я создал там те же покупки.enter image description here

В приложении я включил функции в приложениях.Я создал Enum для идентификаторов покупок.

import Foundation

enum IAPProducts: String {
    case first = "400CN"
    case second = "1300CN"
    case third = "5000CN"
}

Я также создал синглтон для обработки покупок.

import Foundation
import StoreKit

class IAPManager: NSObject {

    static let shared = IAPManager()
    private override init() {}

    var products: [SKProduct] = []
    let paymentQueue = SKPaymentQueue.default()

    public func setupPurchases(callback: @escaping(Bool) -> ()) {
        if SKPaymentQueue.canMakePayments() {
            paymentQueue.add(self)
            callback(true)
            return
        }
        callback(false)
    }

    public func getProducts() {
        let identifiers: Set = [
            IAPProducts.first.rawValue,
            IAPProducts.second.rawValue,
            IAPProducts.third.rawValue
        ]

        let productRequest = SKProductsRequest(productIdentifiers: identifiers)
        productRequest.delegate = self
        productRequest.start()
    }

    public func purchase(productWith identifier: String) {
        guard let product = products.filter({ $0.productIdentifier == identifier }).first else { return }
        let payment = SKPayment(product: product)
        paymentQueue.add(payment)
    }

}

extension IAPManager: SKPaymentTransactionObserver {

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .deferred:
                break
            case .purchasing:
                break
            case .failed:
                failed(transaction: transaction)
            case .purchased:
                completed(transaction: transaction)
            case .restored:
                break
            }
        }
    }
}

extension IAPManager: SKProductsRequestDelegate {

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        self.products = response.products
        products.forEach { print($0.localizedTitle) }
    }
}

В AppDelegate я проверяю возможность совершения покупок и получаю список доступных покупок..

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 
    IAPManager.shared.setupPurchases { success in
        if success {
            print("can make payments")
            IAPManager.shared.getProducts()
        }
    }
    return true
}

В этом случае надпись «может совершать платежи» отображается в консоли, а не в списке покупок.В чем может быть проблема и как ее решить?

1 Ответ

0 голосов
/ 09 октября 2018
enum IAPProducts: String {
   case first = "com.your.product.identifier"
   case second = "com.your.product.identifier2"
   case third = "com.your.product.identifier3"

   /// Get the all product strings
   static var allString: [String] {
       return [self.first.rawValue,
              self.second.rawValue,
              self.third.rawValue]
   }
}

-

class IAPManager: NSObject {

// Singleton
static let shared = IAPManager()    

// Properties
var products = [SKProduct]()
let paymentQueue = SKPaymentQueue.default()

private override init() {
    super.init()
    self.paymentQueue.add(self)
}

/// Get all product information from Appstore
func getProducts() {
    let productIdentifiers: Set = Set(Products.allString)
    let request = SKProductsRequest(productIdentifiers: productIdentifiers)
    request.delegate = self
    request.start()
}

/// Purchase product with identifier
func purchase(product: Products) {
    guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first else
    { return }

    let payment = SKPayment(product: productToPurchase)
    paymentQueue.add(payment)
}
}

--- Делегат приложения

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 
   IAPManager.shared.getProducts()
   return true
}

Вы можете попробовать это.Это, вероятно, будет работать.Я думаю, что может сделать использование MakePayment неисправным ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...