【问题标题】:In-App Purchase : Remove Ad Banners & Interstitial Ads - Code Assistance应用内购买:删除广告横幅和插页式广告 - 代码帮助
【发布时间】:2016-02-09 09:34:40
【问题描述】:

我有一个简单的单视图应用程序项目 - 一个向用户显示一些随机文本的单 (1) 页应用程序。

我已成功整合广告横幅和插页式广告。

我已经设置了另一个视图控制器 (InAppViewController.swift) 来处理一个弹出页面,该页面允许用户进行应用内购买以删除所有广告(Adbanners & InterstitialAds)。

在我的第二个视图控制器 (InAppViewController.swift) 中,我有以下代码:

修改后的代码:

//  InAppPViewController.swift

import UIKit
import StoreKit
import iAd

class InAppPViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

let defaults = NSUserDefaults.standardUserDefaults()
var product_id: NSString?;


@IBOutlet weak var unlockAction: UIButton!

@IBOutlet var adBannerView: ADBannerView?

override func viewDidLoad() {
    
    product_id = "holymoly.iap.removeads";
    super.viewDidLoad()

    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    
    //Check if product is purchased

    if (defaults.boolForKey("purchased")){
        self.adBannerView?.hidden = true  
    }

    else if (!defaults.boolForKey("stonerPurchased")){
        print("false")
        self.adBannerView?.hidden = false    
    } 
}
   

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func unlockAction(sender: AnyObject) {
    
    print("About to fetch the products");
    // We check that we are allow to make the purchase.
    
    if (SKPaymentQueue.canMakePayments())
    {
        let productID:NSSet = NSSet(object: self.product_id!);
        let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>);
        productsRequest.delegate = self;
        productsRequest.start();
        print("Fething Products");
    }else{
        print("can't make purchases");
    }  
}

func buyProduct(product: SKProduct){
    print("Sending the Payment Request to Apple");
    let payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment);
}

//Delegate Methods for IAP

func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    
    let count : Int = response.products.count
    if (count>0) {

        let validProduct: SKProduct = response.products[0] as SKProduct
        if (validProduct.productIdentifier == self.product_id) {
            print(validProduct.localizedTitle)
            print(validProduct.localizedDescription)
            print(validProduct.price)
            buyProduct(validProduct);
        } else {
            print(validProduct.productIdentifier)
        }
    } else {
        print("nothing")
    }
}


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

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])   {
    print("Received Payment Transaction Response from Apple");
    
    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
                
            case .Purchased:
                print("Product Purchased");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                defaults.setBool(true , forKey: "purchased")
                self.adBannerView?.hidden = true
                break;
                
            case .Failed:
                print("Purchased Failed");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                self.adBannerView?.hidden = false
                break;
                
            case .Restored:
                print("Already Purchased");
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
                
                
            default:
                self.adBannerView?.hidden = true
                break;
            }
        }
    }
    
}

}

在我的“原始”视图控制器 (ViewController.swift) 中,我添加了以下代码:

//  ViewController.swift
import UIKit
import MessageUI
import Social
import iAd

class ViewController: UIViewController, MFMailComposeViewControllerDelegate,     MFMessageComposeViewControllerDelegate, ADBannerViewDelegate,  ADInterstitialAdDelegate
{ 

var interstitialAd:ADInterstitialAd!
var interstitialAdView: UIView = UIView()

@IBOutlet var adBannerView: ADBannerView?

@IBAction func someFunkyButton(sender: AnyObject) {
  
    //Interstitial Ad:
    
    let rand = Int(arc4random_uniform(4))
    print(rand)
    let adNo = 2
    
    if(adNo == rand)
    {
        loadInterstitialAd()
        
    }
}

let defaults = NSUserDefaults.standardUserDefaults()

override func viewDidLoad() {
super.viewDidLoad()
    
    //Check if product is purchased
   
if (defaults.boolForKey("purchased")){

        // Advertising Banner:
        self.canDisplayBannerAds = true
        self.adBannerView?.delegate = self
        self.adBannerView?.hidden = true
        
    }
    else if (!defaults.boolForKey("stonerPurchased")){
        print("false")
        
        // Advertising Banner:
        self.canDisplayBannerAds = true
        self.adBannerView?.delegate = self
        self.adBannerView?.hidden = false     
    }
    

代码显示为无错误。

它可以在我的实际 iPhone(模拟器)上运行,并且可以进行应用内购买。

但广告横幅仍然显示。我正在尝试显示广告横幅:

(i) 在 ViewController.swift 中:

        self.canDisplayBannerAds = true
        self.adBannerView?.delegate = self
        self.adBannerView?.hidden = false

(ii) 在 InAppViewController.swift 中:

        self.adBannerView?.hidden = false

并且不显示广告横幅:

(i) 在 ViewController.swift 中:

        self.canDisplayBannerAds = true
        self.adBannerView?.delegate = self
        self.adBannerView?.hidden = true

(ii) 在 InAppViewController.swift 中:

        self.adBannerView?.hidden = true

但它显然不起作用。

问题:

  1. 如何修改我的代码并阻止这些广告横幅显示?

  2. 我如何阻止我的插页式广告展示?

    我觉得我很接近,非常接近......但是那支雪茄还没有落地!

【问题讨论】:

  • 是方法removeAds故意放在函数btnRemoveAds:中。无论将其放置在内部的原因是什么,这可能就是您收到错误 Use of unresolved identifier 'removeAds' 的原因
  • 是的,你是对的。我删除了方法removeAds 并在函数'btnRemoveAds' 之前替换了它。但我相信这段代码仍然无法删除我所有的广告横幅和插页式广告。
  • 相应地修改了我的问题中的代码。
  • 您是否知道 iAd 将于 2016 年 6 月 30 日关闭,并且他们现在不接受 iAd 中的新应用程序。因此,除非您已经在应用商店中运行 iAd,否则您将需要不同的广告提供商。 developer.apple.com/news/?id=01152016a
  • 是的。虽然这是一个令人困惑的话题。请参阅此链接:link。 “开发者仍然可以在他们的应用程序中显示 iAd 横幅;只是 App Store 应用程序广告的库存将不再存在。”

标签: ios swift in-app-purchase iad interstitial


【解决方案1】:

如果您要实现自己的ADBannerView,则需要删除self.canDisplayBannerAds = true

self.canDisplayBannerAds = true 可用于在您的应用程序中轻松实现 iAd 横幅。这将为您创建一个ADBannerView,并根据是否收到来自 iAd 网络的广告,在您的视图底部显示或隐藏ADBannerView

您要么实现自己的ADBannerView,要么使用self.canDisplayBannerAds = true,而不是两者。

【讨论】:

  • 是的!你说得对。我使用self.adBannerView?.hidden = false self.adBannerView?.hidden = true 分别显示或隐藏广告横幅。此外,由于在我的应用内购买页面上没有显示广告横幅(由 InAppViewController.swift 处理),我删除了所有对广告横幅显示与否的引用。
  • 如何隐藏我的插页式广告?我目前使用loadInterstitialAd() 向他们展示
  • 我想我有解决办法。我有一个按钮,可以在屏幕上为用户生成随机消息。如果按下按钮,我会检查用户是否进行了应用内购买以删除所有广告。如果返回为真(已购买),我不加载插页式广告;如果用户没有进行应用内购买来移除所有广告,我会执行loadInterstitialAd()。对吗?
  • 抱歉,我没有消息功能。在过去的几个小时里,我已经修改了很多代码。我应该重新发布修改后的代码来解决我上面的原始问题,还是发布一个新问题?这是关于一个恢复按钮和与之相关的代码。
  • @PaulSatem 你应该发布一个新问题。
【解决方案2】:

首先removeAdsbtnRemoveAds 里面,所以把它移到外面。其次,一种方法是将购买的产品的产品标识符保存在 UserDefaults 中,这样在退出和启动应用程序时,广告就不会出现,因为用户已经购买了应用程序。因此,您将在viewDidLoad 上执行的操作是检查产品标识符是否已购买(来自NSUserDefaults,如果它是较早购买的,它将被设置),如果已购买,则从一开始就禁用广告,否则显示广告。当物品被购买时,然后在NSUserDefaults 中设置状态并相应地更新 UI。

【讨论】:

  • 我该怎么做?抱歉,我对编码很陌生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多