SDK说明


原生广告

<h1>原生广告(模版\自渲染\draw)<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A-%E6%A8%A1%E7%89%88-%E8%87%AA%E6%B8%B2%E6%9F%93-draw">​</a></h1> <p>&gt; 原生广告分为自渲染广告和模板广告,但是模板广告只有当三方SDK支持时才会返回模板广告。SDK 提供信息流广告的数据绑定、点击事件的上报</p> <ul> <li>自渲染广告:聚合SDK返回物料,由开发者在返回的WindMillNativeAdView类型的view上进行子视图的自行渲染和展示。</li> <li>模板广告:聚合SDK直接返回渲染好的广告WindMillNativeAdView,开发者直接展示即可。</li> </ul> <h2>1. 原生广告管理类WindMillNativeAdsManager<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_1-%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A%E7%AE%A1%E7%90%86%E7%B1%BBwindmillnativeadsmanager">​</a></h2> <p>在SDK里只需要使用 WindMillNativeAdsManager 就可以获取信息流广告。WindMillNativeAdsManager支持多广告加载,可以一次加载返回多个广告。</p> <p>&gt; <strong>注意:adSize高度为0时,模版渲染render success后自动更新到合适的高度</strong></p> <p>objective-c</p> <pre><code>@interface WindMillNativeAdsManager : NSObject @property (nonatomic, weak) id&amp;lt;WindMillNativeAdsManagerDelegate&amp;gt; delegate; @property (nonatomic, strong, readonly) NSString *placementId; /* * 必传参数,为空时聚合会默认设置为width=screen.bouces.size.width; height=0 * 穿山甲 height: 0自适应 * 腾讯:height会在render success后自动更新到合适的高度 */ @property (nonatomic, assign, readwrite) CGSize adSize; - (instancetype)initWithRequest:(WindMillAdRequest *)request; /** It is recommended to request no more than 3 ads. */ - (void)loadAdDataWithCount:(NSInteger)count; /** Get all ads when call methord: nativeAdsManagerSuccessToLoad */ - (NSArray&amp;lt;WindMillNativeAd *&amp;gt; *)getAllNativeAds; @end</code></pre> <h2>2. 原生广告类WindMillNativeAdView<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_2-%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A%E7%B1%BBwindmillnativeadview">​</a></h2> <p>WindMillNativeAdView:为请求原生广告返回的广告模型后,创建WindMillNativeAdView后,使用refreshData:渲染</p> <ul> <li>自渲染广告(feedADMode != WindMillFeedADModeNativeExpress) 开发者根据WindMillNativeAdView提供的组件和WindMillNativeAd提供的物料信息对WindMillNativeAdView进行布局。</li> <li>模板广告(feedADMode = WindMillFeedADModeNativeExpress) 开发者可直接将ABUNativeAdView添加到父视图上进行展示。</li> </ul> <p><strong>注意:目前布局方式支持:frame布局方式 和 自动布局方式</strong></p> <p>objective-c</p> <pre><code>@interface WindMillNativeAdView : UIView /// 广告数据对象 @property (nonatomic, strong, readonly) WindMillNativeAd *nativeAd; /// 当前播放广告的广告信息 @property (nonatomic, strong, readonly) WindMillAdInfo *adInfo; /// 广告代理对象 @property (nonatomic, weak) id&amp;lt;WindMillNativeAdViewDelegate&amp;gt; delegate; /// 广告点击弹出新页面所依赖的ViewController @property (nonatomic, weak) UIViewController *viewController; /// 视频组件 @property (nonatomic, strong, readonly) UIView *mediaView; /// 广告平台logo组件 @property (nonatomic, strong, readonly) UIView *logoView; /// dislike组件 @property (nonatomic, strong, readonly) UIButton *dislikeButton; /// 单图广告对应的图片组件 @property (nonatomic, strong, readonly) UIImageView *mainImageView; /// 摇一摇组件 [Optional] [仅支持百度] /// 因为是懒加载方式,需要在refreshData之后确认渲染渠道后才会创建对应的摇一摇组件 /// 组件高度需要大于80pt。摇一摇文案内容为:摇动手机 了解更多 如果组件宽度不够,则会自动将宽度适配文字长度。 @property (nonatomic, strong, readonly) WindMillNativeAdShakeView *shakeView; /// 3图广告时对应的ImageView组件list @property (nonatomic, strong, readonly) NSArray&amp;lt;UIImageView *&amp;gt; *imageViewList; /// 刷新广告数据 /// @param nativeAd 广告模型数据 /// @warning 每次获取物料信息后需要刷新调用refreshData:方法 - (void)refreshData:(WindMillNativeAd *)nativeAd; /** 刷新media视图frame,百度渠道 */ - (void)mediaViewResize; /** 设置media视图frame,需要在refreshData之后调用,美数渠道 */ - (void)setMediaViewSize:(CGSize)size; /// 绑定点击的View /// @param clickableViews 需要注册点击View的集合 - (void)setClickableViews:(NSArray&amp;lt;UIView *&amp;gt; *)clickableViews; /// 设置占位图 /// @param placeholderImage 占位图UIImage * - (void)setPlaceholderImage:(UIImage *)placeholderImage; /// 注销数据对象 /// @warning 在 tableView、collectionView 等场景需要复用 WindNativeAdView 时,需要在合适的时机,例如 cell 的 prepareForReuse 方法内执行 unregisterDataObject 方法,将广告对象与 WindNativeAdView 解绑 - (void)unregisterDataObject; @end</code></pre> <h2>3. 自渲染广告物料信息<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_3-%E8%87%AA%E6%B8%B2%E6%9F%93%E5%B9%BF%E5%91%8A%E7%89%A9%E6%96%99%E4%BF%A1%E6%81%AF">​</a></h2> <ol> <li>在物料加载成功方法里获取相关广告信息赋值后,需调用 <code>setClickableViews</code>注册绑定点击的View并刷新数据源refreshData:。</li> <li> <p>每次获取物料信息后需要刷新调用<code>refreshData:</code>方法</p> <p>@interface WindMillNativeAd : NSObject</p> <p>/// Typed access to the ad title. @property (nonatomic, copy, readonly) NSString *title;</p> <p>/// Typed access to the body text, usually a longer description of the ad. @property (nonatomic, copy, readonly) NSString *desc;</p> <p>/// Typed access to the ad icon. @property (nonatomic, copy, readonly) NSString *iconUrl;</p> <p>/// 图片URL列表 【Optional,可能位nil】 /// 大图:列表中只有一个URL /// 三图:列表中有3个URL @property (nonatomic, strong) NSArray *imageUrlList;</p> <p>/// 渠道ID @property (nonatomic, assign) WindMillAdn networkId;</p> <p>/// Typed access to the call to action phrase of the ad. @property (nonatomic, copy, readonly) NSString *callToAction;</p> <p>/// Typed access to the ad star rating. @property (nonatomic, assign, readonly) double rating;</p> <p>/// WindMillFeedADModeNativeExpress为模版渲染,此时其它属性都为nil @property (nonatomic, assign, readonly) WindMillFeedADMode feedADMode;</p> <p>@end</p> </li> </ol> <h2>4. 回调监听<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_4-%E5%9B%9E%E8%B0%83%E7%9B%91%E5%90%AC">​</a></h2> <h3>4.1 WindMillNativeAdsManagerDelegate<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_4-1-windmillnativeadsmanagerdelegate">​</a></h3> <table> <thead> <tr> <th>回调</th> <th>含义</th> <th>使用场景</th> </tr> </thead> <tbody> <tr> <td>nativeAdsManagerSuccessToLoad:</td> <td>广告加载成功</td> <td>当次加载成功标识/自渲染可展示条件/加载数据统计</td> </tr> <tr> <td>nativeAdsManager: didFailWithError</td> <td>广告加载失败</td> <td>重新加载条件/加载数据统计/问题排查</td> </tr> </tbody> </table> <p>objective-c</p> <pre><code>@protocol WindMillNativeAdsManagerDelegate &amp;lt;NSObject&amp;gt; @optional - (void)nativeAdsManagerSuccessToLoad:(WindMillNativeAdsManager *)adsManager; - (void)nativeAdsManager:(WindMillNativeAdsManager *)adsManager didFailWithError:(NSError *)error; @end</code></pre> <h3>4.2 WindMillNativeAdViewDelegate<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_4-2-windmillnativeadviewdelegate">​</a></h3> <table> <thead> <tr> <th>回调</th> <th>含义</th> <th>使用场景</th> </tr> </thead> <tbody> <tr> <td>nativeExpressAdViewRenderSuccess:</td> <td>模版广告渲染成功</td> <td>原生模板广告渲染成功, 此时的 nativeExpressAdView.size.height 根据 size.width 完成了动态更新</td> </tr> <tr> <td>(只针对模版渲染)</td> </tr> <tr> <td>nativeExpressAdViewRenderFail: error:</td> <td>生模板广告渲染失败</td> <td>原生模板广告渲染失败</td> </tr> <tr> <td>(只针对模版渲染)</td> </tr> <tr> <td>nativeAdViewWillExpose:</td> <td>广告曝光回调</td> <td>展示数据统计</td> </tr> <tr> <td>nativeAdViewDidClick:</td> <td>广告点击回调</td> <td>点击数据统计</td> </tr> <tr> <td>nativeAdDetailViewClosed:</td> <td>广告详情页关闭回调</td> <td>数据统计</td> </tr> <tr> <td>nativeAdDetailViewWillPresentScreen:</td> <td>广告详情页面即将展示回调</td> <td>数据统计</td> </tr> <tr> <td>nativeAdView: playerStatusChanged:</td> <td>视频广告播放状态更改回调</td> <td>数据统计</td> </tr> <tr> <td>nativeAdView: dislikeWithReason</td> <td>点击dislike回调</td> </tr> <tr> <td>开发者需要在这个回调中移除视图,否则,会出现用户点击叉无效的情况</td> <td>用户点击关闭广告/广告视图移除/数据统计</td> </tr> </tbody> </table> <p>objective-c</p> <pre><code>@protocol WindMillNativeAdViewDelegate &amp;lt;NSObject&amp;gt; @optional /** * 原生模板广告渲染成功, 此时的 nativeExpressAdView.size.height 根据 size.width 完成了动态更新。 * (只针对模版渲染) */ - (void)nativeExpressAdViewRenderSuccess:(WindMillNativeAdView *)nativeExpressAdView; /** * 原生模板广告渲染失败 * (只针对模版渲染) */ - (void)nativeExpressAdViewRenderFail:(WindMillNativeAdView *)nativeExpressAdView error:(NSError *)error; /** 广告曝光回调 @param nativeAdView WindMillNativeAdView 实例 */ - (void)nativeAdViewWillExpose:(WindMillNativeAdView *)nativeAdView; /** 广告点击回调 @param nativeAdView WindMillNativeAdView 实例 */ - (void)nativeAdViewDidClick:(WindMillNativeAdView *)nativeAdView; /** 广告详情页关闭回调 @param nativeAdView WindMillNativeAdView 实例 */ - (void)nativeAdDetailViewClosed:(WindMillNativeAdView *)nativeAdView; /** 广告详情页面即将展示回调 @param nativeAdView WindMillNativeAdView 实例 */ - (void)nativeAdDetailViewWillPresentScreen:(WindMillNativeAdView *)nativeAdView; /** 视频广告播放状态更改回调 @param nativeAdView WindMillNativeAdView 实例 @param status 视频广告播放状态 @param userInfo 视频广告信息 */ - (void)nativeAdView:(WindMillNativeAdView *)nativeAdView playerStatusChanged:(WindMillMediaPlayerStatus)status userInfo:(NSDictionary *)userInfo; /** 点击dislike回调 开发者需要在这个回调中移除视图,否则,会出现用户点击叉无效的情况 @param filterWords : 选择不喜欢的原因 */ - (void)nativeAdView:(WindMillNativeAdView *)nativeAdView dislikeWithReason:(NSArray&amp;lt;WindDislikeWords *&amp;gt; *)filterWords; @end</code></pre> <h2>5. 自渲染广告示例<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_5-%E8%87%AA%E6%B8%B2%E6%9F%93%E5%B9%BF%E5%91%8A%E7%A4%BA%E4%BE%8B">​</a></h2> <p>广告加载和自渲染物料的获取:</p> <p>objective-c</p> <pre><code>// 广告加载 - (void)loadNativeAds { WindMillAdRequest *request = [WindMillAdRequest request]; request.placementId = @&amp;quot;&amp;quot;; request.userId = @&amp;quot;user_id&amp;quot; //nativeAdManager全局对象,每个广告位ID创建一个实例 if (self.nativeAdManager == nil) { self.nativeAdManager = [[WindMillNativeAdsManager alloc] initWithRequest:request]; } self.nativeAdManager.delegate = self; self.nativeAdManager.adSize = CGSizeMake(320, 0); [self.nativeAdManager loadAdDataWithCount:1]; }</code></pre> <p>配套Demo主要使用refreshUIWithModel: 方法来进行具体的渲染布局:</p> <p>objective-c</p> <pre><code>- (void)refreshUIWithModel:(WindMillNativeAd *)model { WindMillNativeAdView *adView = [WindMillNativeAdView new]; adView.delegate = self; [adView refreshData:nativeAd]; adView.viewController = self; [self.view addSubView:adView]; self.adView = adView; [self renderAdWithLargeImg:model adView:adView]; } + (void)renderAdWithLargeImg:(WindMillNativeAd *)nativeAd adView:(NativeAdCustomView *)adView{ CGFloat width = CGRectGetWidth(UIScreen.mainScreen.bounds); CGFloat contentWidth = (width - 2 * margin); CGFloat imageHeight = 170; [adView.mainImageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(adView.mainImageView.superview).offset(padding.top); make.left.equalTo(adView.mainImageView.superview).offset(padding.left); make.right.equalTo(adView.mainImageView.superview).offset(-padding.right); make.height.mas_equalTo(imageHeight); }]; CGSize iconSize = CGSizeMake(60, 60); NSURL *iconUrl = [NSURL URLWithString:nativeAd.iconUrl]; adView.iconImageView.layer.masksToBounds = YES; adView.iconImageView.layer.cornerRadius = 10; [adView.iconImageView sd_setImageWithURL:iconUrl]; [adView.iconImageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(iconSize); make.top.equalTo(adView.mainImageView.mas_bottom).offset(10); make.left.equalTo(adView.iconImageView.superview).offset(padding.left); }]; NSAttributedString *attributedText = [FeedStyleHelper titleAttributeText:nativeAd.title]; adView.titleLabel.attributedText = attributedText; adView.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail; [adView.titleLabel mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(adView.iconImageView.mas_top).offset(0); make.left.equalTo(adView.iconImageView.mas_right).offset(padding.left); make.right.equalTo(adView.CTAButton.mas_left).offset(-padding.right); make.height.equalTo(@30); }]; [adView.CTAButton setTitle:nativeAd.callToAction forState:UIControlStateNormal]; [adView.CTAButton mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(adView.iconImageView.mas_top).offset(0); make.right.equalTo(adView.CTAButton.superview).offset(-padding.right); make.width.equalTo(@80); make.height.equalTo(@30); }]; NSAttributedString *attributedDescText = [FeedStyleHelper titleAttributeText:nativeAd.desc]; CGSize descSize = [attributedDescText boundingRectWithSize:CGSizeMake(contentWidth, 0) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:0].size; adView.descLabel.attributedText = attributedDescText; adView.descLabel.numberOfLines = 0; adView.descLabel.textColor = UIColor.blackColor; [adView.descLabel mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(adView.iconImageView.mas_bottom).offset(10); make.left.equalTo(adView.descLabel.superview).offset(padding.left); make.right.equalTo(adView.descLabel.superview).offset(-padding.right); make.height.equalTo(@(descSize.height)); }]; [adView.dislikeButton mas_remakeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(adView).offset(-10); make.right.equalTo(adView).offset(-10); make.width.mas_equalTo(15); make.height.mas_equalTo(15); }]; UIView *logoView = (UIView *)adView.logoView; [logoView mas_remakeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(logoView.superview).offset(-10); make.left.equalTo(logoView.superview).offset(10); make.width.equalTo(@(70)); make.height.equalTo(@(20)); }]; [adView mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.left.bottom.right.equalTo(adView.superview).offset(0); make.width.mas_equalTo(UIScreen.mainScreen.bounds.size.width); make.height.mas_equalTo(imageHeight + descSize.height + iconSize.height + 80); }]; [adView setClickableViews:@[adView.CTAButton, adView.mainImageView, adView.iconImageView]]; }</code></pre> <p>&gt; <strong>注意:Demo针对大图渲染示例,需要注意的是视频类型的渲染需要使用mediaView</strong></p> <h2>6 广告预加载注意事项<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_6-%E5%B9%BF%E5%91%8A%E9%A2%84%E5%8A%A0%E8%BD%BD%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">​</a></h2> <ul> <li>需要在变现平台开启预加载功能</li> <li>当广告开始播放时,SDK会自动执行下一条广告加载逻辑,且自动加载广告的结果不会立即给开发者回调加载成功/加载失败的回调,开发者需要再次调用loadAdData接口,若自动加载的广告有填充,则该次加载会立即回调开发者广告加载成功回调。</li> <li>WindMillNativeAdsManager每个广告位ID创建一个实例对象,多个实例对象之间的预加载逻辑互不干扰。</li> </ul> <p>objective-c</p> <pre><code>WindMillAdRequest *request = [WindMillAdRequest request]; request.placementId = @&amp;quot;&amp;quot;; request.userId = @&amp;quot;user_id&amp;quot; //nativeAdManager全局对象,每个广告位ID创建一个实例 if (self.nativeAdManager == nil) { self.nativeAdManager = [[WindMillNativeAdsManager alloc] initWithRequest:request]; } self.nativeAdManager.delegate = self; self.nativeAdManager.adSize = CGSizeMake(320, 0); [self.nativeAdManager loadAdDataWithCount:1];</code></pre> <h2>7. 模板示例<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_7-%E6%A8%A1%E6%9D%BF%E7%A4%BA%E4%BE%8B">​</a></h2> <p>模板示例的加载和自渲染广告加载相同,不同的是在渲染上更简单,不需要关心标题、描述、icon、大图、视频等元素</p> <p>objective-c</p> <pre><code>- (void)refreshUIWithModel:(WindMillNativeAd *)model { WindMillNativeAdView *adView = [WindMillNativeAdView new]; adView.delegate = self;//在refreshData之前设置delegate [adView refreshData:nativeAd]; adView.viewController = self;//在refreshData之后设置viewController [self.view addSubView:adView]; self.adView = adView; [adView mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.left.bottom.equalTo(adView.superview).offset(0); make.width.mas_equalTo(adView.frame.size.width); make.height.mas_equalTo(adView.frame.size.height); }]; }</code></pre> <p>&gt; <strong>注意:模版渲染的广告在nativeExpressAdViewRenderSuccess回调后,adView.size.height会根据width自动调整到适合的值</strong></p> <h2>8. 特别说明<a href="https://doc.sigmob.com/ToBid%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/iOS/%E5%B9%BF%E5%91%8A%E7%B1%BB%E5%9E%8B/%E5%8E%9F%E7%94%9F%E5%B9%BF%E5%91%8A/#_8-%E7%89%B9%E5%88%AB%E8%AF%B4%E6%98%8E">​</a></h2> <p>加载广告时,模版渲染和自渲染统一使用WindMillNativeAdsManager加载广告,在广告加载成功回调中,可以通过getAllNativeAds获取所有可用广告模型,通过模型中的feedADMode区分是模版渲染还是非模版渲染。</p> <p>模版渲染布局相对简单,只需要最整个WindMillNativeAdView做布局即可</p> <p>模版渲染传入adSize的高度为0时,需要在渲染成功的回调调整view的高度</p> <p>自渲染需要最标题、描述、icon、视频/大图、cta按钮做自定义布局</p>

页面列表

ITEM_HTML