簡體   English   中英

Admob 框架 class 未被 Xcode 接口構建器檢測到

[英]Admob Framework class not detected by Xcode interface builder

I've been trying to implement native Google adMob ads in my iOS app and followed the admob official tutorial: https://developers.google.com/admob/ios/native/advanced

Whether I added the required admob framework manually or by CocoaPods, all the classes in the admob frameworks were not detected by the interface builder, so I could not set the Custom class of UIView to the wanted admob view classes. 但奇怪的是,在我的 swift 文件中導入框架后,我可以使用所有與 admob 相關的類。 請看下面的截圖:

在此處輸入圖像描述

在此處輸入圖像描述

我發現了一個 github 項目,它只是通過 Cocoapoding admob 框架實現了 admob 原生廣告。(項目鏈接 我下載了它的源代碼,奇怪的是admob框架類在這個項目中可以通過接口面檢測到。

在此處輸入圖像描述

幾天來我一直在摸不着頭腦,尋找解決方案沒有運氣。 如果您知道為什么會發生這種情況並且您的幫助受到高度贊賞,請幫助我。

TL;DR:對於那些無法將 SDK 降級到 7.68.0 以下的人,打開xib作為源代碼並手動編輯代碼以設置自定義 Class 並將插座鏈接到視圖。

您可以通過在字段中直接鍵入 class 名稱來將自定義 class 設置為GADUnifiedNativeAdView (或GADNativeAdView ,因為GADUnifiedNativeAdView現在已棄用)。

請注意,如果 class 名稱未顯示在下拉列表中,您無需擔心。 從下面的屏幕截圖中可以看到,您只需鍵入它即可。 (例如GADUnifiedNativeAdView

GADUnifiedNativeAdView

但是,您無法將 outlet 鏈接到視圖(例如,將您的視圖鏈接到每個原生廣告視圖),因為您不會在GADUnifiedNativeAdView中看到 outlet,正如您從以下屏幕截圖中看到的那樣。

不支持奧特萊斯系列

在這種情況下,您可以通過編輯視圖的源代碼來鏈接插座。

  1. 從界面構建器完成您的原生廣告布局。
  2. Project Navigator面板中,右鍵單擊視圖 ( *.xib ) 文件和 select Open As > Source Code
  3. GADUnifiedNativeAdView / GADNativeAdView<view>標記中,添加<connections>標記並聲明每個原生廣告視圖的出口。 請注意,您需要從destination標簽中引用視圖的 object ID,並自己為每個插座生成 object ID。

以下示例展示了四種原生廣告資源(媒體、圖標、標題和正文):

<?xml version="1.0" encoding="UTF-8"?>
<document ...>
    <objects>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GADUnifiedNativeAdView">
            <subviews>
                <view ... id="BAF-yb-wZL" userLabel="media" customClass="GADMediaView">
                    ...
                </view>
                <view ... id="U4D-Gx-1Wm" userLabel="bottom">
                    <subviews>
                        <imageView ... id="6hd-Ad-50f" userLabel="icon">
                            ...
                        </imageView>
                        <stackView ...>
                            <subviews>
                                <label ... id="UdA-3o-ttn" userLabel="headline">
                                    ...
                                </label>
                                <label ... id="Dqe-NX-Uu2" userLabel="body">
                                    ...
                                </label>
                            </subviews>
                        </stackView>
                    </subviews>
                </view>
            </subviews>
            <!-- TODO: Add outlet connections -->
            <connections>
                <outlet property="bodyView" destination="Dqe-NX-Uu2" id="GAD-Nat-Bdy"/>
                <outlet property="headlineView" destination="UdA-3o-ttn" id="GAD-Nat-Hdl"/>
                <outlet property="iconView" destination="6hd-Ad-50f" id="GAD-Nat-Ico"/>
                <outlet property="mediaView" destination="BAF-yb-wZL" id="GAD-Nat-Mdv"/>
            </connections>
        </view>
    </objects>
</document>

重要提示:您需要為與其他類似的插座(例如, XXX-YYY-ZZZ )生成 object ID,以避免意外錯誤。 我在上面的例子中使用了GAD-Nat-XXX格式。

如果要查找每個插座的屬性名稱,請單擊自定義 class 下拉列表中的灰色箭頭按鈕。

自定義類下拉列表

然后,您將從其 header 文件中找到插座的屬性名稱。 (例如GADUnifiedNativeAdView

GADUnifiedNativeAdView 標頭

重要提示:您需要至少構建一次項目以使您的 Xcode 為您的自定義 class 找到 header。

  1. Project Navigator中,通過右鍵單擊視圖並選擇Open As > Interface Builder XIB Document來使用界面構建器打開視圖文件。

  2. 在連接檢查器中,確認您在上一步中添加的連接。 您會看到一個警告圖標,但您可以忽略它。

連接檢查員

  1. 加載並顯示廣告。

嘗試編輯 Storyboard 的 XML 以解決此問題。

  • 右鍵單擊 storyboard 或界面生成器。
  • Select 查看 controller 或查看 go 到 Project Navigator 面板和 Z99938282-1816E 代碼菜單選擇。
  • 添加屬性 customClass=" GADUnifiedNativeAdvView "

保存 storyboard 或查看。

再次右鍵單擊 Project Navigator 面板中的情節提要/視圖條目,然后 select Open As->Interface Builder

Hpefully,您將看到自定義 class 名稱。

TL;博士

將 CocoaPods pod 版本降級到7.67.0 (-:

播客文件

pod 'Google-Mobile-Ads-SDK', '7.67.0'

解釋

這是因為GoogleMobileAds.frameworkGoogleMobileAds.xcframework中變成了7.68.0+ - source 這意味着 Objective C 運行時在框架(iOS 9)和主要目標(iOS 14.0+)之間是不同的。 XCFramework是一種特殊類型的二進制框架,因此在 iOS 版本已經編譯后手動編輯它不會有任何區別,事實上,即使您在Podfile中指定 iOS 版本也不會有任何區別.

主代碼在底層有一個不同的、更快的 Objective-C 運行時,因此使用不同的數據結構跟蹤類到XCFramework 例如,如果在框架中定義了一個類別,即使沒有使用新的覆蓋方法(在運行時),它也將存儲在讀寫 memory 中。 另一方面,iOS 14.0+ 中的 Objective-C 運行時在用於節省 RAM 之前不會加載這些方法。 這是舊 iOS 版本的重大更改,因為用於索引這些類的舊數據結構不再包括類別方法(在同一存儲區域中),並且框架中的依賴邏輯(讀取這些數據結構)將不再起作用。 方法調配的處理方式不同,這也是GoogleUtilities所做的( GoogleMobileAds的依賴項),因此這可能會導致問題。 因此,即使 IB 自動完成功能不起作用(那里沒有大問題),在運行時也不會動態找到 class。 我沒有提到在新運行時對method list表示更改的更改,因為該問題超出了 scope 的范圍,但舊方法列表在運行時仍然可用(非破壞性更改)。

要解決這個問題,現在只需在Podfile中使用7.67.0版本。 作為框架的最終用戶,您不能對此做任何其他事情,因為podspec將框架類型指定為vendored_framework並且只能在框架的源代碼中進行編輯。 我試圖禁用use_frameworks但這沒有編譯。 如果您可以為自己的框架編輯podspec ,則更改為 static 框架是一個可行的解決方案(帶有警告)。 該框架在構建時鏈接,而不是在 static 框架的加載時鏈接,因此您應該能夠在 IB 中看到框架 class,但隨后您必須使框架的依賴 pod 也為 ZA81259CEF8E959C624ZD1D456(更多工作)。 更簡單的等價物是降級 pod,或在 Podfile 中禁用use_frameworks 但是,框架具有更快的性能(鏈接時間)並且通常是首選的,這就是為什么它們默認為 CocoaPods 啟用的原因。

我還建議為此錯誤創建一個新的 GitHub 問題,但看起來 SDK 不是開源的。 也許這個錯誤將來會由 Apple 解決,或者一旦他們意識到它就會由 Google 解決,但目前這是一種解決方法

1:吊艙安裝——干凈安裝

2:打開Xcode並shift - command - k

3:關閉 Xcode 並重新打開

4:喝咖啡,等待 xcode 預構建完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM