2015-11-17 3 views
0

Я использую SpriteKit для своего приложения iOS и нуждаюсь в полноэкранном (или иногда называемом «межстраничным» iAds, чтобы появляться так часто. Я могу выяснить код, когда это произойдет, но мне нужно знать, как чтобы добавить iAds, не обязательно меняя View Viewer.Интерстициальные iAds в SpriteKit?

Я попробовал [учебник] [1] от Techotopia на межстраничных iAds, но для этого мне нужно перейти между фактическими контроллерами просмотра. Ну, я пробовал это, но всякий раз переход от контроллера представления iAd к GameViewController, он испортил все это. Код в GameViewController.m говорит, что он изначально установлен в основное меню моей игры (SKScene). Поэтому, когда я пытаюсь перейти от iAd, вместо сохранения того же SKScene, он переходит в мою основную сцену.

мне нужно эти ответы:

  1. Есть ли какой-то способ, кроме использования двух контроллеров View, чтобы показать межстраничный МААШ?
  2. Если нет, то как я могу обойти эту проблему?
  3. Будет ли эта проблема также возникать, если я изменил бы свои «Interstitial iAds» на «Предварительные ролики видео iAds?»?

-

EDIT! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ! РЕДАКТИРОВАТЬ!

-

я в конечном итоге принять решение использовать ответ crashoverride777, и создание Objective-C мостовую заголовок, чтобы преобразовать его Swift код Objective-C. Но, ссылаясь на переменную Ads.swiftpresentingViewController, она заканчивается ноль. Вот мой код в GameViewController.m:

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

Это, однако, ничего не делает. Функция showInterAd вызывается из моего 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

Почему это вызывает у вас проблемы ?. Этот первый код кнопки - это что-то новое с быстрым 2.0, так как в нем было немного иначе, чем в быстром. В объекте C это должно выглядеть так, я думаю, UIButton * iAdInterAdCloseButton = [UIButton buttonWithType: UIButtonTypeSystem]; – crashoverride777

+0

в отношении кода устройства. Является ли ваше приложение Universal? В противном случае он не будет вызван, насколько я знаю? Вы можете прочитать это и попробовать возможные способы проверить, является ли устройство 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 did load» и т. Д.Но объявления не отображаются на экране. Я не уверен, что случилось. Вы хотите, чтобы я опубликовал свой код? Я уверен, что он идентичен нужному коду. –

+0

эй, пожалуйста. Я только что создал новый игровой проект xCode и скопировал вышеуказанный код, и он не работает. Вы вызываете Ads.sharedInstance.showInterAd() или Ads.sharedInstance.showInterAdRandomly() ?. У случайного есть только 33% вероятности показа. Также иногда симулятор испытывает боль при тестировании, и вам нужно подождать пару часов. – crashoverride777

+0

Вам нужно вызвать Ads.sharedInstance.presentingViewController = self в вашей игре Посмотреть контроллер в viewDidLoad, желательно перед загрузкой первой сцены. Чем в ваших сценах вам нужно вызвать ... методы showInterAd и показывать объявления. Дайте мне знать, как это происходит – crashoverride777

0

Представление межстраничного набора спрайтов почти идентично в других частях приложения. Единственное различие заключается в том, что вы добавляете добавление, вызывая все методы iAd с помощью «self.view». Это приобретает вид SKScene представлен в и представить ОВР над ним

также это может быть использовано для представления интерстициальных без переключения зрения контроллеров

currentView.requestInterstitialAdPresentation() 

запросить у в сцене:

self.view?.requestInterstitialAdPresentation() 

Обратите внимание, как в вызове функции он говорит запрос. Вот почему он появляется только иногда. Когда вы запрашиваете объявление, устройство отправляет запрос на яблоко с запросом на объявление. Если вы получите ответ в течение разумного промежутка времени, то объявление будет представлено.Если вы не получите ответ в течение разумного промежутка времени (скорее всего из-за плохого интернета), то объявление не будет представлено, потому что нет ничего, что можно было бы представить. Однако, если вы запрашиваете один раз и его нет, в следующий раз, когда вы его спросите, он обязательно появится, потому что у вас уже есть объявление, загруженное с вашего последнего запроса, но оно никогда не было представлено.

+0

Это работает чудесно! Итак, теперь у меня есть два вопроса. ** 1. ** Как я могу назвать эту функцию из SKScene, а не из GameViewController? Будет ли это '[[[GameViewController.m alloc] init] requestInterstitialAdPresentation];'? ** 2. ** Почему iAds появляются только иногда? Я должен подождать некоторое время, прежде чем они будут работать. –

+0

Получается, что мой фрагмент кода на самом деле не работает. Любые другие идеи? –

+0

, который должен работать, можете ли вы показать код в своей сцене – AwesomeTN

 Смежные вопросы

  • Нет связанных вопросов^_^