使用购买和恢复功能删除广告 - Swift
在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中登录的页面加载不按任何东西。我不确定它是否与我的代码有关。
我花了一整天试图解决这一点,并通过论坛和帖子寻找,但我似乎无法来解决这个问题。任何帮助将不胜感激。
关于你的最后一个问题 - 是的,问,因为当你在排队做有交易addTransactionObserver
密码对话框可能出现在iTunes密码是关系到你的代码。你在viewDidLoad
中第一次做(不要多次尝试)。只有当你正在采取与采购有关的行动时才更好地添加观察者 - 实际上是购买或恢复采购。
viewDidLoad
你的控制器只执行他们添加到视图层次结构的时间。因此,如果它们被添加到购买/恢复控制器之前的视图层次结构中,那么您的支票将不会执行。请将支票移至viewDidAppear
,或者通过NSNotificationCenter
进行一些通知以刷新UI状态。
谢谢rshev我会检查出来。 –
@ Wavey.O如果我帮你,请接受答案。 – rshev
我有红色的地方userDefaultsSettings可以由用户编辑。也许你应该保存关于完成购买或不在钥匙串中的信息? – SwiftStudier