2015-08-28 156 views
0

我正在使用IAPHelper实现应用内购买,当按下购买按钮后转到其他视图控制器时发生错误。例如,当我按购买按钮,然后转到另一个视图控制器,完成购买工作后出现错误。应用内购买Swift

class selectQuestion_ViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource{ 

let helper = IAPHelper(productIdentifiers: NSSet(object: "sppid") as Set<NSObject>) 
func purchase(sender: AnyObject) 
    { 
     startLoading("Purchasing ..") 
     self.helper.requestProductsWithCompletionHandler({ (success, products) -> Void in 

      if success { 
       self.endLoading() 
       println("wohooooo") 
       var sdad = self.helper.productsDict["sppid"] 
       self.helper.buyProduct(sdad!) 

      } else { 
       self.endLoading() 
       let alert = UIAlertController(title: "Error", message: "Cannot retrieve products list right now.", preferredStyle: .Alert) 
       alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
       self.presentViewController(alert, animated: true, completion: nil) 
      } 


     }) 
    } 

回答

1

我建议你不要使用这样的模块。这将是你和你的单边行动计划的理解是,你检查本教程好得多,实现代码和描述的方法有:https://www.youtube.com/watch?v=h1gQklbrgjc

一旦实现代码,如果事情不工作(你可能已经忘记了行到某处),回到SO,我们很乐意帮助你。作为快速帮助,这里有一个答案,可以帮助你解决大部分错误,一旦你用IAP助手实现你的IAP代码:My IAP isn't working. Bugs at func Paymentqueue

事实上,你可以观看视频并复制粘贴我的代码题。我的IAP代码有效;)会为您节省时间。但观看视频了解如何实施IAP!

我希望这个答案帮助你;)

以下是完整的IAP代码:

import UIKit 
import StoreKit 


class GameViewController: UIViewController, ADBannerViewDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver, GKGameCenterControllerDelegate,GADBannerViewDelegate{ 


    @IBOutlet var outRemoveAds: UIButton! 
    @IBOutlet var outRestorePurchases: UIButton! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     if NSUserDefaults.standardUserDefaults().objectForKey("val") != nil { 
      print("Has a value.") 
      banner.removeFromSuperview() 
      bannerGoogle.removeFromSuperview() 
      outRemoveAds.removeFromSuperview() 
      outRestorePurchases.removeFromSuperview() 
      removeInterFrom = 1 
     } 
     else { 
      print("No Value.") 
     } 

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

     } 

    } 


    //IAP Ads 

    @IBAction func removeAds(sender: UIButton) { 
     for product in list{ 
      let prodID = product.productIdentifier 
      if (prodID == "IAP id"){ 
       p = product 
       buyProduct() 
       break 
      } 
     } 
    } 
    @IBAction func restorePurchases(sender: UIButton) { 
     SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
    } 


    //IAP Functions 

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

    func removeAds(){ 
     banner.removeFromSuperview() 
     bannerGoogle.removeFromSuperview() 
     outRemoveAds.removeFromSuperview() 
     outRestorePurchases.removeFromSuperview() 
     let theValue = 10 
     NSUserDefaults.standardUserDefaults().setObject(theValue, forKey: "val") 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 

    func buyProduct(){ 
     print("Buy: "+p.productIdentifier) 
     let pay = SKPayment (product: p) 
     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") 
      print(product.productIdentifier) 
      print(product.localizedTitle) 
      print(product.localizedDescription) 
      print(product.price) 

      list.append(product as SKProduct) 
     } 
    } 

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

     for transaction:AnyObject in transactions{ 
      let trans = transaction as! SKPaymentTransaction 
      print(trans.error) 
      switch trans.transactionState{ 
      case .Purchased: 
       print("IAP unlocked") 
       print(p.productIdentifier) 

       let prodID = p.productIdentifier as String 
       switch prodID{ 
       case "IAP id": 
        print("Remove Ads") 
        removeAds() 
       default: 
        print("IAP not setup") 
       } 
       queue.finishTransaction(trans) 
       break 
      case .Failed: 
       print ("Buy error") 
       queue.finishTransaction(trans) 
       break 
      default: 
       print("default: Error") 
       break 
      } 
     } 
    } 

    func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { 
     print("Purchases Restored") 

     _ = [] 
     for transaction in queue.transactions { 
      let t: SKPaymentTransaction = transaction as SKPaymentTransaction 

      let prodID = t.payment.productIdentifier as String 
      switch prodID{ 
      case "IAP id": 
       print("Remove Ads") 
       removeAds() 
      default: 
       print("IAP not setup") 
      } 


     } 
    } 
    func finishTransaction(trans:SKPaymentTransaction){ 
     print("Finshed Transaction") 
    } 

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

地说:

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
在viewDidLoad中

或viewDidAppear

+0

虽然此链接可能回答这个问题,最好在这里包含答案的重要部分,并提供参考链接ENCE。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/10400514) – Calimero

+0

真的,让我这样做。 – 2015-12-01 13:22:01