/ZJSDK

ZJSDK

Primary LanguageObjective-CMIT LicenseMIT

html print_background
embed_local_images embed_svg offline toc
false
true
false
true
true

ZJSDK_iOS使用文档 {ignore=true}

一、iOS SDK接入说明

1.1、工程设置导入framework

1.1.1、申请应用的AppID

请找运营人员获取应用ID和广告位ID。

1.1.2、引入framework

1. CocoaPods接入方式

#引入常用广告模块  
pod 'ZJSDK'
#常用广告模块(如需模块拆分引入,请引入ZJSDKModuleDSP)
pod 'ZJSDK/ZJSDKModuleDSP'
pod 'ZJSDK/ZJSDKModuleGDT'#优量汇广告
pod 'ZJSDK/ZJSDKModuleCSJ'#穿山甲广告
pod 'ZJSDK/ZJSDKModuleKS'#快手广告
pod 'ZJSDK/ZJSDKModuleMTG'#MTG广告
pod 'ZJSDK/ZJSDKModuleSIG'#Sigmob广告
pod 'ZJSDK/ZJSDKModuleSIG'#百度广告
#默认不引入的广告模块
pod 'ZJSDK/ZJSDKModuleYM'#云码广告 
pod 'ZJSDK/ZJSDKModuleGoogle'#Google广告 

2.手动方式

1.获取 framework 文件后直接将 {ZJSDK}文件拖入工程即可。

2.前往项目的Build Setting中的Enable Bitcode设置为NO

3.Build Settings中Other Linker Flags 增加参数-ObjC,字母o和c大写

4.升级SDK的同学必须同时更新framework和bundle文件,否则可能出现部分页面无法展示的问题,老版本升级的同学需要重新引入ZJSDK.framework,拖入完请确保Copy Bundle Resources中有BUAdSDK.bundle,ZJSDKBundle.bundle等否则可能出现icon图片加载不出来的情况。

添加依赖库

工程需要在TARGETS -> Build Phases中找到Link Binary With Libraries,点击“+”,依次添加下列依赖库

  • StoreKit.framework

  • MobileCoreServices.framework

  • WebKit.framework

  • MediaPlayer.framework

  • CoreMedia.framework

  • CoreLocation.framework

  • AVFoundation.framework

  • CoreTelephony.framework

  • SystemConfiguration.framework

  • AdSupport.framework

  • CoreMotion.framework

  • Accelerate.framework

  • libresolv.9.tbd

  • libc++.tbd

  • libz.tbd

  • libsqlite3.tbd

  • libbz2.tbd

  • libxml2.tbd

  • QuartzCore.framework

  • Security.framework

  • libc++abi.tbd

    如果以上依赖库增加完仍旧报错,请添加ImageIO.framework。

    SystemConfiguration.framework、CoreTelephony.framework、Security.framework是为了统计app信息使用

**3.注意事项: **

1.2、Xcode编译选项设置

1.2.1、添加权限

  • 工程plist文件设置,点击右边的information Property List后边的 "+" 展开

添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。 SDK API 已经全部支持HTTPS,但是广告主素材存在非HTTPS情况。

<key>NSAppTransportSecurity</key>
  <dict>
     <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>

1.2.2、运行环境配置

  • 支持系统 iOS 9.X 及以上;
  • 支持架构: x86-64, armv7, arm64,i386

1.2.3、位置权限

SDK 不会主动获取应用位置权限,当应用本身有获取位置权限逻辑时,需要在应用的 info.plist 添加相应配置信息,避免 App Store 审核被拒:

// 应用根据实际情况配置

  Privacy - Location When In Use Usage Description
  Privacy - Location Always and When In Use Usage Description
  Privacy - Location Always Usage Description
  Privacy - Location Usage Description

1.2.4、Swift接入准备

1: 新建桥接头文件(bridge.h,推荐放在工程目录下)。这里我们命名为:ZJAdSDKDemoSwift-Bridging-Header.h。在这个文件中import我们需要的所有头文件,代码如下:

#import <ZJSDK/ZJSDK.h>

2: 左侧目录中选中工程名,在 TARGETS->Build Settings-> Swift Compiler - Code Generation -> Objective-C Bridging Header 中输入桥接文件的路径

###1.3、iOS14注意事项

1.3.1、iOS 14.5及以上版本ATT权限申请

App Tracking Transparency(ATT) 框架向用户提出应用程序跟踪授权请求,并提供跟踪授权状态。自iOS14.5 开始,在应用程序调用 ATT 向用户提跟踪授权请求之前,IDFA 将不可用。如果应用未提出此请求,应用获取到的 IDFA 将为0,建议您在应用启动时调用,以便我们能够提供更精准的进行广告投放和收入优化。

  • 要获取 ATT 权限,请更新您的 Info.plist,添加 NSUserTrackingUsageDescription 字段和自定义文案描述。代码示例:
<key>NSUserTrackingUsageDescription</key>
<string>该标识符将用于向您投放个性化广告</string>
  • 向用户申请权限时,请调用 requestTrackingAuthorizationWithCompletionHandler:方法。我们建议您申请权限后再请求广告,以便广告能准确的获得用户授权状态。
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)requestIDFA {
  [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    // [self loadAd];
  }];
}

1.3.2、SKAdNetwork 接入

使用Apple的转化跟踪SKAdNetwork,这意味着即使IDFA不可用,也可以将应用安装归因。 1.在Xcode项目导航器中,选择Info.plist。 2.单击属性列表编辑器中任何键旁边的添加按钮(+),以创建一个新的属性键。 3.输入密钥名称SKAdNetworkItems。选择Array。 4.将SKAdNetworkId以字典的形式添加到数组中。

//将SKAdNetwork ID 添加到 info.plist 中,以保证 SKAdNetwork 的正确运行
//广点通
SKAdNetworkIdentifier : f7s53z58qe.skadnetwork
//快手
SKAdNetworkIdentifier : r3y5dwb26t.skadnetwork
//sigmob
SKAdNetworkIdentifier : 58922NB4GD.skadnetwork
//MTG
SKAdNetworkIdentifier : kbd757ywx3.skadnetwork
//穿山甲
SKAdNetworkIdentifier : 238da6jt44.skadnetwork
SKAdNetworkIdentifier : x2jnk7ly8j.skadnetwork
SKAdNetworkIdentifier : 22mmun2rn5.skadnetwork
//Google
SKAdNetworkIdentifier : cstr6suwn9.skadnetwork

info.plist代码示例

<key>SKAdNetworkItems</key>
<array>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>238da6jt44.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>x2jnk7ly8j.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>f7s53z58qe.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>58922NB4GD.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>kbd757ywx3.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>22mmun2rn5.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>r3y5dwb26t.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>cstr6suwn9.skadnetwork</string>
    </dict>
</array>

1.4、初始化SDK

Objective-C

开发者需要在AppDelegate#application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中调用以下代码来初始化sdk。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch.
  [ZJAdSDK registerAppId:@"zj_20201014iOSDEMO"];
  return YES;
}

Swift

开发者需要在AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool //方法中调用以下代码来初始化sdk。

ZJAdSDK.registerAppId("zj_20201014iOSDEMO");

二、加载广告

2.1、接入开屏广告(ZJSplashAd)

  • 类型说明: 开屏广告主要是 APP 启动时展示的全屏广告视图,开发只要按照接入标准就能够展示设计好的视图。

2.1.1、ZJSplashAd广告说明

@interface ZJSplashAd : ZJAd

@property(nonatomic,weak) id<ZJSplashAdDelegate> delegate;
/**
* 拉取广告超时时间,默认为3秒
* 详解:拉取广告超时时间,开发者调用loadAd方法以后会立即展示backgroundImage,然后在该超时时间内,如果广告拉取成功,则立马展示开屏广告,否则放弃此次广告展示机会。
*/
@property (nonatomic, assign) CGFloat fetchDelay;

/**
* 发起拉取广告请求,只拉取不展示
* 详解:广告素材及广告图片拉取成功后会回调splashAdDidLoad方法,当拉取失败时会回调splashAdFailToPresent方法
*/
- (void) loadAd;

/**
 *  展示广告,
  详解:广告展示成功时会回调zj_splashAdSuccessPresentScreen方法
 */
- (void)showAdInWindow:(UIWindow *)window;

/**
* 展示广告,调用此方法前需调用isAdValid方法判断广告素材是否有效
* 详解:广告展示成功时会回调splashAdSuccessPresentScreen方法,展示失败时会回调splashAdFailToPresent方法
*/
- (void)showAdInWindow:(UIWindow *)window withBottomView:(nullable UIView *)bottomView;

@end

2.1.2、ZJSplashAdDelegate

@protocol ZJSplashAdDelegate <NSObject>

@optional
/**
 *  开屏广告素材加载成功
 */
-(void)zj_splashAdDidLoad:(ZJSplashAd *)splashAd;

/**
 *  开屏广告成功展示
 */
-(void)zj_splashAdSuccessPresentScreen:(ZJSplashAd *)splashAd;

/**
 *  开屏广告点击回调
 */
- (void)zj_splashAdClicked:(ZJSplashAd *)splashAd;

/**
*  开屏广告即将关闭回调
*/
- (void)zj_splashAdWillClose:(ZJSplashAd *)splashAd;

/**
 *  开屏广告关闭回调
 */
- (void)zj_splashAdClosed:(ZJSplashAd *)splashAd;

/**
 *  应用进入后台时回调
 *  详解: 当点击下载应用时会调用系统程序打开,应用切换到后台
 */
- (void)zj_splashAdApplicationWillEnterBackground:(ZJSplashAd *)splashAd;

/**
 * 开屏广告倒记时结束
 */
- (void)zj_splashAdCountdownEnd:(ZJSplashAd*)splashAd;

/**
 *  开屏广告错误
 */
- (void)zj_splashAdError:(ZJSplashAd *)splashAd withError:(NSError *)error;

@end

2.1.3、加载开屏广告

Objective-C

self.splashAd = [[ZJSplashAd alloc] initWithPlacementId:@"c887417368"];
self.splashAd.delegate = self;
self.splashAd.fetchDelay = 5.0;
[self.splashAd loadAd];

Swift

splashAd = ZJSplashAd.init(placementId: "zjad_G9040714184494018");
splashAd.delegate = self;
splashAd.fetchDelay = 5.0;
splashAd.load(); 

加载开屏广告具体示例详见Demo中的AppDelegate/ZjSplashViewController

2.2、接入激励视频(ZJRewardVideoAd)

  • 类型说明: 激励视频广告是一种全新的广告形式,用户可选择观看视频广告以换取有价物,例如虚拟货币、应用内物品和独家内容等等;这类广告的长度为 15-30 秒,不可跳过,且广告的结束画面会显示结束页面,引导用户进行后续动作。userId尽量传真实的userId。

2.2.1、ZJRewardVideoAd广告说明

@interface ZJRewardVideoAd : ZJAd

@property(nonatomic,copy) NSString *userId; //userId尽量传真实的userId

@property(nonatomic,weak) id<ZJRewardVideoAdDelegate> delegate;

- (instancetype)initWithPlacementId:(NSString *)placementId userId:(NSString *)userId;

/**
*  发起拉取广告请求,只拉取不展示
*  详解:广告素材及广告图片拉取成功后会回调splashAdDidLoad方法,当拉取失败时会回调splashAdFailToPresent方法
*/
- (void) loadAd;

- (void) showAdInViewController:(UIViewController*)viewController;
@end

2.2.2、ZJRewardVideoAdDelegate广告说明

@protocol ZJRewardVideoAdDelegate <NSObject>

@optional
/**
广告数据加载成功回调
@param rewardedVideoAd ZJRewardVideoAd 实例
*/
- (void)zj_rewardVideoAdDidLoad:(ZJRewardVideoAd *)rewardedVideoAd;

/**
视频数据下载成功回调,已经下载过的视频会直接回调
@param rewardedVideoAd ZJRewardVideoAd 实例
*/
- (void)zj_rewardVideoAdVideoDidLoad:(ZJRewardVideoAd *)rewardedVideoAd;

/**
 视频广告展示
 @param rewardedVideoAd ZJRewardVideoAd 实例
 */
- (void)zj_rewardVideoAdDidShow:(ZJRewardVideoAd *)rewardedVideoAd;

/**
 视频播放页关闭
 @param rewardedVideoAd ZJRewardVideoAd 实例
 */
- (void)zj_rewardVideoAdDidClose:(ZJRewardVideoAd *)rewardedVideoAd;

/**
 视频广告信息点击
 @param rewardedVideoAd ZJRewardVideoAd 实例
 */
- (void)zj_rewardVideoAdDidClicked:(ZJRewardVideoAd *)rewardedVideoAd;

/**
 奖励触发
 @param rewardedVideoAd ZJRewardVideoAd 实例
 */
- (void)zj_rewardVideoAdDidRewardEffective:(ZJRewardVideoAd *)rewardedVideoAd;

/**
 视频广告视频播放完成
 @param rewardedVideoAd ZJRewardVideoAd 实例
 */
- (void)zj_rewardVideoAdDidPlayFinish:(ZJRewardVideoAd *)rewardedVideoAd;

/**
 视频广告各种错误信息回调
 @param rewardedVideoAd ZJRewardVideoAd 实例
 @param error 具体错误信息
 */
- (void)zj_rewardVideoAd:(ZJRewardVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error;
@end

2.2.3、加载激励视频

Objective-C

self.rewardVideoAd = [[ZJRewardVideoAd alloc] initWithPlacementId:@"KS90010001" userId:@"robin6666"];
self.rewardVideoAd.delegate = self;
[self.rewardVideoAd loadAd];

Swift

self.rewardVideoAd = ZJRewardVideoAd.init(placementId: adId as String, userId: "robin6666")
self.rewardVideoAd.delegate = self;
self.rewardVideoAd.load()

加载广告具体示例详见Demo中的ZjRewardViewController。

2.3、接入插屏广告(ZJInterstitialAd)

  • 类型说明: 插屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。

2.3.1、ZJInterstitialAd说明

@interface ZJInterstitialAd : ZJAd

@property(nonatomic,weak) id<ZJInterstitialAdDelegate> delegate;

//tips:方法- (instancetype)initWithPlacementId:(NSString *)placementId delegate:(id<ZJInterstitialAdDelegate>) delegate;已弃用,使用此方法替换,并单独设置delegate。
- (instancetype)initWithPlacementId:(NSString *)placementId;

-(void) loadAd;

-(void)presentAdFromRootViewController:(UIViewController*)  viewController;

@end

2.3.2、ZJInterstitialAdDelegate广告说明

@protocol ZJInterstitialAdDelegate <NSObject>
//广告数据加载成功回调
- (void) zj_interstitialAdDidLoad:(ZJInterstitialAd*) ad;
//广告数据加载失败回调
- (void) zj_interstitialAdDidLoadFail:(ZJInterstitialAd*) ad error:(NSError * __nullable)error;
//广告展示
- (void) zj_interstitialAdDidPresentScreen:(ZJInterstitialAd*) ad;
//广告点击
- (void) zj_interstitialAdDidClick:(ZJInterstitialAd*) ad;
//广告关闭
- (void) zj_interstitialAdDidClose:(ZJInterstitialAd*) ad;
//详情页关闭
- (void) zj_interstitialAdDetailDidClose:(ZJInterstitialAd*) ad;
//其他错误
- (void) zj_interstitialAdDidFail:(ZJInterstitialAd*) ad error:(NSError * __nullable)error;

@end

2.3.3、加载插屏广告

Objective-C

self.interstitialAd = [[ZJInterstitialAd alloc] initWithPlacementId:@"zjad_G10506"];
self.interstitialAd.delegate = self;
[self.interstitialAd loadAd];

Swift

interstitialAd = ZJInterstitialAd.init(placementId: adId as String);
interstitialAd.delegate = self;
interstitialAd.load();

加载广告具体示例详见Demo中的ZJInterstitialAdViewController。

2.4、接入全屏视频信息流(ZJFeedFullVideoView)

  • 类型说明:本SDK为接入方提供竖版视频信息流广告,该广告适合在竖版全屏视频流中使用,接入方可以控制视频暂停或继续播放,默认视频播放不可干预,视频广告相关配置可以在平台设置。 支持的广告尺寸: 全屏竖版。

2.4.1、ZJFeedFullVideoProvider,ZJFeedFullVideoView说明

@interface ZJFeedFullVideoProvider : ZJAd
//请求广告尺寸
@property(nonatomic,assign) CGSize adSize;

@property(nonatomic,weak) id<ZJFeedFullVideoProviderDelegate> delegate;

//tips:方法- (instancetype)initWithPlacementId:(NSString *)placementId delegate:(id<ZJFeedFullVideoProviderDelegate>) delegate;已弃用,使用此方法替换,并单独设置delegate。
- (instancetype)initWithPlacementId:(NSString *)placementId;

//count 返回广告最大数量
-(void) loadAd:(NSInteger) count;

@end

2.4.2、ZJFeedFullVideoProviderDelegate广告说明

@protocol ZJFeedFullVideoProviderDelegate <NSObject>

/**
 * 广告加载成功
 */
- (void)zj_feedFullVideoProviderLoadSuccess:(ZJFeedFullVideoProvider *)provider views:(NSArray<__kindof ZJFeedFullVideoView *> *)views;

/**
* 广告加载失败
*/
- (void)zj_feedFullVideoProviderLoadFail:(ZJFeedFullVideoProvider *)provider error:(NSError *_Nullable)error;

/**
 * 广告渲染成功, ZJFeedFullVideoView.size.height has been updated
 */
- (void)zj_feedFullVideoAdViewRenderSuccess:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView;

/**
 * 广告渲染失败
 */
- (void)zj_feedFullVideoAdViewRenderFail:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView error:(NSError *_Nullable)error;

/**
 * 广告曝光回调
 */
- (void)zj_feedFullVideoAdViewWillShow:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView;

/**
视频广告播放状态更改回调
*/
- (void)zj_feedFullVideoAdViewStateDidChanged:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView state:(ZJMediaPlayerStatus)playerState;
/**
视频广告播放完毕
*/
- (void)zj_feedFullVideoAdViewPlayerDidPlayFinish:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView;

/**
 * 广告点击回调
 */
- (void)zj_feedFullVideoAdViewDidClick:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView;

/**
* 广告详情页面即将展示回调
*/
- (void)zj_feedFullVideoAdViewDetailViewWillPresentScreen:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView;

/**
 *广告详情页关闭回调
 */
- (void)zj_feedFullVideoAdViewDetailViewClosed:(ZJFeedFullVideoProvider *)provider view:(ZJFeedFullVideoView*) adView;

@end

2.4.3、加载全屏视频信息流

Objective-C

- (void)loadData {
  if(!self.adProvider){
    self.adProvider = [[ZJFeedFullVideoProvider alloc] initWithPlacementId:@"KS90010003"];
    self.adProvider.delegate = self;
    self.adProvider.adSize = self.view.bounds.size;
  }
  [self.adProvider loadAd:5];
}

/** 
* 广告加载成功
*/
- (void)zj_feedFullVideoProviderLoadSuccess:(ZJFeedFullVideoProvider *)provider views:(NSArray<__kindof ZJFeedFullVideoView *> *)views{

  if (views.count) {
    NSMutableArray *dataSources = [NSMutableArray arrayWithCapacity:0];
    [views enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
      ZJFeedFullVideoView *videoView = (ZJFeedFullVideoView *)obj;
      videoView.rootViewController = self;
      // important: 此处会进行WKWebview的渲染,建议一次最多预加载三个广告,如果超过3个会很大概率导致WKWebview渲染失败。
      [videoView render];
      [dataSources addObject:videoView];
    }];
    self.dataSource = [dataSources copy];
  }
  [self.tableView reloadData];
}

Swift

self.adProvider = ZJFeedFullVideoProvider.init(placementId: self.placementId! as String, delegate: self);
self.adProvider.adSize = self.view.bounds.size;
self.adProvider.loadAd(8);

/** 
* 广告加载成功
*/
func zj_feedFullVideoProviderLoadSuccess(_ provider: ZJFeedFullVideoProvider, views: [ZJFeedFullVideoView]) {
    var dataArray:Array<Any> = []
    for dataObject in views {
      dataArray.append(dataObject)
      dataArray.append("demo")
    }
    self.dataSource = dataArray
    self.tableView!.reloadData()
  }

加载广告具体示例详见Demo中的ZJFeedFullVideoShowViewController。

2.5、接入模板信息流(ZJNativeExpressFeedAdManager)

2.5.1、ZJNativeExpressFeedAdManager,ZJNativeExpressFeedAd说明

@interface ZJNativeExpressFeedAdManager : ZJAd

@property(nonatomic,weak) id<ZJNativeExpressFeedAdManagerDelegate> delegate;

@property (nonatomic)CGSize adSize;

@property (nonatomic, strong) NSArray<ZJNativeExpressFeedAd *> *data;

-(instancetype)initWithPlacementId:(NSString *)placementId size:(CGSize)size;

/**
 * 加载广告,建议最大个数不超过5个
 */
-(void)loadAdDataWithCount:(NSInteger)count;

@end



//ZJNativeExpressFeedAd
@interface ZJNativeExpressFeedAd : NSObject

@property (nonatomic,strong,readonly) UIView *feedView;

/**
 * Whether render is ready
 */
@property (nonatomic, assign,readonly) BOOL isReady;

@property(nonatomic,weak) id<ZJNativeExpressFeedAdDelegate> delegate;

/*
 *required.[必选]
 * root view controller for handling ad actions.
 * 详解:开发者需传入用来弹出目标页的ViewController,一般为当前ViewController
 */
@property (nonatomic, weak) UIViewController *rootViewController;

/*
 *required [必选]
 *原生模板广告渲染
 */
- (void)render;

@end

2.5.2、ZJNativeExpressFeedAdManagerDelegate ZJNativeExpressFeedAdDelegate说明

@protocol ZJNativeExpressFeedAdManagerDelegate <NSObject>
@optional
//数据加载成功
- (void)ZJ_nativeExpressFeedAdManagerSuccessToLoad:(ZJNativeExpressFeedAdManager *)adsManager nativeAds:(NSArray<ZJNativeExpressFeedAd *> *_Nullable)feedAdDataArray;
//数据加载失败
- (void)ZJ_nativeExpressFeedAdManager:(ZJNativeExpressFeedAdManager *)adsManager didFailWithError:(NSError *_Nullable)error;

@end

@protocol ZJNativeExpressFeedAdDelegate <NSObject>
@optional
//ZJNativeExpressFeedAd
/**
 * 广告渲染成功
 */
- (void)ZJ_nativeExpressFeedAdRenderSuccess:(ZJNativeExpressFeedAd *)feedAd;
/**
 * 广告渲染失败
 */
- (void)ZJ_nativeExpressFeedAdRenderFail:(ZJNativeExpressFeedAd *)feedAd;

/**
 *广告即将展示
 */
- (void)ZJ_nativeExpressFeedAdViewWillShow:(ZJNativeExpressFeedAd *)feedAd;
/**
 *广告点击
 */
- (void)ZJ_nativeExpressFeedAdDidClick:(ZJNativeExpressFeedAd *)feedAd;
/**
 *不喜欢该广告
 */
- (void)ZJ_nativeExpressFeedAdDislike:(ZJNativeExpressFeedAd *)feedAd;
/**
 *展示落地页
 */
- (void)ZJ_nativeExpressFeedAdDidShowOtherController:(ZJNativeExpressFeedAd *)nativeAd;
/**
 *关闭落地页
 */
- (void)ZJ_nativeExpressFeedAdDidCloseOtherController:(ZJNativeExpressFeedAd *)nativeAd;
@end

2.5.3、加载模板信息流广告

if (!_feedAd) {
    _feedAd = [[ZJNativeExpressFeedAdManager alloc] initWithPlacementId:@"K4000000007" size:CGSizeMake(self.tableView.frame.size.width, 0)];
  }
_feedAd.delegate = self;
[_feedAd loadAdDataWithCount:3];

//数据加载成功
-(void)ZJ_nativeExpressFeedAdManagerSuccessToLoad:(ZJNativeExpressFeedAdManager *)adsManager nativeAds:(NSArray<ZJNativeExpressFeedAd *> *)feedAdDataArray{
  //不要保存太多广告,需要在合适的时机手动释放不用的,否则内存会过大
  if (self.adArray.count > 0) {
    for (ZJNativeExpressFeedAd *feedAd in self.adArray) {
      [self.dataArray removeObject:feedAd];
    }
  }
  for (int i = 0; i<feedAdDataArray.count; i++) {
    ZJNativeExpressFeedAd *feedAd = feedAdDataArray[i];
    feedAd.rootViewController = self;
    feedAd.delegate = self;
    [feedAd render];    
    NSInteger index = i*3;
    if (index >= self.dataArray.count) {
      [self.dataArray addObject:feedAd];
    }else{
      [self.dataArray insertObject:feedAd atIndex:index];
    }
  }
  self.adArray = feedAdDataArray;
//  [self.tableView reloadData];
}

/**
 * 广告渲染成功
 */
- (void)ZJ_nativeExpressFeedAdRenderSuccess:(ZJNativeExpressFeedAd *)feedAd{
    [self.tableView reloadData];
}

加载广告具体示例详见Demo中的ZJNativeExpressAdsViewController。

2.6、接入Banner广告(ZJBannerAdView)

2.6.1、ZJBannerAdView说明

/**
 *  @params
 *  placementId - 广告位id
 *  viewController - 视图控制器
 *  adSize 展示的位置和大小
 *  interval  广告刷新间隔,范围 [30, 120] 秒,默认值 30 秒。设 0 则不刷新。
 */
- (instancetype)initWithPlacementId:(NSString *)placementId
                     viewController:(UIViewController *)viewController
                             adSize:(CGSize)adSize
                           interval:(NSInteger)interval;

/**
 *  @params
 *  placementId - 广告位id
 *  viewController - 视图控制器
 *  adSize 展示的位置和大小
 */
- (instancetype)initWithPlacementId:(NSString *)placementId
                     viewController:(UIViewController *)viewController
                             adSize:(CGSize)adSize;
/**
 *  拉取并展示广告
 */
- (void)loadAdAndShow;

2.6.2、ZJBannerAdViewDelegate说明

/**
 banner广告加载成功
 */
- (void)zj_bannerAdViewDidLoad:(ZJBannerAdView *)bannerAdView;

/**
 banner广告加载失败
 */
- (void)zj_bannerAdView:(ZJBannerAdView *)bannerAdView didLoadFailWithError:(NSError *_Nullable)error;

/**
 bannerAdView曝光回调
 */
- (void)zj_bannerAdViewWillBecomVisible:(ZJBannerAdView *)bannerAdView;

/**
 关闭banner广告回调
 */
- (void)zj_bannerAdViewDislike:(ZJBannerAdView *)bannerAdView;

/**
 点击banner广告回调
 */
- (void)zj_bannerAdViewDidClick:(ZJBannerAdView *)bannerAdView;

/**
 关闭banner广告详情页回调
 */
- (void)zj_bannerAdViewDidCloseOtherController:(ZJBannerAdView *)bannerAdView;

2.6.3、加载Banner广告

-(void)loadAd:(NSString*)adId{
    if (!_bannerView) {
         CGFloat bannerHight = 100;
        _bannerView = [[ZJBannerAdView alloc]initWithPlacementId:adId viewController:self adSize:CGSizeMake(ScreenWidth, bannerHight) interval:30];
        _bannerView.frame = CGRectMake(0, 100, ScreenWidth, bannerHight);
        _bannerView.delegate = self;
        [self.view addSubview:_bannerView];
        [_bannerView loadAdAndShow];
    }
}

加载广告具体示例详见Demo中的ZJBannerAdAdapter。

2.7、接入自渲染广告(ZJNativeAd)

2.7.1、ZJNativeAd说明

自渲染广告返回数据模型(ZJNativeAdObject),通过数据模型由开发者渲染视图 ,视图渲染需要基于ZJNativeAdView上进行扩展。

/*
*  详解:placementId - 广告位 ID
*/
- (instancetype)initWithPlacementId:(NSString *)placementId;

//加载广告个数
-(void)loadAdWithCount:(NSInteger)adCount

/*自渲染广告加载的回调*/
- (void)zj_nativeAdLoaded:(NSArray<ZJNativeAdObject *> * _Nullable)nativeAdObjects error:(NSError * _Nullable)error;

2.7.2、加载ZJNativeAd广告

//加载广告
self.nativeAd = [[ZJNativeAd alloc] initWithPlacementId:self.adId];
self.nativeAd.delegate = self;
[self.nativeAd loadAdWithCount:8];

///广告回调
- (void)zj_nativeAdLoaded:(NSArray<ZJNativeAdObject *> * _Nullable)nativeAdObjects error:(NSError * _Nullable)error{
    if (!error &&nativeAdObjects.count > 0) {
        self.dataArray = nativeAdObjects.mutableCopy;
        [self.tableView reloadData];
        
    }else{
        NSLog(@"error:%@",error);
    }
}

通过ZJNativeAdView 注册数据,生成adView

self.fillView.viewController = vc;
self.fillView.delegate = delegate;
self.adView = [self.fillView registerDataObject:dataObject];
[self.contentView addSubview:self.adView];

加载广告示例详见demo中的 ZJNativeAdViewController。

2.8、接入全屏视频广告(ZJFullScreenVideoAd)

2.8.1、ZJFullScreenVideoAd说明

@interface ZJFullScreenVideoAd : ZJAd

@property(nonatomic,weak) id<ZJFullScreenVideoAdDelegate> delegate;


//tips:方法- (instancetype)initWithPlacementId:(NSString *)placementId delegate:(id<ZJFullScreenVideoAdDelegate>) delegate;已弃用,使用此方法替换,并单独设置delegate。
- (instancetype)initWithPlacementId:(NSString *)placementId;

//加载广告
-(void) loadAd;

//展示全屏视频广告
-(void)presentFullScreenVideoAdFromRootViewController:(UIViewController*)viewController;

@end

2.8.2、ZJFullScreenVideoAdDelegate广告说明

@protocol ZJFullScreenVideoAdDelegate <NSObject>
//广告加载成功
- (void) zj_fullScreenVideoAdDidLoad:(ZJFullScreenVideoAd*) ad;
//广告加载失败
- (void) zj_fullScreenVideoAdDidLoadFail:(ZJFullScreenVideoAd*) ad error:(NSError * __nullable)error;
//广告展示
- (void) zj_fullScreenVideoAdDidShow:(ZJFullScreenVideoAd*) ad;
//广告点击
- (void) zj_fullScreenVideoAdDidClick:(ZJFullScreenVideoAd*) ad;
//广告关闭
- (void) zj_fullScreenVideoAdDidClose:(ZJFullScreenVideoAd*) ad;
//广告错误
- (void) zj_fullScreenVideoAdDidFail:(ZJFullScreenVideoAd*) ad error:(NSError * __nullable)error;

//广告播放状态回调
- (void)zj_fullScreenVideoAd:(ZJFullScreenVideoAd*)ad  playerStatusChanged:(ZJMediaPlayerStatus)playerStatus;

//广告详情页打开
- (void)zj_fullScreenVideoAdDetailDidPresent:(ZJFullScreenVideoAd*)ad;
//广告详情页关闭
- (void) zj_fullScreenVideoAdDetailDidClose:(ZJFullScreenVideoAd*) ad;

@end

2.8.3、加载全屏视频广告

self.fullVideoAd = [[ZJFullScreenVideoAd alloc] initWithPlacementId:adId];
self.fullVideoAd.delegate = self;
[self.fullVideoAd loadAd];

加载广告具体示例详见Demo中的ZJFullScreenVideoViewController。

2.9、接入视频内容(ZJContentPage)

2.9.1、ZJContentPage接入注意事项

由于快手pod库不支持内容包,视频内容模块需要单独手动导入 视频内容集成注意事项: 一:build phases点左上角+号添加copyfile ,copyfile 中点+号添加快手依赖库KSAdSDK.framework 二:embed frameworks 同样添加快手依赖库 三:编译模式选择老的编译模式:file- workspaceSetting-buildSystem-legacy build system,同时勾选Do not show a dialognostic......, 四:打包发布之前,去掉x86_64框架,具体的拆分合并命令参考以下

cd [KSAdSDK.framework所在的目录]
mkdir ./bak
cp -r KSAdSDK.framework ./bak
lipo KSAdSDK.framework/KSAdSDK -thin armv7 -output KSAdSDK_armv7
lipo KSAdSDK.framework/KSAdSDK -thin arm64 -output KSAdSDK_arm64
lipo -create KSAdSDK_armv7 KSAdSDK_arm64 -output KSAdSDK
mv KSAdSDK KSAdSDK.framework/

2.9.2、ZJContentPage说明

@property (nonatomic, readonly) UIViewController *viewController;
///视频状态代理
@property (nonatomic, weak) id <ZJContentPageVideoStateDelegate> videoStateDelegate;
///页面状态代理
@property (nonatomic, weak) id <ZJContentPageStateDelegate> stateDelegate;


///内容标识
@property (nonatomic, copy, readonly) NSString *contentInfoId;
///内容类型
@property (nonatomic, assign, readonly) ZJContentInfoType contentInfoType;

///刷新
- (void)tryToRefresh;

2.9.3、加载视频内容

self.contentPage = [[ZJContentPage alloc]initWithPlacementId:self.contentId];
self.contentPage.videoStateDelegate = self;
self.contentPage.stateDelegate = self;
UIViewController *vc = self.contentPage.viewController;
    
CGFloat contentY = [UIApplication sharedApplication].statusBarFrame.size.height+self.navigationController.navigationBar.frame.size.height;
vc.view.frame = CGRectMake(0, contentY, self.view.frame.size.width, self.view.frame.size.height-contentY);
[self addChildViewController:vc];
[self.view addSubview:vc.view];

加载广告具体示例详见Demo中的 ZJContentPageStyle1ViewController, ZJContentPageStyle2ViewController, ZJContentPageTabBarController

三、接入H5内容页

3.1、接入H5内容

SDK为接入方提供了定制H5内容页:游戏,测试,积分消耗...

3.1.1、ZJH5Page说明

ZJUser *user; userID;//用户ID userName;//用户名称 userAvatar;//用户头像URL userIntegral;//用户积分 ext = "";//扩展参数 self.zjH5 = [ZJH5 new];

@property(nonatomic,weak) id<ZJH5PageDelegate> delegate;

@property (nonatomic, strong) ZJUser *user;

- (instancetype)initWithPlacementId:(NSString *)placementId user:(ZJUser *)user delegate:(id <ZJH5PageDelegate>)delegate;

- (void)loadH5Page;

- (void)presentH5FromRootViewController:(UIViewController *)rootViewController animated:(BOOL)animated;

3.1.2、ZJH5Delegate说明

@protocol ZJH5Delegate <NSObject>

@optional

//H5Ad加载完成
-(void) onZjH5PageLoaded:(ZJUser*) user error:(nullable NSError*) error;

//H5Ad错误
-(void) onZjH5PageError:(ZJUser*) user error:(NSError*) error;

//H5操作回调
//积分不足
-(void) onIntegralNotEnough:(ZJUser*) user needIntegral:(NSInteger) integral;

//积分消耗
-(void) onIntegralExpend:(ZJUser*) user expendIntegral:(NSInteger) integral;

//积分奖励
-(void) onIntegralReward:(ZJUser*) user rewardIntegral:(NSInteger) integral;

//奖励发放,奖励积分
-(void) onZjH5PageAdRewardProvide:(ZJUser*) user rewardIntegral:(NSInteger) integral;

//用户页面的行为操作
-(void) onZjH5PageUserBehavior:(ZJUser*) user behavior:(NSString*) behavior;

//广告回调
//广告激励视频加载成功
-(void) onZjH5PageAdRewardLoaded:(ZJUser*) user trans_id:(NSString*) trans_id;

//广告激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
-(void) onZjH5PageAdRewardValid:(ZJUser*) user trans_id:(NSString*) trans_id;

//广告点击
-(void) onZjH5PageAdRewardClick:(ZJUser*) user ;

//广告加载错误
-(void) onZjH5PageAdReward:(ZJUser*) user didFailWithError:(NSError*) error;

@end

3.1.3、加载H5内容页

Objective-C

ZJUser *user = [ZJUser new];
user.userID = @"00012282";
user.userName = @“用户名";
user.userAvatar = @“用户头像";
user.userIntegral = 10000;
user.ext = @"超级无敌4";
self.zjH5Page = [[ZJH5Page alloc] initWithPlacementId:adId user:user delegate:self];
[self.zjH5Page loadH5Page];

加载广告具体示例详见Demo中的ZJH5ViewController。

3.2、悬浮广告

3.2.1、ZJFloatingAdView说明

- (instancetype)initWithPlacementId:(NSString *)placementId frame:(CGRect)frame;

@property (nonatomic, weak) id <ZJFloatingAdViewDelegate> delegate;
///placementId - 广告位 ID
@property (nonatomic, copy) NSString *placementId;
///广告是否能够移动 默认 YES
@property (nonatomic, assign) BOOL canMove;
///广告是否需要自动贴边展示 默认 YES
@property (nonatomic, assign) BOOL needMoveToSide;
///广告关闭按钮隐藏 默认 NO
@property (nonatomic, assign) BOOL hiddenCloseButton;
///用来弹出目标页的ViewController,一般为当前ViewController 默认当前widow的viewController
@property (nonatomic, weak) UIViewController *rootViewController;

///加载广告
- (void)loadAd;

H5详情页可配置参数

@interface ZJFloatingAdView (ZJH5PageCustom)
/**导航栏返回按钮 图片设置*/
@property (nonatomic, nullable, strong) UIImage *backImage;
/**导航栏返回按钮 文字描述设置*/
@property (nonatomic, nullable, copy) NSAttributedString *backText;

/**导航栏关闭按钮 图片设置*/
@property (nonatomic, nullable, strong) UIImage *closeImage;
/**导航栏关闭按钮 文字描述设置*/
@property (nonatomic, nullable, copy) NSAttributedString *closeText;

/**隐藏导航栏的关闭按钮 */
@property (nonatomic, assign) BOOL hiddenH5CloseButton;

/**导航栏标题, 设置后不会读取网页的标题*/
@property (nonatomic, nullable, copy) NSString *navigationbarTitle;
@end

3.2.2、ZJFloatingAdView使用

self.floatingAd = [[ZJFloatingAdView alloc]initWithPlacementId:@"J2952950117" frame:CGRectZero];
self.floatingAd.delegate = self;
self.floatingAd.hiddenH5CloseButton = YES;
[self.floatingAd loadAd];


//加载成功回调
-(void)zj_floatingAdViewDidLoad:(ZJFloatingAdView *)floatingAdView{
    NSLog(@"%s",__FUNCTION__);
    [self.view addSubview:floatingAdView];
}

备注

最新版本更新日志 修订日期 修订说明
v1.0.20 2020-1-14 增加新广告类型
v1.0.21 2020-1-26 新增banner广告,广告数据获取优化
v2.0.2 2021-3-5 模块拆分,广告优化
v2.1.0 2021-3-12 广告获取机制优化,提升容错率
v2.2.3 2021-4-7 添加自渲染广告,优化H5广告
v2.2.12 2021-6-8 添加全屏视频广告类型,优化自渲染广告接入,完善广告回调信息
v2.3.0 2021-6-28 添加广告平台
v2.3.2 2021-7-6 开屏广告优化,优化广告填充
v2.3.6 2021-7-28 激励视频校验优化
v2.3.8 2021-8-8 优化网络请求,优化版本兼容
v2.3.8.2 2021-8-13 开屏添加即将关闭回调,自渲染广告logoView
v2.3.8.3 2021-8-17 激励视频校验2.0
v2.3.9 2021-8-27 新增Sigmob广告
v2.3.9.5 2021-9-17 兼容gif图和悬浮广告优化
v2.3.11 2021-10-25 信息流填充优化,修复sdk已知问题
v2.3.11.6 2021-12-01 修复bug,视频内容需单独引入
v2.3.12.5 2021-01-20 添加插屏广告,全屏视频广告填充
v2.3.13 2021-02-09 修复bug, 添加Google广告
v2.4.0.1 2022-04-18 更新广告加载逻辑
v2.4.1.3 2022-06-24 适配穿山甲更新,增加错误限制策略