在SpriteKit中使用插页式iAds?
在SpriteKit中使用插页式iAds?
我正在使用SpriteKit开发我的iOS应用程序,并且需要定期弹出全屏(有时称为“插屏”)iAd广告。我可以解决弹出广告的代码问题,但我需要知道如何在不改变视图控制器的情况下添加iAd广告。
我尝试过Techotopia的一篇关于插屏iAd的教程,但是要实现它,我需要在实际的视图控制器之间进行切换。好吧,我试了一下,但是每当从iAd视图控制器切换回GameViewController时,它就会搞乱一切。GameViewController.m中的代码表明它最初设置为我的游戏的主菜单(一个SKScene)。因此,当我尝试从iAd切换回来时,它不会保持相同的SKScene,而是直接切换到我的主菜单场景。
我需要以下答案:
- 除了使用两个视图控制器显示插屏iAd之外,还有其他方法吗?
- 如果没有,我该如何解决这个问题?
- 如果我将“插屏iAd”更改为“预滚动视频iAd”,这个问题是否也会出现?
-
编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!编辑!
-
最终,我决定使用crashoverride777的答案,并创建了一个Objective-C桥接头文件,将他的Swift代码转换为Objective-C。但是在引用Ads.swift
的presentingViewController
变量时,它最终为空。这是我的GameViewController.m
中的代码:
// 设置插屏iAd。 Ads *adsClass = [[Ads alloc] init]; Ads *adsInstance = [Ads sharedInstance]; adsInstance.presentingViewController = self;
但是,这并没有起作用。来自GameScene.m
的showInterAd
函数会被调用,但是没有广告显示出来。在我的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"。我不确定出了什么问题。
问题的原因是在SpriteKit中呈现插页式广告(Interstitial iAds)与在应用程序的其他部分呈现插页式广告几乎相同,唯一的区别是通过调用所有iAd方法时使用'self.view'来呈现广告。这样可以获取SKScene所呈现的视图并在其上呈现插页式广告。此外,这也可以在不切换视图控制器的情况下呈现插页式广告。
currentView.requestInterstitialAdPresentation()
是在场景中请求插页式广告的方法。在函数调用中可以看到它是一个“request”方法。这就是为什么插页式广告有时候才会出现的原因。当你“请求”广告时,设备会向苹果发送一个请求以获取广告。如果在合理的时间内收到响应,则广告将呈现。如果在合理的时间内没有收到响应(很可能是因为互联网连接不好),那么广告就不会呈现,因为没有可呈现的内容。然而,如果你请求了一次并且它没有呈现,下次你请求时它肯定会呈现,因为你已经从上次请求中加载了广告但从未呈现过。
这个方法非常好用!所以现在我有两个问题。1. 如何从SKScene中调用该函数,而不是从GameViewController中调用?是这样写吗:[[[GameViewController.m alloc] init] requestInterstitialAdPresentation];
? 2. 为什么iAds只有在有时候才会显示?我必须等很长时间才能让它们工作。
事实证明,我的代码片段实际上并不起作用。还有其他的想法吗?
应该是可以的,请展示一下你在场景中的代码。
展示更多的代码,不仅仅是那个片段,展示其中的内容。
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。
但是问题提问者依然遇到问题,于是他决定在别处寻找解决方案。回答者再次表示抱歉,希望问题提问者能尽快找到解决方法,并希望问题提问者能保持联系。