SpriteKit 中的插页式广告?

Interstitial iAds in SpriteKit?

我正在为我的 iOS 应用程序使用 SpriteKit,并且需要一些 full-screen(或有时称为 "interstitial" iAds 时常弹出。我可以找出代码因为当它发生时,但我需要知道如何在不必更改视图控制器的情况下添加 iAds。

我尝试了 Techotopia 关于 Interstitial iAds 的[教程][1],但要做到这一点,我需要在实际的视图控制器之间进行转换。好吧,我试过了,但是每当从 iAd 视图控制器转换回 GameViewController 时,它就会把一切都搞砸了。 GameViewController.m 中的代码表示它最初设置为我的游戏(一个 SKScene)的主菜单。因此,当我尝试从 iAd 过渡回来时,它没有保持相同的 SKScene,而是直接进入我的主菜单场景。

我需要这些答案:

  1. 除了使用两个 View Controller 来显示 Interstitial iAds 之外,还有其他方法吗?
  2. 如果没有,我该如何解决这个问题?
  3. 如果我将 "Interstitial iAds" 更改为 "Pre-roll Video iAds?"
  4. ,是否也会出现此问题

-

编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!

-

我最终决定使用 crashoverride777 的答案,并创建一个 Objective-C 桥接 header 以将他的 Swift 代码转换为 Objective-C。但是当引用 Ads.swift 的变量 presentingViewController 时,它最终为零。这是我在 GameViewController.m:

中的代码
// Set up interstitial iAds.
Ads *adsClass = [[Ads alloc] init];
Ads *adsInstance = [Ads sharedInstance];
adsInstance.presentingViewController = self;

但是,这没有任何作用。函数 showInterAd 像预期的那样从我的 GameScene.m 调用,但没有出现广告。在我的Ads.swift中,我添加了一个日志来查看presentingViewController是否确实为nil。

print("iAd inter showing")
if (self.presentingViewController != nil) {
    print("presentingViewController != nil")
    iAdInterAdView.frame = presentingViewController.view.bounds
    presentingViewController.view.addSubview(iAdInterAdView)
    iAdInterAd!.presentInView(iAdInterAdView)
    UIViewController.prepareInterstitialAds()
    iAdInterAdView.addSubview(iAdInterAdCloseButton)
} else {
    print("presentingViewController == nil")
}

每次日志都是这样出来的:"presentingViewController == nil"。我不确定这里出了什么问题。

在 sprite kit 中呈现插页式广告与应用的其他部分几乎相同。唯一的区别是您通过使用 'self.view' 调用所有 iAd 方法来显示添加。这将获取呈现 SKScene 的视图并在其上呈现 iAd

这也可以用于在不切换视图控制器的情况下呈现插页式广告

currentView.requestInterstitialAdPresentation()

场景中请求:

self.view?.requestInterstitialAdPresentation()

注意在函数调用中它是如何表示请求的。这就是为什么它只是有时出现的原因。当您 'request' 广告时,设备会向苹果发送请求以请求广告。如果您在合理的时间内收到回复,则广告将会展示。如果您在合理的时间内没有收到回复(很可能是因为互联网质量差),那么广告将不会展示,因为没有任何东西可以展示。但是,如果您请求一次但它没有显示,那么下次您请求时它肯定会显示,因为您已经加载了上次请求时的广告,但它从未显示过。

您可以使用我在 github 上发布的助手。它是专门为 spritekit 制作的,您可以从任何地方调用广告而无需委托等或更改视图控制器。

https://github.com/crashoverride777/Swift-2-iAds-and-AdMob-Helper

我认为看看那个帮助程序应该会让您知道从哪里开始。这是一个简化的示例,说明它如何仅适用于 iAds Inter 广告。

这在 swift 中,所以我不确定它是否对您仍有帮助。

import iAd

class Ads: NSObject {

// MARK: - Static Properties

/// Shared instance
static let sharedInstance = Ads()

// MARK: - Properties

/// Presenting view controller
var presentingViewController: UIViewController!

/// iAd inter ad
private var iAdInterAd: ADInterstitialAd?

/// iAd inter ad view
private var iAdInterAdView = UIView()

/// iAd inter ad close button
private var iAdInterAdCloseButton = UIButton(type: UIButtonType.System)

// MARK: - Init
private override init() {
    super.init()
    print("Ads helper init")

   iAdInterAd = iAdLoadInterAd()
}

// MARK: - User Methods

/// Show inter ad
func showInterAd() {
    iAdShowInterAd()
}

/// Show inter ad randomly (33% chance)
func showInterAdRandomly() {
    let randomInterAd = Int(arc4random() % 3)
    print("randomInterAd = \(randomInterAd)")
    if randomInterAd == 1 {
        iAdShowInterAd()
    }
}

/// Remove all ads
func removeAllAds() {
    print("Removed all ads")

    if iAdInterAd != nil {
        iAdInterAd!.delegate = nil
        iAdInterAdCloseButton.removeFromSuperview()
        iAdInterAdView.removeFromSuperview()
    }
}

// MARK: - Internal Methods

/// iAd load inter ad
private func iAdLoadInterAd() -> ADInterstitialAd {
    print("iAd inter ad loading...")
    let iAdInterAd = ADInterstitialAd()
    iAdInterAd.delegate = self

    if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
        iAdInterAdCloseButton.frame = CGRectMake(18, 18, 27, 27)
    } else {
        iAdInterAdCloseButton.frame = CGRectMake(13, 13, 22, 22)
    }

    iAdInterAdCloseButton.layer.cornerRadius = 11
    iAdInterAdCloseButton.setTitle("X", forState: .Normal)
    iAdInterAdCloseButton.setTitleColor(UIColor.grayColor(), forState: .Normal)
    iAdInterAdCloseButton.backgroundColor = UIColor.whiteColor()
    iAdInterAdCloseButton.layer.borderColor = UIColor.grayColor().CGColor
    iAdInterAdCloseButton.layer.borderWidth = 2
    iAdInterAdCloseButton.addTarget(self, action: "iAdPressedInterAdCloseButton:", forControlEvents: UIControlEvents.TouchDown)

    return iAdInterAd
}

/// iAd show inter ad
private func iAdShowInterAd() {
    guard iAdInterAd != nil else {
        print("iAd inter is nil, reloading")
        iAdInterAd = iAdLoadInterAd()
        return
    }

    if iAdInterAd!.loaded {
        print("iAd inter showing")
        iAdInterAdView.frame = presentingViewController.view.bounds
        presentingViewController.view.addSubview(iAdInterAdView)
        iAdInterAd!.presentInView(iAdInterAdView)
        UIViewController.prepareInterstitialAds()
        iAdInterAdView.addSubview(iAdInterAdCloseButton)

        //pauseTasks() // not really needed for inter as you tend to show them when not playing.
    } else {
        print("iAd inter not ready, reloading again...")
        iAdInterAd = iAdLoadInterAd()

    }
}

/// iAd inter ad pressed close button
func iAdPressedInterAdCloseButton(sender: UIButton) { // dont make private as its called with a selector
    print("iAd inter closed")
    iAdInterAd!.delegate = nil
    iAdInterAdCloseButton.removeFromSuperview()
    iAdInterAdView.removeFromSuperview()
    iAdInterAd = iAdLoadInterAd()

    //resumeTasks() // not really needed for inter as you tend to not show them during gameplay
}

/// Pause tasks in the app/game
private func pauseTasks() {
    // Pause app/game, music etc here.
    // you could use NSNotifactionCenter or Delegates to call methods in other SKScenes / ViewControllers
}

/// Resume tasks in the app/game
private func resumeTasks() {
    // Resume app/game, music etc here.
    // you could use NSNotifactionCenter or Delegates to call methods in other SKScenes / ViewControllers
     }
}

// MARK: - Delegates iAd Inter
extension Ads: ADInterstitialAdDelegate {

func interstitialAdDidLoad(interstitialAd: ADInterstitialAd!) {
    print("iAd inter did load")
}

func interstitialAdDidUnload(interstitialAd: ADInterstitialAd!) {
    print("iAd inter did unload")
}

func interstitialAd(interstitialAd: ADInterstitialAd!, didFailWithError error: NSError!) {
    print("iAd inter error \(error)")
    iAdInterAd!.delegate = nil
    iAdInterAdCloseButton.removeFromSuperview()
    iAdInterAdView.removeFromSuperview()
   }
}

现在你只需调用

Ads.sharedInstance.presentingViewController = self 

在你的 GameViewController 中,然后再做任何事情。这将初始化助手并预加载第一个 inter 广告。

您只需在您希望展示广告间的任何地方调用这些代码

GameData.sharedInstance.showInterAd()

GameData.sharedInstance.showInterAdRandomly() // 33% chance for ad