2017-01-31 4 views
0

애플리케이션 내 장면에 배너보기를 통합했지만 다른 장면에 삽입 광고를 통합하지 못했습니다. 수입 SpriteKit 수입 GameKit 수입 GoogleMobileAdsGameViewController에 링크 된 장면 위에 삽입 광고를 게재 하시겠습니까?

class GameOverMenu: SKScene, GKGameCenterControllerDelegate, UIAlertViewDelegate { 

var viewController: GameViewController! 
var interstitial: GADInterstitial! 

var myTimer = Timer() 


override func didMove(to view: SKView) { 

createAndLoadInterstitial() 

startMyTimer() 




} 


func createAndLoadInterstitial() { 
interstitial = GADInterstitial(adUnitID: "...") 
let request = GADRequest() 
request.testDevices = [ kGADSimulatorID, "..." ] 
interstitial.load(request) 
} 


func startMyTimer() { 
myTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(GameOverMenu.myFunction), userInfo: nil, repeats: false) 

} 

func myFunction(){ 

if interstitial.isReady { 
    interstitial.present(fromRootViewController: viewController) 
} else { 
    print("Ad wasn't ready") 
} 

} 

가 함께로드 할 때 그것은 실패 "심각한 오류 : 예기치 않게하는 옵션 값을 풀기 동안 nil을 발견" 다음은 내 코드입니다. 문제는 코드가 아래와 같이 표시되고 응용 프로그램이 시작될 때 GameOver 장면을로드하는 것처럼 아래에 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

if let view = self.view as! SKView? { 




    // Load the SKScene from 'MainMenu.sks' 
    if let scene = MainMenuScene(fileNamed: "MainMenu") { 

     scene.viewController = self 

     // Set the scale mode to scale to fit the window 
     scene.scaleMode = .aspectFill 

     // Present the scene 
     view.presentScene(scene) 


    } 

    if let scene3 = GameOverMenu(fileNamed: "GameOver") { 

     scene3.viewController = self 

     // Set the scale mode to scale to fit the window 
     scene3.scaleMode = .aspectFill 

     view.presentScene(scene3) 





    } 

답변

0

문제는 당신이 두 장면 사이를 전환 할 때 GameViewController에 대한 참조를 잃어 버릴 것입니다 예 : 응용 프로그램을 시작할 때만 작동하는 이유

scene3.viewController = self 

이잖아.

당신도 사용하고 있습니다! 그 속성들에 대해서

var viewController: GameViewController! 
var interstitial: GADInterstitial! 

그래서 만약 그들이 없으면 당신은 충돌 할 것입니다. 그래서 항상 사용해야합니까? 당신이 100 % 확신 할 수없는 뭔가가있을 때.

var viewController: GameViewController? 
var interstitial: GADInterstitial? 

"myFunction"과 같은 코드에서 "?" 그리고 "if let"이 속성이 nil 일 때 충돌하지 않도록합니다.

if let ad = interstitial, let vc = viewController, ad.isReady { 
     ad.present(fromRootViewController: vc) 
    } else { 
     print("Ad wasn't ready") 
    } 

문제의 일반적인 해결 방법은 모든 AdMob 코드를 GameViewController로 직접 이동해야한다는 것입니다. NotificationCenter 또는 위임 같은 것을 사용하여 장면의 메시지를 ViewController로 전달하여 광고를 표시 할 수 있습니다. SKScenes에서 ViewController를 참조하는 것이 가장 좋은 방법입니다.

그래서 당신은 관찰자를 추가 할 수있는 viewDidLoad에 GameViewController에서보다

extension Notification.Name { 
     static let showAd = Notification.Name(rawValue: "NotificationShowAd") 
} 

    class GameViewController: UIViewController {... 

키 알림이 확장을 만들 클래스 구현 외부 GameViewController에서의 ViewController와보다 모든 광고 코드를 이동

override func viewDidLoad() { 
    super.viewDidLoad() 

     createAndLoadInterstitial() 

     NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: .showAd, object: nil) 

     .... 
} 

이제 SKScenes에서 광고를 표시해야 할 때마다 전화 할 수 있습니다.

NotificationCenter.default.post(name: .showAd, object: nil) 

은 더 쉽게 당신의 인생을이

도움이

https://github.com/crashoverride777/SwiftyAds

희망 GitHub의

내 도우미 좀보고