2016-05-07 4 views
0

テストモードで商品を購入する際に問題が発生します。私は2つのビューコントローラーを持っています。 viewcontroller2はIAPクラスです。コインを買うことはうまく動作し、そのディスプレイはビューコントローラ1にあるラベルにコインを完璧に買った。だから、私がviewcontroller1(コインを使う場所)に切り替えて、viewcontroller2に戻り、コインを買うために買いボタンをもう一度押すとクラッシュします。ViewController respondsToSelector:消耗品の購入中に割り当て解除されたインスタンスにメッセージが送信される

viewcontroller2:あなたはそのエラーを調査するために楽器を使用することができます

import UIKit 
import StoreKit 

public var coins = NSUserDefaults.standardUserDefaults().integerForKey("coins") 
public var ads = NSUserDefaults.standardUserDefaults().boolForKey("purchased") 

class ViewController2: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver{ 

@IBOutlet var lblAd: UILabel! 
@IBOutlet var lblCoinAmount: UILabel! 

@IBOutlet var outRemoveAds: UIButton! 
@IBOutlet var outAddCoins: UIButton! 



// 1 
override func viewDidLoad() { 
    super.viewDidLoad() 

    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 




    outRemoveAds.enabled = false 
    outAddCoins.enabled = false 

    // Set IAPS 
    if(SKPaymentQueue.canMakePayments()) { 
     print("IAP is enabled, loading") 
     let productID:NSSet = NSSet(objects: "productId1", "productId2") 
     let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) 

     request.delegate = self 
     request.start() 
    } else { 
     print("please enable IAPS") 
    } 

    lblCoinAmount.text = "\(coins)" 

} 



// 2 
@IBAction func btnRemoveAds(sender: UIButton) { 
    for product in list { 
     let prodID = product.productIdentifier 
     if(prodID == "productId1") { 
      p = product 
      buyProduct() 
      break; 
     } 
    } 

} 

// 3 
@IBAction func btnAddCoins(sender: UIButton) { 
    for product in list { 
     let prodID = product.productIdentifier 
     if(prodID == "productId2") { 
      p = product 
      buyProduct() 
      break; 
     } 
    } 

} 

// 4 
func removeAds() { 
    //lblAd.removeFromSuperview() 
    let adsDefault = NSUserDefaults.standardUserDefaults() 
    adsDefault.setBool(true , forKey: "purchased") 
    adsDefault.synchronize() 

} 

// 5 
func addCoins() { 
    coins = coins + 50 
    lblCoinAmount.text = "\(coins)" 

    let CoinsDefault = NSUserDefaults.standardUserDefaults() 
    CoinsDefault.setInteger(coins, forKey: "coins") 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


@IBAction func RestorePurchases(sender: UIButton) { 
    //SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
} 


var list = [SKProduct]() 
var p = SKProduct() 



func buyProduct() { 
    print("buy " + p.productIdentifier) 
    let pay = SKPayment(product: p) 
    //SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    SKPaymentQueue.defaultQueue().addPayment(pay) 
} 

func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { 
    print("product request") 
    let myProduct = response.products 

    for product in myProduct { 
     print("product added") 
     print(product.productIdentifier) 
     print(product.localizedTitle) 
     print(product.localizedDescription) 
     print(product.price) 

     list.append(product) 
    } 

    outRemoveAds.enabled = true 
    outAddCoins.enabled = true 
} 

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { 
    print("transactions restored") 

    for transaction in queue.transactions { 
     let t: SKPaymentTransaction = transaction 

     let prodID = t.payment.productIdentifier as String 

     switch prodID { 
     case "productId1": 
      print("remove ads") 
      removeAds() 
     case "productId2": 
      print("add coins to account") 
      addCoins() 
     default: 
      print("IAP not setup") 
     } 

    } 
} 


func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    print("add paymnet") 

    for transaction:AnyObject in transactions { 
     let trans = transaction as! SKPaymentTransaction 
     print(trans.error) 

     switch trans.transactionState { 

     case .Purchased: 
      print("buy, ok unlock iap here") 
      print(p.productIdentifier) 

      let prodID = p.productIdentifier as String 


      switch prodID { 
      case "productId1": 
       print("remove ads") 
       removeAds() 
      case "productId2": 
       print("add coins to account") 
       addCoins() 

      default: 
       print("IAP not setup") 
      } 

      queue.finishTransaction(trans) 
      break; 
     case .Failed: 
      print("buy error") 
      queue.finishTransaction(trans) 
      break; 
     default: 
      print("default") 
      break; 

     } 
    } 
} 

func finishTransaction(trans:SKPaymentTransaction) 
{ 
    print("finish trans") 
    SKPaymentQueue.defaultQueue().finishTransaction(trans) 
} 
func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) 
{ 
    print("remove trans"); 
} 




} 

enter image description here enter image description here

答えて

1

での機能:

override func viewWillDisappear(animated: Bool) { 
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 
} 
0

。 アプリケーションのプロファイル(Cmd⌘+ I)とし、ゾンビと呼ばれるテンプレートを選択します。

もう一度アプリをクラッシュさせてください。その時点で、 "ゾンビ"オブジェクトとそのスタック状態に関する詳細を取得する必要があります。 あなたが原因を見つけるために管理していない場合、あなたは拡張詳細ペインオープンで楽器のスクリーンショットを添付することができます - deinitのコード次可能であれば、私は、お手伝いします:)

1

使用あなたは、この行が欠落しているviewcontrollers

SKPaymentQueue.defaultQueue().removeTransactionObserver 
関連する問題