2016-05-24 3 views
0

を出るとき、私は、ユーザーが購入する「広告を削除する」とゲーム通貨などでできIAPシーンOptionsPage: SKSceneを実装している。しかし、私はすぐに戻ってメニューにMenuScene: SKSceneからOptionsPage: SKSceneに移動した場合、それはThread 1: EXC_BAD_ACCESS (code=1, address=0x216d0716)とでクラッシュ下のログの唯一のものは(lldb)です。SKProductRequestDelegateクラッシュビュー

SKPaymentQueue.defaultQueue().removeTransactionObserver(self)willMoveFromView()に電話しています。

私のdidMoveToViewには、setIAP()という機能があります(下記参照)。私はrequest.delegate = selfを設定するので、私が現場に入るときrequest.start()実行されますが、私はすぐにシーンrequest.delegate = selfを残すためであるたので常に(IAPを扱う初めて)テーブルに対して私の頭をバッシングした後

は、私はそれが起こっていると思いますもう有効ではない。

トランザクションオブザーバを削除すると、これはwillMoveFromViewで処理されると考えられました。この問題を回避するにはどうすればよいですか?ここで

は、私がここでtouchesBegan()

if removeAds.containsPoint(location) { 
       for product in list { 
        let prodID = product.productIdentifier 
        if (prodID == "removeAds") { 
         p = product 
         buyProduct() 
         break 
        } 
       } 
      } 

での購入を呼び出していますどのように、IAPセクションが

// MARK: In App Purchases 

func setIAP() { 
    // Set IAPS 
    if(SKPaymentQueue.canMakePayments()) { 
     print("IAP is enabled, loading") 
     let productID:NSSet = NSSet(objects: "removeAds, 10000coins") 
     let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) 
     request.delegate = self 
     request.start() 
    } else { 
     print("please enable IAPS") 
    } 
} 

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 as SKPayment) 
} 

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

    for product in myProduct { 
     print("Product added: \(product.productIdentifier), \(product.localizedTitle), \(product.localizedDescription), \(product.price)") 

     list.append(product) 
    } 
} 

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 "removeAds": 
      defaults.setBool(true, forKey: "removeAdsPurchased") 

     default: 
      print("IAP not setup") 
     } 
    } 

    let alert = UIAlertController(title: "Thank You", message: "Thankyou for your purchase.", preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
    self.view?.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil) 
} 

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, .Restored: 
      print(p.productIdentifier) 

      let prodID = p.productIdentifier as String 

      switch prodID { 
      case "removeAds": 

       defaults.setBool(true, forKey: "removeAdsPurchased") 

      case "10000Coins": 

       defaults.setInteger(bank + 10000, forKey: "bankValue") 
       bank = defaults.integerForKey("bankValue") 

      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("Transaction finished") 
} 

func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { 
    print("Transaction removed") 
} 

答えて

0

に私は何のフィードバックがなかったとして見て、これを解決する方法をどのように見えるかをしています

オプションのボタンをタップすると、メニューとオプションのシーンが結合されて、スライドするアクションが実行されるようになりましたメニューノードは画面外にあり、オプションは画面上に表示されます。このように、request.delegate = selfは変更されないため、クラッシュは回避されます。それでは、唯一の問題は、アプリを起動して再生ボタンをすばやく押して、ゲームシーンに移動してから、request.startが終了する前に同じクラッシュが発生することでした。そこで、メニュー画面で2秒間実行する読み込みスプラッシュ画面を作成しました。この方法では、相互作用を許可する前にすべてのデータを取得するのに十分な時間がありました。

私はもっと簡単な解決策を聞いてみたいと思いますが、少しの経験で私はこれを思いついています。