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

问题描述:

我无法在iOS应用中获取AdMob广告。 我收到了一个具体的错误,我会在下面给你看,但首先这里是我试过的。为什么在AppDelegate(Swift)中添加iOS AdMobs GADBannerView会导致sigabrt?

这里就是我试过

  1. 一旦我得到的错误在我的主应用程序,我检索到的官方BannerExample,并得到了它成功运行。 BannerView示例应用程序正在运行,我看到广告在我的iPhone 5s模拟器上运行时出现在应用程序中。
  2. 我已经完成了所有方式的pod更新,以确保我拥有所有必需软件包的确切新版本,并牢记应用程序的构建没有问题。
    1. 我已将它调试到一行代码,我将在下面给您看。

现在你知道我已经做了相当多的工作,看看发生了什么。

该应用崩溃

确切的错误是:

CYaPass [13155:433036] [MC]从私人有效用户 设置读。 Google Mobile Ads 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

你可以看到,我有对我试图使用的BannerView了UIView定义的两个出口。这样我可以在删除一行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; 
    } 

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

分页查看应用程序

顺便说一句,这是一个标签式的应用程序。所以这个应用程序出现了,我点击设置选项卡,你可以看到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天的一切。任何帮助表示赞赏。

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

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

success

类型必须改变

如果你到故事情节并检查的UIView你会看到它看起来像以下: uiview type

然而,那种有道理,因为它不是一个GADBannerView,我们得到的错误看起来像:

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

。那是让我答案的线索。

您必须将值更改为GADBannerView上(只是在盒子上的UIView键入):

make class GADBannerView

我还证实,在官方的例子,该类型设置正确有。 大约36个小时,我永远不会回来。 我错过了初始文档中的这一步,因此这是“椅子和键盘之间的错误”。