【问题标题】:Why does adding iOS AdMobs GADBannerView cause sigabrt in AppDelegate (Swift)?为什么在 AppDelegate (Swift) 中添加 iOS AdMobs GADBannerView 会导致 sigabrt?
【发布时间】:2016-12-04 20:28:16
【问题描述】:

我无法在我的 iOS 应用中投放 AdMob 广告。 我遇到了一个特定的错误,我将在下面向您展示,但首先这是我尝试过的。

这是我尝试过的方法

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

既然您知道我已经做了很多工作,请看看发生了什么。

应用崩溃

确切的错误是:

CYaPass[13155:433036] [MC] 从私人有效用户读取 设置。谷歌移动广告 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 代码时,应用程序将正常运行。

您可以看到我确实在 UIView 上定义了两个插座,我正试图将它们用于 BannerView。这样我就可以在删除一行 AdMob 代码时对其进行测试。

您还可以在 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 的背景变为黑色。

要点:特定代码导致问题

现在,让我告诉你,如果我取消注释第一行横幅广告代码,那么应用程序会在 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 更改为无效值,应用也不会崩溃,广告也不会显示。

这是结果

调试显示确切的代码行

我可以进入代码,它就在我们刚刚添加的那个 loadAd() 行上,当这个错误发生时(如下所示以供清晰参考):

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

唯一的区别:选项卡式视图——这就是问题所在吗?

唯一有效的区别是我的应用基于标签视图。 有谁知道为什么会这样?

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

【问题讨论】:

    标签: ios xcode firebase uiview admob


    【解决方案1】:

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

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

    必须更改视图类型

    如果您转到情节提要并检查该 UIView,您将看到它如下所示:

    但是,由于它不是 GADBannerView,我们得到的错误看起来像这样是有道理的:

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

    这就是让我找到答案的线索。

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

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

    【讨论】:

      【解决方案2】:

      如果其他人有同样的问题并且不知道发生了什么,我有一个不同的问题并出现类似的错误。

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

      还要确保module 为空,并且inherit module from target 未勾选。

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多