2016-10-18 7 views
0

タイトルでは、アプリ内購入のコードでSwift 2で動作する広告を削除し、 Swift 3と同様にコードを更新しました。それはAppleに支払い要求を送信するところまで来ますが、func buyProduct()で呼び出されたfunc paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])を実行しません。コードは次のとおりです。アプリの購入はSwift 2で動作しましたが、Swift 3とXcode 8にアップデートしました。

// MainScene.swift 
// Contain 
// 
// Created by Phil Javinsky III on 9/16/16. 
// Copyright © 2016 Phil Javinsky III. All rights reserved. 
// 

import SpriteKit 
import StoreKit 

let defaults = UserDefaults.standard 
var noAds: Bool = false 
var fetched: Bool = false 
var product = SKProduct() 
var productID = "containRemoveAds" 
var readyForIAP: Bool = false 

class MainScene: SKScene, SKProductsRequestDelegate, SKPaymentTransactionObserver { 
    var touchLocation: CGPoint = CGPoint.zero 
    var start, leaderboards, rate, removeAds: SKSpriteNode! 

override func didMove(to view: SKView) { 
    SKPaymentQueue.default().add(self) 
    if defaults.bool(forKey: "purchased") { 
     print("Already purchased") 
     bannerAd.isHidden = true 
     noAds = true 
    } 
    else { 
     print("Not purchased") 
     if !fetched { 
      print("Fetching") 
      getProductInfo() 
      fetched = true 
     } 
    } 

    start = self.childNode(withName: "start") as! SKSpriteNode 
    leaderboards = self.childNode(withName: "leaderboards") as! SKSpriteNode 
    leaderboards.position = CGPoint(x: 0, y: -1150) 
    rate = self.childNode(withName: "rate") as! SKSpriteNode 
    rate.position = CGPoint(x: 0, y: -1350) 
    removeAds = self.childNode(withName: "removeAds") as! SKSpriteNode 
    removeAds.position = CGPoint(x: 0, y: -1550) 

    SKPaymentQueue.default().remove(self) 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touchLocation = touches.first!.location(in: self) 

    if start.contains(touchLocation) { 
     let game: GameScene = GameScene(fileNamed: "GameScene")! 
     game.scaleMode = .aspectFit //.resizeFill? 
     view?.presentScene(game, transition: SKTransition.fade(withDuration: 1)) 
    } 
    else if leaderboards.contains(touchLocation) { 
     //showLeaderboard() 
    } 
    else if rate.contains(touchLocation) { 
     /*let url = NSURL(string: "itms-apps://itunes.apple.com/us/app/whack-a-diglett/id1141187647?ls=1&mt=8") 

     if UIApplication.shared.canOpenURL(url! as URL) { 
      UIApplication.shared.openURL(url! as URL) 
     }*/ 
    } 
    else if removeAds.contains(touchLocation) { 
     let alert = UIAlertController.init(title: "Remove Ads", message: "Remove ads or restore a previous purchase.", preferredStyle: .actionSheet) 
     alert.addAction(UIAlertAction(title: "Remove Ads", style: .default, handler: 
      { action -> Void in 
       print("Remove Ads") 
       if readyForIAP { 
        self.buyProduct() 
       } 
       else { 
        print("Not ready for IAP") 
        let alert = UIAlertController.init(title: "Error", message: "Something went wrong, try again.", preferredStyle: .alert) 
        alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) 
        self.view?.window?.rootViewController?.present(alert, animated: true, completion: nil) 
       } 
      })) 
     alert.addAction(UIAlertAction(title: "Restore Purchase", style: .default, handler: 
      { action -> Void in 
       print("Restore purchase") 
       if (SKPaymentQueue.canMakePayments()) { 
        SKPaymentQueue.default().restoreCompletedTransactions() 
       } 
      })) 
     alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     self.view?.window?.rootViewController?.present(alert, animated: true, completion: nil) 

    } 
} 

func getProductInfo() { 
    //print("About to fetch the products") 

    // Check if allowed to make the purchase 
    if SKPaymentQueue.canMakePayments() { 
     let productIdentifier: NSSet = NSSet(object: productID) 
     let productsRequest: SKProductsRequest = SKProductsRequest(productIdentifiers: productIdentifier as! Set<String>) 
     productsRequest.delegate = self 
     productsRequest.start() 
     //print("Fetching Products") 
    } 
    else { 
     print("can't make purchases") 
    } 
} 

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
    var products = response.products 
    if (products.count != 0) { 
     product = products[0] 
     print(product.localizedTitle) 
     print(product.localizedDescription) 
     print(product.price) 
     readyForIAP = true 
     print("Ready for IAP") 
    } 
    else { 
     print("Product not found") 
    } 
} 

func buyProduct() { 
    print("Sending payment request to Apple") 
    let payment = SKPayment(product: product) 
    SKPaymentQueue.default().add(payment as SKPayment) 
} 

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    print("Received payment transaction response from Apple") 
    for transaction in transactions { 
     switch transaction.transactionState { 
     case .purchased: 
      print("Product Purchased") 
      defaults.set(true, forKey: "purchased") 
      bannerAd.isHidden = true 
      noAds = true 
      SKPaymentQueue.default().finishTransaction(transaction) 
     case .failed: 
      print("Purchased Failed") 
      SKPaymentQueue.default().finishTransaction(transaction) 
     case .restored: 
      print("Restored") 
      let alert: UIAlertController = UIAlertController(title: "Restored", message: "Purchase restored, ads removed.", preferredStyle: .alert) 
      alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil)) 
      self.view?.window?.rootViewController?.present(alert, animated: true, completion: nil) 
      defaults.set(true, forKey: "purchased") 
      bannerAd.isHidden = true 
      noAds = true 
      SKPaymentQueue.default().finishTransaction(transaction) 
     default: 
      print("DEFAULT") 
      break 
     } 
    } 
} 

func request(_ request: SKRequest, didFailWithError error: Error) { 
    print("Error Fetching product information"); 
} 

} 
+0

「SKPaymentQueue」オブザーバとして「self」を削除するのはなぜですか? – rmaddy

+0

もっと強くするために、なぜあなたはオブザーバーを取り除くのですか? – matt

+0

プログラムがMainScene.swiftを離れてGameScene.swiftに行き、MainSceneに戻った場合、EXC_BAD_ACCESSエラーを起こしてクラッシュするため、didMoveToViewの最後にトランザクションオブザーバを削除していました。削除ボタンを開始ボタンと同期させるように移動しました。現在は動作しています。 –

答えて

0

なぜdidMoveToViewでトランザクションオブザーバを削除していますか?それは意味をなさない。

はdidMoveToView

SKPaymentQueue.default().add(self) 

におけるトランザクションオブザーバを追加し、アプリを閉じたときにのみ、それを削除します。

あなたのIAPコードを別のヘルパークラスに移動するのもいいかもしれませんが、あなたのコードはこのように読みにくいです。

希望します。

+0

ありがとうございます。今私はそれについて考えていますが、私はこれが迅速な2でどのように機能するのか分かりませんが、それはそうでした。私はremoveアクションを開始ボタンと同期させるように移動したので、ユーザーがMainScene.swiftを離れると、トランザクションオブザーバが削除され、ユーザーがMainScene.swiftに戻ると複数のオブザーバがなくなります。 –

+0

あなたは大歓迎です。ハッピーコーディング。 – crashoverride777

関連する問題