AI Search

迁移到 SDK 11.4.X

InMobi 的 SDK 11.4.0 为您的应用带来更强大的盈利能力。升级过程极其简单,只需拖放集成并完成几个合规步骤即可。

有关 iOS 集成的更多信息,请参阅 iOS SDK 集成入门指南

最新版本的 InMobi SDK 支持:

  • iOS 版本 - 最低要求 iOS 12 和 Xcode 15.0

对于用 Objective-C 编写的应用程序/适配器

  1. 导入子模块,例如InMobi.IMBanner(或InMobi.IMSdk):

    问题:编译错误“模块‘ InMobiSDK’中没有名为‘IMSdk’的子模块;您是不是想用‘Swift’?”

    原因:Swift 默认情况下不支持子模块的概念。

    解决方法:将 ( @import InMobiSDK.IMBanner;) 替换为 ( @import InMobiSDK;)。

    笔记

    这同样适用于任何其他子模块(例如InMobiSDK.IMSdkInMobiSDK.IMBannerDelegate...)。注意:如果您有类似 ( #import <inmobisdk imbanner.h=""></inmobisdk>) 的行,也需要将其替换为 ( @import InMobiSDK;)。

  2. 常量的使用,例如IM_GDPR_CONSENT_AVAILABLE

    问题:编译错误“使用了未声明的标识符IM_GDPR_CONSENT_AVAILABLE”。

    解决方法:替换IM_GDPR_CONSENT_AVAILABLE为 IMCommonConstants IM_GDPR_CONSENT_AVAILABLE

    笔记

    所有这些常量现在都可以在类 Other 下使用,IMCommonConstants. 这些常量现在是IMCommonConstants类的静态成员:

    • IM_GDPR_CONSENT_AVAILABLE
    • IM_GDPR_CONSENT_IAB
    • IM_SUBJECT_TO_GDPR
    • IM_PARTNER_GDPR_CONSENT_AVAILABLE
    • IM_PARTNER_GDPR_APPLIES
  3. 在 Objective-C (k) 表示法中使用枚举值:

    问题:编译错误“使用了未声明的标识符kIMSDKLogLevelDebug,您是不是想用这个IMSDKLogLevelDebug?”

    Xcode建议:替换kIMSDKLogLevelDebug 为IMSDKLogLevelDebug

    解决方案:请接受 Xcode 编辑器建议的修复方案。

    笔记

    这适用于 Objective-C中任何其他使用“k”表示法的常量。kIMSDKAgeGroupBelow18,,都可以使用相同的方法进行修正。应用程序中可能存在的枚举类型完整列表包括:,,kIMSDKEducationHighSchoolOrLesskIMSDKGenderMaleIMSDKGenderIMSDKEducationIMSDKAgeGroup

  4. IMInterstitial 类的 showFromViewController 方法:

    问题:此方法有两个重载版本,两者都会导致编译错误。

    解决方案:请接受 Xcode 代码自动完成功能建议的更改。

    示例 1:用新版本替换旧版本:

较旧

<span class="hljs-section">[self.interstitial showFromViewController: self]</span><span class="hljs-comment">;</span>

较新

<span class="hljs-section">[self.interstitial showFrom: self]</span><span class="hljs-comment">;</span>

示例 2:用新版本替换旧版本:

较旧

<span class="hljs-section">[self.interstitial showFromViewController:self withAnimation: kIMInterstitialAnimationTypeCoverVertical]</span><span class="hljs-comment">;</span>

较新

[self.interstitial showFrom:self <span class="hljs-keyword">with</span>:IMInterstitialAnimationTypeCoverVertical];

笔记

当你输入“[self.interstitial show”时,它应该会提供两种变体供你选择。

  1. 纯 Objective-C 应用程序的链接错误:

    问题:如果您有一个纯 Objective-C 应用程序(不包含任何 Swift 文件),则会遇到很多链接错误,例如:

    未定义的符号:  _OBJC_CLASS_$__TtCs12_SwiftObject

    未定义符号:值见证表 ()等等。这是因为 InMobi SDK 是一个静态链接框架,您的应用程序找不到 Swift 库的路径。

    解决方法:有两种方法可以修复这些链接错误:

    解决方案 1:请在项目中添加一个空的 Swift 虚拟文件。添加后,Xcode 编辑器会询问是否生成自动桥接头文件;请选择“是”。这样做的好处是 Swift 编译器可以找到所需 Swift 库的位置,从而解决所有链接问题。

    具体操作方法如下:

    1. 在 Xcode 中,选择“文件”&gt;“新建文件”选项
    2. 选择iOS Swift文件选项。单击“下一步”
    3. 您可以随意命名(例如,dummy.swift),并确保将此文件添加到正确的目标中(如果您的项目中有多个目标)。
    4. 选择“创建”。然后选择“创建桥接头文件”。
    5. 构建你的项目。


    解决方案 2:请在 Xcode 中仔细选择您的目标(从项目中),然后转到
    “构建设置”&gt; “搜索路径” &gt;“库搜索路径”,并找到以下两个条目:

    • $(SDKROOT)/usr/lib/swift
    • $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)

    同样,编译器将能够找到 Swift 库的位置,从而修复链接错误。

适用于用 Swift 编写的应用程序/适配器

  1. 导入子模块,例如InMobi.IMBanner(或InMobi.IMSdk):

    问题:编译错误“找不到模块InMobiSDK.IMBanner

    原因:Swift 默认情况下不支持子模块的概念。

    解决方案:将 (import InMobiSDK.IMBanner) 替换为 (import InMobiSDK)。

    笔记

    这同样适用于其他子模块(例如,,,InMobiSDK.IMSdk等等InMobiSDK.IMBannerDelegate)。

  2. 使用常量,例如:IM_GDPR_CONSENT_AVAILABLE.

    问题:编译错误“在作用域中找不到‘IM_GDPR_CONSENT_AVAILABLE’”

    解决方法:替换IM_GDPR_CONSENT_AVAILABLE为 IMCommonConstants IM_GDPR_CONSENT_AVAILABLE

    笔记

    所有这些常量现在都可以在 IMCommonConstants 类中使用。其他一些常量现在是 IMCommonConstants 类的静态成员:

    • IM_GDPR_CONSENT_AVAILABLE
    • IM_GDPR_CONSENT_IAB
    • IM_SUBJECT_TO_GDPR
    • IM_PARTNER_GDPR_CONSENT_AVAILABLE
    • IM_PARTNER_GDPR_APPLIES
  3. primaryView方法IMNative

    问题:此方法的返回类型现在是可选的。因此,如果您使用此方法,则必须调整代码以解包方法的返回值。

    解决方案:手动调整代码。仅当返回值不为 nil 时,才需要将此子视图添加到主视图中。

    例如:如果你的源代码(较旧)中有以下这行代码,请将其更改为较新的代码。

较旧

<span class="hljs-built_in">self</span>.contentView.<span class="hljs-title function_ invoke__">addSubview</span>(native.<span class="hljs-title function_ invoke__">primaryView</span>(<span class="hljs-attr">ofWidth</span>: aWidth))

较新

<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> aView = native.<span class="hljs-title function_">primaryView</span>(<span class="hljs-params">ofWidth: aWidth</span>) { 
    self.<span class="hljs-property">contentView</span>.<span class="hljs-title function_">addSubview</span>(aView) 
}
  1. 在源代码中创建广告对象:

    问题:如果您在源代码中创建广告,请注意所有 3 个广告构造函数(IMBannerIMInterstitial、IMNative 和 IMNative)现在都返回非可选实例。

    解决方案:请删除用于解包/可选绑定这些广告构造函数返回的实例的代码(如果有)。

    例如

    • 如果你使用的是“if let”结构,那么现在它是多余的,因为返回的实例不再是可选的。
    • 如果您尝试使用“?”表示法进行可选链式调用,请更新您的源代码并移除“?”的使用。这样您就可以在不使用这种链式调用的情况下访问成员变量/方法。
  2. 重命名以满足此要求警告:

    问题:编译警告。“重命名为 'banner(_: didReceiveWithMetaInfo: )' 以满足此要求”

    解决方法:在大多数情况下,Xcode 建议的修复方法(例如重命名)是正确的。

    示例:带有警告的源行

<span class="hljs-keyword">func</span> <span class="hljs-title function_">banner</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">banner</span>: <span class="hljs-type">IMBanner</span>!, <span class="hljs-params">didReceiveWith</span> <span class="hljs-params">info</span>: <span class="hljs-type">IMAdMetaInfo</span>!)

Xcode 接受代码修复后的源代码行:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">banner</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">banner</span>: <span class="hljs-type">IMBanner</span>!, <span class="hljs-params">didReceiveWithMetaInfo</span> <span class="hljs-params">info</span>: <span class="hljs-type">IMAdMetaInfo</span>!)

已重命名的 API 列表:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">interstitial</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">interstitial</span>: <span class="hljs-type">IMInterstitial</span>!, <span class="hljs-params">didReceiveWithMetaInfo</span> <span class="hljs-params">metaInfo</span>: <span class="hljs-type">IMAdMetaInfo</span>!) 
<span class="hljs-keyword">func</span> <span class="hljs-title function_">userWillLeaveApplication</span>(<span class="hljs-params">from</span> <span class="hljs-params">banner</span>: <span class="hljs-type">IMBanner</span>!) 
<span class="hljs-keyword">func</span> <span class="hljs-title function_">userWillLeaveApplication</span>(<span class="hljs-params">from</span> <span class="hljs-params">interstitial</span>: <span class="hljs-type">IMInterstitial</span>!) 
<span class="hljs-keyword">func</span> <span class="hljs-title function_">userWillLeaveApplication</span>(<span class="hljs-params">from</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!) 
<span class="hljs-keyword">func</span> <span class="hljs-title function_">userDidSkipPlayingMedia</span>(<span class="hljs-params">from</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!)
  1. 参数可选性与协议预期之间的差异:

    问题:编译警告:“nativeDidFinishPlayingMedia 的参数的可选性与协议 'IMNativeDelegate' 的预期不同”

    解决方案:在大多数情况下,Xcode 建议的修复方法(例如删除!)是正确的。

    例1

带有警告的源行:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeDidFinishLoading</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!)

Xcode 接受代码修复后的源代码行:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeDidFinishLoading</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>)

例2

带有警告的源行:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!, <span class="hljs-params">didFailToLoadWithError</span> <span class="hljs-params">error</span>: <span class="hljs-type">IMRequestStatus</span>!)

Xcode 接受代码修复后的源代码行:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!, <span class="hljs-params">didFailToLoadWithError</span> <span class="hljs-params">error</span>: <span class="hljs-type">IMRequestStatus</span>)

实例方法几乎完全符合协议警告的可选要求:

问题:编译警告。“实例方法 'native(_:didInteractWithParams:)' 与协议 'IMNativeDelegate' 的可选要求 'native(_:didInteractWithParams:)' 几乎匹配”。解决方案:请检查相应委托中的方法,查看哪个参数类型不同,并进行相应的修复。

例1

带有警告的源行:

<span class="hljs-keyword">public</span> <span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!, <span class="hljs-params">didInteractWithParams</span> <span class="hljs-params">params</span>: [<span class="hljs-params">AnyHashable</span>: <span class="hljs-keyword">Any</span>]<span class="hljs-operator">!</span>)

IMNativeDelegate 协议中的此方法期望参数类型为 [String: Any]。因此,只需将 AnyHashable 更新为 String 类型,并移除方法签名中的“!”即可解决此警告。

手动更改后,请更正源线路:

<span class="hljs-keyword">public</span> <span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>!, <span class="hljs-params">didInteractWithParams</span> <span class="hljs-params">params</span>: [<span class="hljs-params">String</span>: <span class="hljs-keyword">Any</span>])

例2:

带有警告的源行:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">banner</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">banner</span>: <span class="hljs-type">IMBanner</span>!, <span class="hljs-params">didInteractWithParams</span> <span class="hljs-params">params</span>: [<span class="hljs-params">AnyHashable</span>: <span class="hljs-keyword">Any</span>]<span class="hljs-operator">!</span>)

如果我们检查IMBannerDelegate协议中的这种方法,可以发现有三个不同之处:

  • IMBanner 类型参数后面的“!”需要删除。
  • 它期望的参数类型为 [String: Any],而不是 [AnyHashable, Any]。
  • 它期望的是 [AnyHashable, Any]?,而不是 [AnyHashable, Any]!

手动更改后,正确的源线路:

<span class="hljs-keyword">func</span> <span class="hljs-title function_">banner</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">banner</span>: <span class="hljs-type">IMBanner</span>, <span class="hljs-params">didInteractWithParams</span> <span class="hljs-params">params</span>: [<span class="hljs-params">String</span>: <span class="hljs-keyword">Any</span>]<span class="hljs-operator">?</span>)

已移除方法列表

以下方法已被移除,请停止使用。

IMBanner

<span class="hljs-built_in">-</span>(void)getSignals;

内部

<span class="hljs-built_in">-</span>(void)getSignals;

IMBannerDelegate

<span class="hljs-built_in">-</span>(void)banner:(IMBanner*)banner gotSignals:(NSData*)signals;
 
<span class="hljs-built_in">-</span>(void)banner:(IMBanner *)banner failedToGetSignalsWithError:      (IMRequestStatus*)status;

IMInterstitialDelegate

<span class="hljs-built_in">-</span>(void)interstitial:(IMInterstitial*)interstitial gotSignals:(NSData*)signals; 

<span class="hljs-built_in">-</span>(void)interstitial:(IMInterstitial*)interstitial failedToGetSignalsWithError:(IMRequestStatus*)status;

替代方法[IMSdk getToken]用于代替上述方法

本页内容

最后更新于 : 06 Aug, 2026