2015-11-17 74 views
0

我爲我的iOS應用程序使用SpriteKit,並且需要一些全屏(或有時稱爲「插頁式」iAds,以便每隔一段時間彈出一次。我可以找出代碼的發生時間,但我需要知道添加iAds,而不必改變視圖控制器。SpriteKit中的Interstitial iAds?

我嘗試了TechTopia的[教程] [1]關於Interstitial iAds,但要做到這一點,我需要在實際的視圖控制器之間進行切換。在GameViewController.m中的代碼表示它最初設置爲我的遊戲的主菜單(SKScene),所以當我嘗試從遊戲中轉換回到GameViewController時,它將它搞砸了。 iAd,而不是保持相同的SKScene,它進入我的主菜單場景。

我需要這些問題的答案:

  1. 是否有某種方式以外的其他使用兩個視圖控制器,顯示間質性網絡成癮?
  2. 如果不是,我該如何解決這個問題?
  3. 如果我要將我的「非頁內iAds」更改爲「前貼片視頻iAds」,也會出現此問題嗎?

-

編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!編輯!

-

我最終決定使用crashoverride777的答案,並創建一個Objective-C橋接報給他的銀行代碼轉換成Objective-C的。但是當引用Ads.swift的變量presentingViewController時,它最終爲零。這裏是我的代碼在GameViewController.m

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

然而,這並沒有做任何事情。功能​​從我的GameScene.m被調用,就像它應該的那樣,但是沒有廣告出現。在我的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 ==無」。我不確定發生了什麼問題,在這裏。

+0

翻譯:'iAdInterAdCloseButton = [UIButton的buttonWithType:UIButtonTypeSystem]'和'如果([的UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)' –

+0

爲什麼會引起你的麻煩?第一個按鈕代碼是swift 2.0中的新功能,因爲它之前在swift中略有不同。在對象C中,它應該看起來像這樣我認爲UIButton * iAdInterAdCloseButton = [UIButton buttonWithType:UIButtonTypeSystem]; – crashoverride777

+0

關於設備代碼。你的應用是通用的嗎?否則,據我所知,它不會被調用?你可以閱讀這個,並嘗試檢查設備是否是iPad的可能方法http://stackoverflow.com/questions/10167221/ios-detect-if-user-is-on-an-ipad – crashoverride777

回答

1

您可以使用我發佈在github上的助手。它是專門爲spritekit製作的,您可以從任何地方調用廣告,無需委託等或更改視圖控制器。

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

我想在看看該助手應該給你從哪裏開始一個好主意。這裏是一個簡單的例子,說明它只適用於iAds Inter廣告。

這是迅速,所以我不知道它是否仍然對你有幫助。

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

。這將啓動助手並預加載第一個內部廣告。

比你簡單地調用這些任何你想跨廣告展示

GameData.sharedInstance.showInterAd() 

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

這是什麼,這對我來說看起來是一個很好的答案。謝謝。但是,它似乎並沒有工作。我一直在拼湊所有的部分,但它不起作用。我得到日誌說「iAd inter ad loading ...」和「iAd inter加載」等等。但廣告沒有顯示在屏幕上。 我不確定有什麼問題。你想我發佈我的代碼嗎?我很確定它與必要的代碼相同。 –

+0

嘿你不客氣。我剛剛製作了一個新的xCode遊戲項目,並複製了上面的代碼,它沒有任何問題。你在調用Ads.sharedInstance.showInterAd()或Ads.sharedInstance.showInterAdRandomly()?.隨機的只有33%的機會顯示。此外,有時模擬器會帶來測試的痛苦,您需要等待幾個小時。 – crashoverride777

+0

您需要在viewDidLoad的遊戲視圖控制器中調用Ads.sharedInstance.presentingViewController = self,最好在加載第一個場景之前。比在你的場景中,你需要調用... showInterAd方法,廣告應該顯示。讓我知道它是怎麼回事 – crashoverride777

0

在精靈套件中呈現插頁式廣告與應用程序的其他部分幾乎完全相同。唯一的區別是你用'self.view'調用所有的iAd方法來呈現add。這得到了SKScene在呈現的視圖和在呈現在IAD它

也這可以用於無需切換視圖控制器呈現間質性

currentView.requestInterstitialAdPresentation() 

從場景中的請求:

self.view?.requestInterstitialAdPresentation() 

注意如何在函數中調用它說的請求。這就是爲什麼它有時只出現。當您「請求」廣告時,設備會向蘋果發送請求以請求廣告。如果您在合理的時間內收到回覆,廣告將呈現。如果您在合理的時間內沒有收到回覆(很可能是因爲互聯網不佳),那麼廣告將不會呈現,因爲這些廣告不會呈現。但是,如果您只申請一次,但沒有出現,那麼下次您提出要求時,它肯定會出現,因爲您已經從上次請求中加載了一則廣告,但它從未呈現過。

+0

奇妙的效果!所以現在我有兩個問題。 ** 1。**我如何從SKScene中調用該函數,而不是從GameViewController中調用?它會是'[[[GameViewController.m alloc] init] requestInterstitialAdPresentation];'? ** 2。**爲什麼iAds有時只出現?我必須等一會才能工作。 –

+0

事實證明,我的代碼片段實際上並不工作。任何其他想法? –

+0

應該工作,你可以請你在場景中顯示代碼 – AwesomeTN