在SpriteKit中使用插页式iAds?

6 浏览
0 Comments

在SpriteKit中使用插页式iAds?

我正在使用SpriteKit开发我的iOS应用程序,并且需要定期弹出全屏(有时称为“插屏”)iAd广告。我可以解决弹出广告的代码问题,但我需要知道如何在不改变视图控制器的情况下添加iAd广告。

我尝试过Techotopia的一篇关于插屏iAd的教程,但是要实现它,我需要在实际的视图控制器之间进行切换。好吧,我试了一下,但是每当从iAd视图控制器切换回GameViewController时,它就会搞乱一切。GameViewController.m中的代码表明它最初设置为我的游戏的主菜单(一个SKScene)。因此,当我尝试从iAd切换回来时,它不会保持相同的SKScene,而是直接切换到我的主菜单场景。

我需要以下答案:

  1. 除了使用两个视图控制器显示插屏iAd之外,还有其他方法吗?
  2. 如果没有,我该如何解决这个问题?
  3. 如果我将“插屏iAd”更改为“预滚动视频iAd”,这个问题是否也会出现?

-

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

-

最终,我决定使用crashoverride777的答案,并创建了一个Objective-C桥接头文件,将他的Swift代码转换为Objective-C。但是在引用Ads.swiftpresentingViewController变量时,它最终为空。这是我的GameViewController.m中的代码:

// 设置插屏iAd。
Ads *adsClass = [[Ads alloc] init];
Ads *adsInstance = [Ads sharedInstance];
adsInstance.presentingViewController = self;

但是,这并没有起作用。来自GameScene.mshowInterAd函数会被调用,但是没有广告显示出来。在我的Ads.swift中,我添加了一个日志来查看presentingViewController是否为空。

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"。我不确定出了什么问题。

0
0 Comments

问题的原因是在SpriteKit中呈现插页式广告(Interstitial iAds)与在应用程序的其他部分呈现插页式广告几乎相同,唯一的区别是通过调用所有iAd方法时使用'self.view'来呈现广告。这样可以获取SKScene所呈现的视图并在其上呈现插页式广告。此外,这也可以在不切换视图控制器的情况下呈现插页式广告。

currentView.requestInterstitialAdPresentation()是在场景中请求插页式广告的方法。在函数调用中可以看到它是一个“request”方法。这就是为什么插页式广告有时候才会出现的原因。当你“请求”广告时,设备会向苹果发送一个请求以获取广告。如果在合理的时间内收到响应,则广告将呈现。如果在合理的时间内没有收到响应(很可能是因为互联网连接不好),那么广告就不会呈现,因为没有可呈现的内容。然而,如果你请求了一次并且它没有呈现,下次你请求时它肯定会呈现,因为你已经从上次请求中加载了广告但从未呈现过。

这个方法非常好用!所以现在我有两个问题。1. 如何从SKScene中调用该函数,而不是从GameViewController中调用?是这样写吗:[[[GameViewController.m alloc] init] requestInterstitialAdPresentation];? 2. 为什么iAds只有在有时候才会显示?我必须等很长时间才能让它们工作。

事实证明,我的代码片段实际上并不起作用。还有其他的想法吗?

应该是可以的,请展示一下你在场景中的代码。

展示更多的代码,不仅仅是那个片段,展示其中的内容。

0
0 Comments

Interstitial iAds in SpriteKit?

最近我尝试在SpriteKit中使用插播广告,但是遇到了一些问题。我找到了一个在GitHub上发布的帮助类,可以在任何地方调用广告而无需委托或更改视图控制器。我试着按照帮助类的说明来使用,但是广告并没有显示在屏幕上。我不确定出了什么问题,是否需要发布我的代码,以便大家帮忙看看。

以下是帮助类的代码:

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)

} else {

print("iAd inter not ready, reloading again...")

iAdInterAd = iAdLoadInterAd()

}

}

/// iAd inter ad pressed close button

func iAdPressedInterAdCloseButton(sender: UIButton) {

print("iAd inter closed")

iAdInterAd!.delegate = nil

iAdInterAdCloseButton.removeFromSuperview()

iAdInterAdView.removeFromSuperview()

iAdInterAd = iAdLoadInterAd()

}

}

// 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()

}

}

你只需要在你的GameViewController中调用`Ads.sharedInstance.presentingViewController = self`,然后在任何你希望显示插播广告的地方调用`Ads.sharedInstance.showInterAd()`或者`Ads.sharedInstance.showInterAdRandomly()`(有33%的机会显示广告)即可。

然而,我尝试了这个方法,但是广告并没有显示在屏幕上。我不确定出了什么问题,是否需要发布我的代码。我在`iAdShowInterAd()`方法中设置了一个`print()`来查看`presentingViewController`是否为空。结果发现它是空的。请问这是什么问题?我会在问题中编辑以展示具体情况。

回答者给出了一些解决方法,比如在Ads.swift中找到使用presentingViewController变量的方法,并将其剪切到你的GameViewController中创建新的方法中,然后在剪切的位置调用新的方法,并将presentingViewController替换为self。

但是问题提问者依然遇到问题,于是他决定在别处寻找解决方案。回答者再次表示抱歉,希望问题提问者能尽快找到解决方法,并希望问题提问者能保持联系。

0