2017-12-28 6 views
1

私はすでにアプリ内購入でカップルの日に遊んでいて、次の問題を発見しました。アプリ内購入が別のView Controllerにリダイレクト

私は現時点では、Apple Storeではなく、TestFlightでアプリケーションを使用しています。

ユーザーが購入できるアイテムのリストがあり、ユーザーが「購入」をタップすると、商品が選択された後、購入の確認と「送信」アクションの完了時にAlertViewControllerが表示されますAlertViewController私はIAP ManagerbuyProductと呼んでいます。

しかし、「購入」をタップすると、前のView Controllerにリダイレクトされ、「You:あなたはあなたのアプリケーション内購入を確認する」ダイアログボックスに「キャンセル/購入」に関する通常のダイアログが表示されます。 「すべてセットされている」以前のView Controllerに表示されます。

TestFlight版であればOKです。これが私がApple Storeで持っている動作なら、それは私が修正が必要な悪いです。ここに私のアプリ内購入マネージャーは次のとおりです。

class IAPManager: NSObject { 
static let sharedInstance = IAPManager() 

static let IAPManagerPurchaseNotification = "IAPManagerPurchaseNotification" 

fileprivate var productsRequest: SKProductsRequest? 
fileprivate var productsRequestCompletionHandler: ProductsRequestCompletionHandler? 

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

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

/// Request products from Apple Store. 
/// - parameter products: IAPProduct to purchase. 
func requestProduct(products: [IAPProduct], _ completionHandler: @escaping ProductsRequestCompletionHandler) { 
    productsRequest?.cancel() 
    productsRequestCompletionHandler = completionHandler 

    var productIdentifiers: Set<String> = Set<String>() 
    for product in products { 
     productIdentifiers.insert(product.rawValue) 
    } 

    productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers) 
    productsRequest?.delegate = self 
    productsRequest?.start() 
} 

/// Does actual purchasing against Apple Store. 
/// - parameter product: product that user wants to purchase. 
func buyProduct(_ product: SKProduct) { 
    Log.info(message: "User \(UsersManager.sharedInstance.currentUserId) is purchasing \(product.productIdentifier)", sender: self) 
    let payment = SKPayment(product: product) 
    SKPaymentQueue.default().add(payment) 
} 

class func canMakePayments() -> Bool { 
    return SKPaymentQueue.canMakePayments() 
} 

/// Restores previously purchased non-consumable items. 
func restorePurchases() { 
    SKPaymentQueue.default().restoreCompletedTransactions() 
} 
} 

extension IAPManager: SKProductsRequestDelegate { 
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
    Log.info(message: "Loaded list of products...", sender: self) 
    let products = response.products 
    productsRequestCompletionHandler?(true, products) 
    clearRequestAndHandler() 

    for p in products { 
     Log.info(message: "Found product: \(p.productIdentifier) \(p.localizedTitle) \(p.price.floatValue)", sender: self) 
    } 
} 

func request(_ request: SKRequest, didFailWithError error: Error) { 
    Log.error(message: "Failed to load list of products with error: \(error.localizedDescription)", sender: self) 
    productsRequestCompletionHandler?(false, nil) 
    clearRequestAndHandler() 
} 

private func clearRequestAndHandler() { 
    productsRequest = nil 
    productsRequestCompletionHandler = nil 
} 
} 

extension IAPManager: SKPaymentTransactionObserver { 
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    for transaction in transactions { 
     switch (transaction.transactionState) { 
      case .purchased: complete(transaction: transaction) 
      case .failed: fail(transaction: transaction) 
      case .restored: restore(transaction: transaction) 
      case .deferred: Log.info(message: "Purchase is deffered", sender: self) 
      case .purchasing: Log.info(message: "Purchase is in progress", sender: self) 
     } 
    } 
} 

private func complete(transaction: SKPaymentTransaction) { 
    Log.info(message: "Purchase is completed.", sender: self) 
    deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier) 
    SKPaymentQueue.default().finishTransaction(transaction) 
} 

private func restore(transaction: SKPaymentTransaction) { 
    guard let productIdentifier = transaction.original?.payment.productIdentifier else { 
     return 
    } 

    Log.info(message: "Purchase \(productIdentifier) is in restore state.", sender: self) 
    deliverPurchaseNotificationFor(identifier: productIdentifier) 

    SKPaymentQueue.default().finishTransaction(transaction) 
} 

private func fail(transaction: SKPaymentTransaction) { 
    Log.info(message: "Purchase is failed.", sender: self) 
    if let transactionError = transaction.error as NSError? { 
     if transactionError.code != SKError.paymentCancelled.rawValue { 
      Log.error(message: "Transaction Error: \(transactionError.localizedDescription)", sender: self) 
     } 
    } 

    SKPaymentQueue.default().finishTransaction(transaction) 
} 

private func deliverPurchaseNotificationFor(identifier: String?) { 
    guard let identifier = identifier else { 
     return 
    } 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: IAPManager.IAPManagerPurchaseNotification), object: identifier) 
} 
} 

IAPManagerを呼び出すコード:

let alert = UIAlertController(title: "<Title>", message: "<Message>", preferredStyle: .alert) 
IAPManager.sharedInstance.requestProduct(products: [product]) { success, products in 
     guard success, let products = products, !products.isEmpty else { 
      Log.error(message: "Error occured during product request.", sender: self) 
      return 
     } 

     let product = products[0] 

     let submit = UIAlertAction(title: "Ok", style: .default) { action in     
      IAPManager.sharedInstance.buyProduct(product) 
     } 

     let cancel = UIAlertAction(title: "No", style: .destructive, handler: nil) 

     alert.addAction(submit) 
     alert.addAction(cancel) 

     self.present(alert, animated: true, completion: nil) 
    } 
+0

これは通常の動作ではありません@Array、あなたの警告機能を確認するコードがあります。 –

+0

いいえ、アプリ内購入マネージャ – Array

+0

Btwのコードを更新しました。これは他の要因によって引き起こされたものかもしれません。 – Array

答えて

0

問題は自分自身で消えました。私はマルチスレッドを修正していましたが、それが原因でした。私は現時点では再現できませんが、本当の原因を見つけることができれば、ここに投稿します。皆さんありがとう。