为什么在AppDelegate(Swift)中添加iOS AdMobs GADBannerView导致sigabrt?

时间:2016-12-04 20:28:16

标签: ios xcode firebase uiview admob

我无法在我的iOS应用中使用AdMob广告。 我收到一个特定的错误,我将在下面告诉你,但首先是我尝试过的。

这是我尝试过的事情

  1. 一旦我在主应用程序中收到错误,我就检索了官方BannerExample并使其成功运行。 BannerView示例应用程序运行,我看到该广告在我的iPhone 5s模拟器上运行时会显示在应用中。
  2. 我已经完成了各种pod更新,以确保我拥有所有必需软件包的确切新版本,并记住应用程序构建没有任何问题。
    1. 我已将其调试为一行代码,我将在下面向您展示。
  3. 既然你知道我做了很多工作,那就去看看发生了什么。

    应用崩溃

    确切的错误是:

      

    CYaPass [13155:433036] [MC]从私人有效用户那里阅读   设置。 Google移动广告SDK版:afma-sdk-i-v7.15.0 2016-12-04   14:37:26.046 CYaPass [13155:432944] - [UIView loadRequest:]:   无法识别的选择器发送到实例 0x7f8bf4546090 2016-12-04   14:37:26.055 CYaPass [13155:432944] ***由于未被捕获而终止应用程序   例外

    这不是AppDelegate错误的正常sigabrt。 我已经尝试了所有与StoryBoard相关的正常事情,这里有一张图片向您展示我没有任何未定义的项目。另外,我会告诉您,当我删除一行AdMob代码时,该应用程序将正常运行。

    controller outlets

    你可以看到我在UIView上定义了两个我试图用于BannerView的出口。当我删除一行AdMob代码时,我可以测试它。

    您还可以在SettingsController上看到这些插座

    outlet settingscontroller

    您可以在我的实际控制器代码中看到它们,如下所示:

        @IBOutlet weak var AdMobs: GADBannerView!
    
        @IBOutlet weak var SuperView: UIView!
        func loadAd(){
            AdMobs.adUnitID = "ca-app-pub-3940256099942544/2934735716"
            AdMobs.rootViewController = self
            AdMobs.load(GADRequest())
            SuperView.backgroundColor = UIColor.black;
        }
    

    我将这些行分隔为loadAd() func,以便我可以从不同的位置测试它们,但它与官方BannerExample在viewDidLoad() func中使用和调用的代码相同。

    关于UIView的小测试

    然后,你看我也在完全相同的UIView(SuperView)上做了一些工作,我将backgroundColor设置为黑色。

    这是为了让自己相信这不仅仅是因为我已经为UIView添加了一个出口。但是如果我只是在它之前注释出三行,那么该代码工作正常。

    在这里,我将运行它并向您显示输出。就在我这样做之前,这是我的AppDelegate应用程序构造函数,它不会改变。它实际上是官方BannerExample的副本:

    import Firebase
    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate{
        var window: UIWindow?
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            FIRApp.configure()
            GADMobileAds.configure(withApplicationID: "ca-app-pub-myapp-hiddenforpublicConsumption")
            return true
        }
    

    现在,我将更改loadAd()更改为如下所示并再次运行:

    func loadAd(){
            //AdMobs.adUnitID = "ca-app-pub-3940256099942544/2934735716"
            //AdMobs.rootViewController = self
            //AdMobs.load(GADRequest())
            SuperView.backgroundColor = UIColor.black;
        }
    

    显然,唯一的变化是我评论了这三行。这是它运行时的样子。

    标签式视图应用

    顺便说一下,这是一个标签式应用。所以应用程序出现了,我点击Settings选项卡,你可以看到loadAd()中更改的代码运行并将UIView的背景变为黑色。 uiview background black

    要点:特定代码导致问题

    现在,让我告诉您,如果我取消注释第一行横幅广告代码,那么该应用会在AppDelegate中崩溃。

    这是改变后的loadAd()

    func loadAd(){
            AdMobs.adUnitID = "ca-app-pub-3940256099942544/2934735716"
            //AdMobs.rootViewController = self
            //AdMobs.load(GADRequest())
            SuperView.backgroundColor = UIColor.black;
        }
    

    同样,您可以看到我只取消了在GADBannerView上设置adUnitId的一行。这与BannerExample使用的代码完全相同。它甚至使用相同的测试unitId,每个人都可以免费测试。此外,即使您将该unitId更改为无效值,该应用也不会崩溃,广告也不会显示。

    以下是结果

    crash

    调试显示完整的代码行

    我可以进入代码,它恰好位于我们刚发生此错误时添加的loadAd()行(如下所示,以供明确参考):

     AdMobs.adUnitID = "ca-app-pub-3940256099942544/2934735716"
    

    唯一差异:标签式视图 - 问题是什么?

    唯一有效的区别是我的应用程序基于tabbedview。 有谁知道为什么会这样?

    我现在已经尝试了近2天了。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

哦,痛苦......我终于找到了答案。

首先,在这里你可以看到我获得了成功。

success

必须更改视图类型

如果你去故事板并检查UIView,你会看到它如下所示: uiview type

然而,有意义的是因为我们得到的错误不是GADBannerView:

  

[UIView setAdUnitID:]:无法识别的选择器发送到实例

这是让我得到答案的线索。

您必须将值更改为GADBannerView(只需在UIView上的框中键入它):

make class GADBannerView

我还确认在官方示例中类型设置正确。  大约36个小时,我永远不会回来。 我错过了初始文档中的那一步,所以这是#34;椅子和键盘之间的错误"。

答案 1 :(得分:0)

如果其他人遇到同样的问题并且不知道发生了什么,我遇到了类似错误的不同问题。

转到广告的视图,然后转到Label所在的位置。将其更改为您的视图名称,它对我有用。

同时确保module为空,inherit module from target未被取消。