InMobi原生广告支持静态广告和视频广告。您可以选择信息流广告、启动画面广告或前置广告格式。创建原生广告位的步骤如下。
InMobi原生广告支持静态广告和视频广告。您可以选择信息流广告、启动广告或前置广告格式。创建原生广告位的步骤如下。
原生广告位创建完成后,您将能够看到广告位 ID。

IMNative 类包含以下对象:
@objc public var adTitle: String?- 返回广告标题。@objc public var adDescription: String? - 返回广告描述。@objc public var adIcon: IMNativeImage?- 返回广告图标图像。@objc public var adCtaText: String?- 返回广告的点击操作文本。@objc public var adRating: String?- 返回广告评分(可选)。@objc public var advertiserName: String?- 返回广告的广告商名称。(可选)@objc public var adChoice: UIImageView? - 返回广告的选择视图。(可选)IMNative 类支持以下功能:
@objc public func load()- 将广告加载到内存中的功能。@objc public func isReady() -> Bool- True 表示广告已准备好展示。@objc public func getCustomAdContent() -> [String: Any]?- 这将包含附加信息(描述、图像 URL 等),可用于围绕广告的主要视图创建自定义 UI。@objc public func isVideoAd() -> Bool - True 表示该广告是视频广告。@objc public func registerViewForTracking(_ view: IMNativeViewData)- 注册您的原生广告 UI,以便进行可见性、展示次数和点击次数跟踪。@objc public func getMediaView() -> UIView? - 如果可用,则返回此广告的 SDK 管理的媒体视图(图像或视频)。导入 InMobi SDK 头文件。
<span class="hljs-meta">#import <span class="hljs-string"><InMobiSDK/InMobiSDK.h></span></span>
<span class="hljs-keyword">import</span> <span class="hljs-title class_">InMobiSDK</span>
在您的信息流中声明您希望展示广告的位置。例如,将广告展示在第 4 位。
<span class="hljs-meta">#<span class="hljs-keyword">define</span> IM_AD_INSERTION_POSITION 4</span>
<span class="hljs-keyword">let</span> adInsertionPosition = <span class="hljs-number">4</span>
在您的应用程序中声明一个原生广告实例ViewController.m。
<span class="hljs-variable">@interface</span> TableViewController ()
<span class="hljs-variable">@property</span>(nonatomic,strong) IMNative *InMobiNativeAd;
<span class="hljs-variable">@end</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">ViewController</span>: <span class="hljs-type">UIViewController</span>, <span class="hljs-type">IMNativeDelegate</span> {
<span class="hljs-keyword">var</span> inMobiNativeAd: IMNative?
最终的ViewDidLoad代码应该如下所示:
- (<span class="hljs-type">void</span>)viewDidLoad {
[<span class="hljs-variable language_">super</span> viewDidLoad];
<span class="hljs-keyword">self</span>.InMobiNativeAd = [[IMNative alloc] initWithPlacementId:];
<span class="hljs-keyword">self</span>.InMobiNativeAd.delegate = <span class="hljs-keyword">self</span>;
[<span class="hljs-keyword">self</span>.InMobiNativeAd load];
<span class="hljs-comment">//Your app content </span>
}
<span class="hljs-keyword">override</span> <span class="hljs-keyword">func</span> <span class="hljs-title function_">viewDidLoad</span>() {
<span class="hljs-keyword">super</span>.viewDidLoad()
inMobiNativeAd <span class="hljs-operator">=</span> <span class="hljs-type">IMNative</span>(placementId: )
inMobiNativeAd<span class="hljs-operator">?</span>.delegate <span class="hljs-operator">=</span> <span class="hljs-keyword">self</span>
inMobiNativeAd<span class="hljs-operator">?</span>.load()
<span class="hljs-comment">// Your app content </span>
}
实现IMNativeDelegate成功回调方法。成功回调表明广告已准备好在屏幕上显示。您需要在此处将 InMobiNativeAd 对象添加到 TableView 的数据源中。
<span class="hljs-built_in">-</span>(void)nativeDidFinishLoading:(IMNative*)native{
<span class="hljs-selector-attr">[self.tableData insertObject:native atIndex:IM_AD_INSERTION_POSITION]</span>;
<span class="hljs-selector-attr">[self.tableView reloadData]</span>;
<span class="hljs-built_in">NSLog</span>(@"Native Ad did finish loading");
}
<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>!) {
<span class="hljs-keyword">self</span>.tableData.insert(native, at: <span class="hljs-type">IM_AD_INSERTION_POSITION</span>)
<span class="hljs-keyword">self</span>.tableView.reloadData()
<span class="hljs-type">NSLog</span>(<span class="hljs-string">"InMobi Native Did finished loading"</span>);
}
当您收到回调时,表示您已成功接收到原生广告nativeAdDidFinishLoading。以下示例展示了如何在 tableView 代理中获取 adView cellForRowAtIndexPath。
只有当原生广告的主视图位于屏幕可见区域时,才会触发展示事件。
使用故事板实现以下自定义单元格类。
<span class="hljs-meta">#import </span>
<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">InFeedTableViewCell</span> : <span class="hljs-title">UITableViewCell</span></span>
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UIImageView</span> *iconImage;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UILabel</span> *titleLabel;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UILabel</span> *subtitleLabel;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UILabel</span> *descriptionLabel;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UILabel</span> *ctaLabel;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UIView</span> *adView;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">weak</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UIImageView</span> *adChoice;
<span class="hljs-keyword">@end</span>
<span class="hljs-selector-tag">class</span> <span class="hljs-selector-tag">InFeedTableViewCell</span>: <span class="hljs-selector-tag">UITableViewCell</span> {
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">iconImage </span>: UIImage?
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">titleLabel </span>: UILabel?
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">subtitleLabel </span>: UILabel?
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">descriptionLabel </span>: UILabel?
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">ctaLabel </span>: UILabel?
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">adView </span>: UIView?
<span class="hljs-variable">@IBOutlet</span> weak var <span class="hljs-attribute">adChoice</span>: UIImageView!
}
- (<span class="hljs-built_in">UITableViewCell</span> *)tableView:(<span class="hljs-built_in">UITableView</span> *)tableView cellForRowAtIndexPath:(<span class="hljs-built_in">NSIndexPath</span> *)indexPath {
InFeedTableCell *cell = ( *)[tableView dequeueReusableCellWithIdentifier:<span class="hljs-string">@"InFeedTableCell"</span>];
<span class="hljs-type">id</span> nativeAd = [<span class="hljs-keyword">self</span>.tableData objectAtIndex:indexPath.row];
<span class="hljs-keyword">if</span> ([nativeAd isKindOfClass:[IMNative Class]]]) {
IMNative * currentNativeAd = nativeAd;
cell.iconImage.image = currentNativeAd.adIcon.imageview;
cell.titleLabel.text = currentNativeAd.adTitle;
cell.subtitleLabel.text = <span class="hljs-string">@"Sponsored"</span>;
cell.descriptionLabel.text = currentNativeAd.adDescription;
cell.ctaLabel.text = currentNativeAd.adCtaText;
<span class="hljs-comment">// Add ad choice view</span>
[cell.adChoice addSubview:currentNativeAd.adChoice];
cell.adChoice.userInteractionEnabled = <span class="hljs-literal">YES</span>;
<span class="hljs-comment">// Add media view</span>
<span class="hljs-built_in">UIView</span> *mediaView = [currentNativeAd getMediaView];
[cell.adView addSubview:mediaView];
<span class="hljs-comment">// Register native ad views for tracking</span>
IMNativeViewDataBuilder *builder = [[IMNativeViewDataBuilder alloc] initWithParentView:<span class="hljs-keyword">self</span>.cell];
[builder setTitleView:cell.titleLabel];
[builder setDescriptionView:cell.descriptionLabel];
[builder setCTAView:cell.ctaLabel];
[builder setIconView:(<span class="hljs-built_in">UIImageView</span> *)cell.iconImage];
IMNativeViewData *nativePubData = [builder build];
[currentNativeAd registerViewForTracking:nativePubData];
}
<span class="hljs-keyword">else</span>{
<span class="hljs-comment">//Your App’s TableCell implementation </span>
}
<span class="hljs-keyword">return</span> cell;
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">tableView</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">tableView</span>: <span class="hljs-type">UITableView</span>, <span class="hljs-params">cellForRowAt</span> <span class="hljs-params">indexPath</span>: <span class="hljs-type">IndexPath</span>) -> <span class="hljs-type">UITableViewCell</span> {
<span class="hljs-keyword">let</span> cell <span class="hljs-operator">=</span> (tableView.dequeueReusableCell(withIdentifier: <span class="hljs-string">"InFeedTableCell"</span>)<span class="hljs-operator">!</span> <span class="hljs-keyword">as!</span> <span class="hljs-type">InFeedTableViewCell</span>)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> currentNativeAd <span class="hljs-operator">=</span> <span class="hljs-keyword">self</span>.tableData<span class="hljs-operator">?</span>[indexPath.row] <span class="hljs-keyword">as?</span> <span class="hljs-type">IMNative</span> {
cell.iconImageView.image<span class="hljs-operator">!</span> <span class="hljs-operator">=</span> currentNativeAd.adIcon<span class="hljs-operator">?</span>.imageview
cell.titleLabel<span class="hljs-operator">!</span>.text<span class="hljs-operator">!</span> <span class="hljs-operator">=</span> currentNativeAd.adTitle
cell.subtitleLabel<span class="hljs-operator">?</span>.text<span class="hljs-operator">!</span> <span class="hljs-operator">=</span> <span class="hljs-string">"Sponsored"</span>
cell.descriptionLabel.text<span class="hljs-operator">!</span> <span class="hljs-operator">=</span> currentNativeAd.adDescription
cell.ctaLabel<span class="hljs-operator">?</span>.text<span class="hljs-operator">!</span> <span class="hljs-operator">=</span> currentNativeAd.adCtaText
<span class="hljs-comment">// Add ad choice view</span>
cell.adChoice.addSubview(currentNativeAd.adChoice)
cell.adChoice.isUserInteractionEnabled <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>
<span class="hljs-comment">// Add media view</span>
<span class="hljs-keyword">let</span> mediaView <span class="hljs-operator">=</span> currentNativeAd.getMediaView()
adView.addSubview(mediaView)
<span class="hljs-comment">// Register native ad views for tracking</span>
<span class="hljs-keyword">let</span> nativePubData <span class="hljs-operator">=</span> <span class="hljs-type">IMNativeViewData</span>.<span class="hljs-type">Builder</span>(parentView: cell)
.setTitleView(cell.adTitle)
.setDescriptionView(cell.descriptionLabel)
.setIconView(cell.adIcon)
.setCTAView(cell.<span class="hljs-type">CtaButton</span>)
.build()
currentNativeAd<span class="hljs-operator">?</span>.registerViewForTracking(nativePubData)
}
<span class="hljs-keyword">else</span> {
<span class="hljs-comment">// Your app's Table Cell implementations</span>
}
<span class="hljs-keyword">return</span> cell
}
在可重用的表格视图单元格中投放广告时,务必在显示新广告之前清除所有先前加载的广告。为此,请 prepareForReuse() 在自定义 UITableViewCell 子类中重写相关方法。这样可以确保移除所有旧的广告视图或数据,从而防止单元格重用期间出现内容重叠、内存泄漏或广告渲染错误等问题。
- (void)prepareForReuse {
<span class="hljs-selector-attr">[super prepareForReuse]</span>;
<span class="hljs-comment">// Remove previously added ad/media subviews</span>
for (UIView *v in self.adView.subviews) {
<span class="hljs-selector-attr">[v removeFromSuperview]</span>;
}
<span class="hljs-comment">// Optionally clear icon/title/etc. if you want:</span>
<span class="hljs-comment">// self.iconImage.image = nil; self.titleLabel.text = nil; ...</span>
}
<span class="hljs-keyword">override</span> <span class="hljs-keyword">func</span> <span class="hljs-title function_">prepareForReuse</span>() {
<span class="hljs-keyword">super</span>.prepareForReuse()
<span class="hljs-keyword">_</span> <span class="hljs-operator">=</span> adView.subviews.map { <span class="hljs-variable">$0</span>.removeFromSuperview()}
<span class="hljs-comment">// Optionally clear icon/title/etc. if you want:</span>
<span class="hljs-comment">// self.iconImage.image = nil; self.titleLabel.text = nil; ...</span>
}
刷新广告- 您需要在不同时间点刷新广告,以优化广告对用户的曝光度。要刷新广告,您需要按以下顺序调用相应函数。
<span class="hljs-comment">// Suggested approach</span>
<span class="hljs-comment">// Use`- (void)prepareForReuse` in UItableViewCell to clear out any ad before loading</span>
<span class="hljs-comment">// </span>
-(<span class="hljs-keyword">void</span>)refreshInMobiStrandAd {
[<span class="hljs-built_in">self</span>.tableData removeObject:<span class="hljs-built_in">self</span>.InMobiNativeAd];
[<span class="hljs-built_in">self</span>.tableView reloadData];
<span class="hljs-built_in">self</span>.InMobiNativeAd = [[IMNative alloc] initWithPlacementId:];
<span class="hljs-built_in">self</span>.InMobiNativeAd.delegate = <span class="hljs-built_in">self</span>;
[<span class="hljs-built_in">self</span>.InMobiNativeAd load];
}
<span class="hljs-comment">//Suggested approach</span>
<span class="hljs-comment">//Use `override func prepareForReuse()` in UItableViewCell to clear out any ad before loading</span>
<span class="hljs-comment">// any new Ad.</span>
<span class="hljs-function">func <span class="hljs-title">refreshInMobiStrandAd</span>()</span> {
tableData = tableData?.filter({ (obj) -> Bool <span class="hljs-keyword">in</span>
<span class="hljs-keyword">if</span> obj <span class="hljs-keyword">is</span> IMNative {
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>
}
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>
})
tableView.reloadData()
inMobiNativeAd = IMNative(placementId: )
inMobiNativeAd?.<span class="hljs-built_in">delegate</span> = self
inMobiNativeAd?.load()
}
务必IMNative先从您的设置中移除该对象tableData并销毁当前的广告对象。然后,您需要创建一个新对象并调用其加载方法。
autolayout处理单元格和视图上的所有屏幕方向改变。广告将响应自动布局更改。你应该在类的方法中将InMobiNativeAd对象及其委托设置为 nil 。deallocViewController
-(<span class="hljs-type">void</span>)dealloc {
<span class="hljs-keyword">self</span>.InMobiNativeAd.delegate = <span class="hljs-literal">nil</span>;
<span class="hljs-keyword">self</span>.InMobiNativeAd = <span class="hljs-literal">nil</span>;
}
<span class="hljs-keyword">deinit</span> {
inMobiNativeAd<span class="hljs-operator">?</span>.delegate <span class="hljs-operator">=</span> <span class="hljs-literal">nil</span>
inMobiNativeAd <span class="hljs-operator">=</span> <span class="hljs-literal">nil</span>
}
IMNative。self.InMobiNativeAd.isReady函数来判断广告是否可以展示。有时,您的主线程可能被占用,因此您可能无法nativeDidFinishLoading及时收到通知。所以,最好在截止时间过后主动检查广告是否已准备就绪。重要提示:如果广告的第二个屏幕正在显示,则不应关闭该广告。您可以在代码中进行检查nativeWillPresentScreen,并在触发此委托时阻止广告关闭。示例实现如下:
<span class="hljs-keyword">@property</span>(<span class="hljs-keyword">nonatomic</span>,<span class="hljs-keyword">strong</span>) <span class="hljs-type">bool</span> *isSecondScreenDisplayed;<span class="hljs-comment">// Use this to check if second screen has to be shown or not</span>
-(<span class="hljs-type">void</span>)nativeWillPresentScreen:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(<span class="hljs-string">@"Native Ad will present screen"</span>);
isSecondScreenDisplayed = <span class="hljs-literal">YES</span>;
}
<span class="hljs-keyword">var</span> isSecondScreenDisplayed: <span class="hljs-type">Bool</span> <span class="hljs-operator">=</span> <span class="hljs-literal">false</span><span class="hljs-comment">// Use this to check if second screen has to be shown or not</span>
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeWillPresentScreen</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad will present screen"</span>)
isSecondScreenDisplayed <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>
}
你应该将InMobiNativeAd对象及其委托设置为 nil。
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">strong</span>) <span class="hljs-built_in">UIView</span>* SplashAdView; <span class="hljs-comment">// Use this view to check for visibility of splash screen</span>
-(<span class="hljs-type">void</span>)dismissAd{
<span class="hljs-keyword">if</span>(isSecondScreenDisplayed){
<span class="hljs-built_in">NSLog</span>(<span class="hljs-string">@"DO NOT DISMISS THE AD WHILE THE SCREEN IS BEING DISPLAYED"</span>);
}
<span class="hljs-keyword">else</span>{
<span class="hljs-keyword">self</span>.SplashAdView.hidden = <span class="hljs-literal">true</span>;
<span class="hljs-keyword">self</span>.InMobiNativeAd = <span class="hljs-literal">nil</span>;
}
}
<span class="hljs-keyword">var</span> splashAdView: <span class="hljs-type">UIView</span>? <span class="hljs-comment">// Use this to check visibility of second screen</span>
<span class="hljs-keyword">func</span> <span class="hljs-title function_">dismissAd</span>() {
<span class="hljs-keyword">if</span> isSecondScreenDisplayed {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"DO NOT DISMISS THE AD WHILE THE SCREEN IS BEING DISPLAYED"</span>)
}
<span class="hljs-keyword">else</span> {
splashAdView<span class="hljs-operator">?</span>.isHidden <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>
inMobiNativeAd <span class="hljs-operator">=</span> <span class="hljs-literal">nil</span>
}
}
可以使用同一个类来实现前置视频广告体验IMNative。您需要在以下代理中关闭广告展示:
<span class="hljs-built_in">-</span>(void)nativeDidFinishPlayingMedia:(IMNative *)native{
<span class="hljs-selector-attr">[self dismissAd]</span>;
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeDidFinishPlayingMedia</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-keyword">self</span>.dismissAd()
}
你应该将InMobiNativeAd对象及其委托设置为 nil。
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">strong</span>) <span class="hljs-built_in">UIView</span>* PrerollAdView; <span class="hljs-comment">//Use this to store the primaryView returned by the IMNative instance.</span>
-(<span class="hljs-type">void</span>)dismissAd{
<span class="hljs-keyword">self</span>.PrerollAdView.hidden = <span class="hljs-literal">true</span>;
<span class="hljs-keyword">self</span>.InMobiNativeAd = <span class="hljs-literal">nil</span>;
}
<span class="hljs-keyword">var</span> prerollAdView: <span class="hljs-type">UIView</span>? <span class="hljs-comment">// Use this to store the primaryView returned by the IMNative instance.</span>
<span class="hljs-keyword">func</span> <span class="hljs-title function_">dismissAd</span>() {
prerollAdView<span class="hljs-operator">?</span>.isHidden <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>
inMobiNativeAd <span class="hljs-operator">=</span> <span class="hljs-literal">nil</span>
}
您可以通过以下步骤获取额外的回调。请在您的ViewController.m文件中实现以下委托方法:
<span class="hljs-built_in">-</span>(void)nativeDidFinishLoading:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"Native Ad load Successful"); <span class="hljs-comment">// Ad is ready to be displayed</span>
}
<span class="hljs-built_in">-</span>(void)native:(IMNative*)native didFailToLoadWithError:(IMRequestStatus*)error{
<span class="hljs-built_in">NSLog</span>(@"Native Ad load Failed"); <span class="hljs-comment">// No Fill or error</span>
}
<span class="hljs-built_in">-</span>(void)nativeWillPresentScreen:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"Native Ad will present screen"); <span class="hljs-comment">//Full Screen experience is about to be presented</span>
}
<span class="hljs-built_in">-</span>(void)nativeDidPresentScreen:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"Native Ad did present screen"); <span class="hljs-comment">//Full Screen experience has been presented</span>
}
<span class="hljs-built_in">-</span>(void)nativeWillDismissScreen:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"Native Ad will dismiss screen"); <span class="hljs-comment">//Full Screen experience is going to be dismissed</span>
}
<span class="hljs-built_in">-</span>(void)nativeDidDismissScreen:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"Native Ad did dismiss screen"); <span class="hljs-comment">//Full Screen experience has been dismissed</span>
}
<span class="hljs-built_in">-</span>(void)userWillLeaveApplicationFromNative:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"User leave"); <span class="hljs-comment">//User is about to leave the app on clicking the ad</span>
}
<span class="hljs-built_in">-</span>(void)native:(IMNative *)native didInteractWithParams:(NSDictionary *)params{
<span class="hljs-built_in">NSLog</span>(@"User clicked"); <span class="hljs-comment">// Called when the user clicks on the ad.</span>
}
<span class="hljs-built_in">-</span>(void)nativeAdImpressed:(IMNative *)native{
<span class="hljs-built_in">NSLog</span>(@"User viewed the ad"); <span class="hljs-comment">// Called when impression event is fired.</span>
}
<span class="hljs-built_in">-</span>(void)nativeDidFinishPlayingMedia:(IMNative*)native{
<span class="hljs-built_in">NSLog</span>(@"The Video has finished playing"); <span class="hljs-comment">// Called when the video has finished playing. Used for preroll use-case</span>
}
<span class="hljs-built_in">-</span>(void)native:(IMNative*)native adAudioStateChanged:(BOOL)audioStateMuted {
if (audioStateMuted) {
<span class="hljs-built_in">NSLog</span>(@"Inline video-ad audio state changed to mute");
}
else {
<span class="hljs-built_in">NSLog</span>(@"Inline video-ad audio state changed to unmute");
}
<span class="hljs-comment">//This is called when inline video audio state changes.</span>
}
<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>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad load Successful"</span>) <span class="hljs-comment">// Ad is ready to be displayed</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-keyword">_</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>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad load Failed"</span>) <span class="hljs-comment">// No Fill or error</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeWillPresentScreen</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad will present screen"</span>) <span class="hljs-comment">//Full Screen experience is about to be presented</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeDidPresentScreen</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad did present screen"</span>) <span class="hljs-comment">//Full Screen experience has been presented</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeWillDismissScreen</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad will dismiss screen"</span>) <span class="hljs-comment">//Full Screen experience is going to be dismissed</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeDidDismissScreen</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Native Ad did dismiss screen"</span>) <span class="hljs-comment">//Full Screen experience has been dismissed</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">userWillLeaveApplicationFromNative</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"User leave"</span>) <span class="hljs-comment">//User is about to leave the app on clicking the ad</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-keyword">_</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>]<span class="hljs-operator">?</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"User clicked"</span>) <span class="hljs-comment">// Called when the user clicks on the ad.</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeAdImpressed</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"User viewed the ad"</span>) <span class="hljs-comment">// Called when impression event is fired.</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">nativeDidFinishPlayingMedia</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"The Video has finished playing"</span>) <span class="hljs-comment">// Called when the video has finished playing. Used for preroll use-case</span>
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">native</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">native</span>: <span class="hljs-type">IMNative</span>, <span class="hljs-params">adAudioStateChanged</span> <span class="hljs-params">audioStateMuted</span>: <span class="hljs-type">Bool</span>) {
<span class="hljs-keyword">if</span> (audioStateMuted) {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Inline state changed to mute"</span>)
}
<span class="hljs-keyword">else</span> {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Inline state changed to unmute"</span>)
}
}
InMobi 的 SDK 可以同时在您的原生广告位上投放 HTML 和原生广告单元。您可以根据为原生广告位预留的空间大小,投放以下几种广告尺寸。
要启用此功能,您需要联系相应的合作伙伴经理,并告知所需的填充大小。此外,您还需要在代码中按如下方式进行处理:
- (<span class="hljs-built_in">UITableViewCell</span> *)tableView:(<span class="hljs-built_in">UITableView</span> *)tableView cellForRowAtIndexPath:(<span class="hljs-built_in">NSIndexPath</span> *)indexPath {
InFeedTableCell *cell = (InFeedTableCell *)[tableView
dequeueReusableCellWithIdentifier:<span class="hljs-string">@"InFeedTableCell"</span>];
<span class="hljs-built_in">NSArray</span> *nib = [[<span class="hljs-built_in">NSBundle</span> mainBundle] loadNibNamed:<span class="hljs-string">@"InFeedTableCell"</span>
owner:<span class="hljs-keyword">self</span> options:<span class="hljs-literal">nil</span>];
cell = [nib objectAtIndex:<span class="hljs-number">0</span>];
<span class="hljs-type">id</span> slide = [<span class="hljs-keyword">self</span>.tableData objectAtIndex:indexPath.row];
<span class="hljs-keyword">if</span> ([<span class="hljs-keyword">self</span> isAdAtIndexPath:indexPath]) {
IMNative *currentNativeAd = slide;
<span class="hljs-built_in">NSString</span> *customJSONstring = currentNativeAd.customAdContent;
<span class="hljs-built_in">NSData</span> *data = [customJSONstring dataUsingEncoding:<span class="hljs-built_in">NSUTF8StringEncoding</span>];
<span class="hljs-built_in">NSDictionary</span> *jsonDict = [<span class="hljs-built_in">NSJSONSerialization</span> JSONObjectWithData:data options:<span class="hljs-number">0</span> error:<span class="hljs-literal">nil</span>];
<span class="hljs-type">BOOL</span> isBackFillBanner = [[jsonDict objectForKey:<span class="hljs-string">@"isHTMLResponse"</span>] boolValue];
<span class="hljs-keyword">if</span> (isBackFillBanner) {
IMNative * currentNativeAd = slide;
<span class="hljs-comment">//Depending on the selected backfill size, provide accurate width below</span>
<span class="hljs-built_in">UIView</span>* AdPrimaryViewOfCorrectWidth = [currentNativeAd primaryViewOfWidth:<span class="hljs-number">250</span>];
AdPrimaryViewOfCorrectWidth.frame = <span class="hljs-built_in">CGRectMake</span>((_screenWidth<span class="hljs-number">-300</span>)/<span class="hljs-number">2</span>, <span class="hljs-number">0</span>, <span class="hljs-number">300</span>, <span class="hljs-number">250</span>);
[cell addSubview:AdPrimaryViewOfCorrectWidth];
}
<span class="hljs-keyword">else</span>
{
<span class="hljs-comment">//continue with the current native implementation</span>
IMNative * currentNativeAd = slide;
cell.iconImageView.image = currentNativeAd.adIcon;
cell.titleLabel.text = currentNativeAd.adTitle;
cell.subTitleLabel.text = <span class="hljs-string">@"Sponsored"</span>;
cell.descriptionLabel.text = currentNativeAd.adDescription;
cell.ctaLabel.text = currentNativeAd.adCtaText;
<span class="hljs-comment">//Calculate your feed's primaryImageViewWidth and use it to fetch and Ad Primary view of same width.</span>
<span class="hljs-built_in">UIView</span>* AdPrimaryViewOfCorrectWidth = [currentNativeAd primaryViewOfWidth:primaryImageViewWidth];
<span class="hljs-comment">//Set the frame of Ad Primary View same as that of your feed's Primary View</span>
AdPrimaryViewOfCorrectWidth.frame = primaryImageViewFrame;
[cell addSubview:AdPrimaryViewOfCorrectWidth];
<span class="hljs-built_in">UITapGestureRecognizer</span> *singleTapAndOpenLandingPage =
[[<span class="hljs-built_in">UITapGestureRecognizer</span> alloc] initWithTarget:currentNativeAd
action:<span class="hljs-keyword">@selector</span>(reportAdClickAndOpenLandingPage)];
cell.ctaLabel.userInteractionEnabled = <span class="hljs-literal">YES</span>;
[cell.ctaLabel addGestureRecognizer:singleTapAndOpenLandingPage];
}
}
<span class="hljs-keyword">else</span> {
<span class="hljs-comment">//Your App’s TableCell implementation</span>
}
<span class="hljs-keyword">return</span> cell;
}
<span class="hljs-keyword">func</span> <span class="hljs-title function_">tableView</span>(<span class="hljs-keyword">_</span> <span class="hljs-params">tableView</span>: <span class="hljs-type">UITableView</span>, <span class="hljs-params">cellForRowAt</span> <span class="hljs-params">indexPath</span>: <span class="hljs-type">IndexPath</span>) -> <span class="hljs-type">UITableViewCell</span> {
<span class="hljs-keyword">let</span> cell <span class="hljs-operator">=</span> (tableView.dequeueReusableCell(withIdentifier: <span class="hljs-string">"InFeedTableCell"</span>)<span class="hljs-operator">!</span> <span class="hljs-keyword">as!</span> <span class="hljs-type">InFeedTableViewCell</span>)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> currentNativeAd <span class="hljs-operator">=</span> <span class="hljs-keyword">self</span>.tableData<span class="hljs-operator">?</span>[indexPath.row] <span class="hljs-keyword">as?</span> <span class="hljs-type">IMNative</span> {
<span class="hljs-keyword">let</span> customJSONstring <span class="hljs-operator">=</span> currentNativeAd.customAdContent
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> data <span class="hljs-operator">=</span> customJSONstring<span class="hljs-operator">?</span>.data(using: .utf8) {
<span class="hljs-keyword">do</span> {
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> json <span class="hljs-operator">=</span> <span class="hljs-keyword">try</span> <span class="hljs-type">JSONSerialization</span>.jsonObject(with: data, options: []) <span class="hljs-keyword">as?</span> [<span class="hljs-type">String</span>: <span class="hljs-keyword">Any</span>] {
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> isBackFillBanner <span class="hljs-operator">=</span> json[<span class="hljs-string">"isHTMLResponse"</span>] <span class="hljs-keyword">as?</span> <span class="hljs-type">Bool</span>, isBackFillBanner {
<span class="hljs-comment">//Depending on the selected backfill size, provide accurate width below</span>
<span class="hljs-keyword">let</span> adPrimaryViewOfCorrectWidth: <span class="hljs-type">UIView</span> <span class="hljs-operator">=</span> currentNativeAd.primaryView(ofWidth: <span class="hljs-number">250</span>)
adPrimaryViewOfCorrectWidth.frame <span class="hljs-operator">=</span> <span class="hljs-type">CGRect</span>(x: (_screenWidth<span class="hljs-operator">-</span><span class="hljs-number">300</span>)<span class="hljs-operator">/</span><span class="hljs-number">2</span>, y: <span class="hljs-number">0</span>, width: <span class="hljs-number">300</span>, height: <span class="hljs-number">250</span>)
cell.addSubview(adPrimaryViewOfCorrectWidth)
} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">//continue with the current native implementation</span>
cell.iconImageView.image <span class="hljs-operator">=</span> currentNativeAd.adIcon
cell.titleLabel.text <span class="hljs-operator">=</span> currentNativeAd.adTitle
cell.subtitleLabel.text <span class="hljs-operator">=</span> <span class="hljs-string">"Sponsored"</span>
cell.descriptionLabel.text <span class="hljs-operator">=</span> currentNativeAd.description
cell.ctaLabel<span class="hljs-operator">?</span>.text <span class="hljs-operator">=</span> currentNativeAd.adCtaText
<span class="hljs-comment">//Calculate your feed's primaryImageViewWidth and use it to fetch and Ad Primary view of same width.</span>
<span class="hljs-keyword">let</span> adPrimaryViewOfCorrectWidth: <span class="hljs-type">UIView</span> <span class="hljs-operator">=</span> currentNativeAd.primaryView(ofWidth: primaryImageViewWidth)
<span class="hljs-comment">//Set the frame of Ad Primary View same as that of your feed's Primary View</span>
<span class="hljs-keyword">let</span> singleTapAndOpenLandingPage <span class="hljs-operator">=</span> <span class="hljs-type">UITapGestureRecognizer</span>(target:currentNativeAd, action: <span class="hljs-keyword">#selector</span>(<span class="hljs-keyword">self</span>.reportAdClickAndOpenLandingPage))
cell.ctaLabel<span class="hljs-operator">?</span>.isUserInteractionEnabled <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>
cell.ctaLabel<span class="hljs-operator">?</span>.addGestureRecognizer(singleTapAndOpenLandingPage)
}
}
} <span class="hljs-keyword">catch</span> <span class="hljs-keyword">let</span> error <span class="hljs-keyword">as</span> <span class="hljs-type">NSError</span> {
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Failed to load: <span class="hljs-subst">\(error.localizedDescription)</span>"</span>)
}
}
}
<span class="hljs-keyword">return</span> cell }
isHTMLResponse。By installing this SDK update, you agree that your Children Privacy Compliance setting remains accurate or that you will update that setting, whenever there is a change in your app's audience. You may update the app's Children Privacy Compliance settings at https://publisher.inmobi.com/my-inventory/app-and-placements.
Support Center