2015-08-15 98 views
2

在xcode 6和swift中工作时,我试图通过应用内购买来删除正在运行的广告。购买似乎工作,但恢复不是很多。我有点得到它的工作,但它不更新控制器。使用购买和恢复功能删除广告 - Swift

在每一个视图控制器我有以下的显示广告,并检查是否已经购买来隐藏:

我有横幅的@IBOutlet:

@IBOutlet weak var topAdBanner: ADBannerView! 

除了下面的代码:

override func viewDidLoad() { 
    super.viewDidLoad() 
    if NSUserDefaults.standardUserDefaults().boolForKey("purchased") == 
     true || purchased == true { 
     self.topAdBanner.hidden = true 
} else { 
var topAdBanner: ADBannerView 
self.topAdBanner.hidden = true 
self.topAdBanner.delegate = self 
} 

然后在我的menuviewcontroler这是我有哪些代码是我的问题是。该应用程序被本地化为几种语言,因此额外的本地化代码:

import UIKit 
import StoreKit 

class MenuViewController: UIViewController, SKProductsRequestDelegate, 
SKPaymentTransactionObserver { 

var product_id: NSString?; 

@IBOutlet weak var descriptionText: UILabel! 
@IBOutlet weak var purchaseButton: UIButton! 
@IBOutlet weak var purchaseLabel: UILabel! 
@IBOutlet weak var restoreButton: UIButton! 
@IBOutlet weak var restoreLabel: UILabel! 
@IBOutlet weak var cancelButton: UIButton! 

override func viewDidLoad() { 

    super.viewDidLoad() 
    product_id = "app.removeads"; 
    self.descriptionText.text = 
     NSLocalizedString("REMOVE_ADS_DESCRIPTION", comment: 
     "REMOVE_ADS_DESCRIPTION") 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
} 

func buyNonConsumable(){ 
    if (SKPaymentQueue.canMakePayments()) 
    { 
     var productID:NSSet = NSSet(object: self.product_id!); 
     var productsRequest:SKProductsRequest = SKProductsRequest 
     (productIdentifiers: productID as Set<NSObject>); 
     productsRequest.delegate = self; 
     productsRequest.start(); 
     self.descriptionText.text = NSLocalizedString(  
      "FIRST_PROCESSING", comment: "first_processing") 
}else{ 
self.descriptionText.text = NSLocalizedString("PAYMENT_DISABELD", 
    comment: "PAYMENT_DISABELD") 
} 

} 

// Helper Methods 

func buyProduct(product: SKProduct){ 
    self.descriptionText.text = NSLocalizedString("SECOND_PROCESSING", 
     comment: "second_processing") 
var payment = SKPayment(product: product) 
SKPaymentQueue.defaultQueue().addPayment(payment) 
} 

// Delegate Methods for IAP 
func productsRequest (request: SKProductsRequest, didReceiveResponse 
    response: SKProductsResponse) { 
    self.descriptionText.text = NSLocalizedString("THIRD_PROCESSING", 
     comment: "third_processing") 
    var count : Int = response.products.count 
    if (count>0) { 
     var validProducts = response.products 
     var validProduct: SKProduct = response.products[0] as! SKProduct 
     if (validProduct.productIdentifier == self.product_id) { 
      println(validProduct.localizedTitle) 
      println(validProduct.localizedDescription) 
      println(validProduct.price) 
      buyProduct(validProduct); 
     } else { 
      println(validProduct.productIdentifier + "Fehler") 
     } 
    } else { 
    } 
} 

@IBAction func purchaseButton(sender: AnyObject) { 
    buyNonConsumable() 
} 

@IBAction func restoreButton(sender: AnyObject) { 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
    self.descriptionText.text = NSLocalizedString("FIRST_PROCESSING", 
     comment: "first_processing") 
} 

func paymentQueueRestoreCompletedTransactionsFinished(queue: 
    SKPaymentQueue!) { 

    println("Transactions Being Restored") 

var purchasedItemIDS = [] 
for transaction:SKPaymentTransaction in queue.transactions as! 
    [SKPaymentTransaction] { 
    if transaction.payment.productIdentifier == self.product_id 
    { 
     println("Product Already Purchased") 
     // Unlock Feature 
     self.descriptionText.text = 
     NSLocalizedString("UNLOCKED_LABEL", comment: "unlocked") 
     purchased = true 
     NSUserDefaults.standardUserDefaults().setBool(true, forKey: 
      "purchased") 
     NSUserDefaults.standardUserDefaults().synchronize() 
     SKPaymentQueue.defaultQueue().finishTransaction(
      transaction) 
     } 
    } 

var alert = UIAlertView(title: "Thank You", message: "Your purchase 
    was restored. Go back to main screen", delegate: nil, 
    cancelButtonTitle: "OK") 
alert.show() 
} 

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions 
    transactions: [AnyObject]!) { 
    for transaction in transactions as! [SKPaymentTransaction] { 
     switch transaction.transactionState { 
     case SKPaymentTransactionState.Purchased: 
      if (transaction.downloads != nil) { 
       SKPaymentQueue.defaultQueue().startDownloads(
        transaction.downloads) 
      } else { 
       // Unlock feature or content here before 
       // finishing transaction 
       self.descriptionText.text = 
        NSLocalizedString("UNLOCKED_LABEL", comment: 
        "unlocked") 
       purchased = true 
       NSUserDefaults.standardUserDefaults().setBool(true, 
        forKey: "purchased") 
       NSUserDefaults.standardUserDefaults().synchronize() 
       SKPaymentQueue.defaultQueue().finishTransaction(
        transaction) 
      } 

     case SKPaymentTransactionState.Restored: 
       println("Restored") 
       self.descriptionText.text = 
        NSLocalizedString("RESTORED_LABEL", comment:  
         "restored") 
       purchased = true 
       NSUserDefaults.standardUserDefaults().setBool(true,  
        forKey:"purchased") 
       NSUserDefaults.standardUserDefaults().synchronize() 
       break 
     case SKPaymentTransactionState.Failed: 
       self.descriptionText.text = NSLocalizedString(
        "ERROR_HEADER",comment: "error") 
       SKPaymentQueue.defaultQueue().finishTransaction(
        transaction) 
     default: 
       break 
     } 
    } 
} 
} 

购买应用程序的作品。测试结束,它删除了广告。 然而,恢复发现产品并说已成功恢复,但增加不会消失。

另一个问题我似乎是,当我加载了购买和恢复选项页面时,它立即要求你的iTunes App Store中登录的页面加载不按任何东西。我不确定它是否与我的代码有关。

我花了一整天试图解决这一点,并通过论坛和帖子寻找,但我似乎无法来解决这个问题。任何帮助将不胜感激。

+1

我有红色的地方userDefaultsSettings可以由用户编辑。也许你应该保存关于完成购买或不在钥匙串中的信息? – SwiftStudier

回答

0

关于你的最后一个问题 - 是的,问,因为当你在排队做有交易addTransactionObserver密码对话框可能出现在iTunes密码是关系到你的代码。你在viewDidLoad中第一次做(不要多次尝试)。只有当你正在采取与采购有关的行动时才更好地添加观察者 - 实际上是购买或恢复采购。

viewDidLoad你的控制器只执行他们添加到视图层次结构的时间。因此,如果它们被添加到购买/恢复控制器之前的视图层次结构中,那么您的支票将不会执行。请将支票移至viewDidAppear,或者通过NSNotificationCenter进行一些通知以刷新UI状态。

+0

谢谢rshev我会检查出来。 –

+0

@ Wavey.O如果我帮你,请接受答案。 – rshev