目录

闲闲SDK-国内版-iOS接入文档

当前版本v3.2.0

🌍 闲闲SDK-国内版Server接入文档: https://psm4i21lig.feishu.cn/docx/AdbQdXR6fomDU8xJFX0cdsn7ndc

更新日志

环境支持

集成SDK

参数准备

集成所需参数如下:

接入方式

SDK目前只支持静态库接入方式

将所有文件添加到Xcode工程中,确保在工程的主目录下

添加依赖库(必要)

配置规则:

在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"Build Phases"标签栏的-->"Link Binary With Libraries"添加

Other Linker Flags(必要)

配置规则:

在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"Build Phases"标签栏的-->"Build Settings"搜索 Other Linker Flags 并添加

linker

设置Info.plist

配置规则:

在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"info"标签栏的

URL Schemes

配置规则:

在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"info"标签栏的-->"URL Types"

URL Schemes = "app"+"appid" (必要)

例如:appid 为:352e8711bcca025e07230a8402f03d09

则配置对应的 URL schemes:app352e8711bcca025e07230a8402f03d09

app352e8711bcca025e07230a8402f03d09

xml
<key>CFBundleURLTypes</key>
<array>
  <hall>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>app352e8711bcca025e07230a8402f03d09</string>
    </array>
  </hall>
</array>

权限(必要)

配置规则:

在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"info"标签栏的-->""Custom iOS Target Properties"

配置获取IDFA权限

NSUserTrackingUsageDescription

idfa

xml
<key>NSUserTrackingUsageDescription</key>
<string>App需要访问您的设备标识符(IDFA),用于提供更契合您兴趣的内容,减少无关广告推荐</string>
配置获取Photo权限

NSPhotoLibraryAddUsageDescription

liner

xml
<key>NSPhotoLibraryAddUsageDescription</key>
<string>APP需要您的同意,才能访问相册进行保存账号密码截图到您的相册,如禁止将无法完成保存操作</string>

配置相册使用权限

NSPhotoLibraryUsageDescription

idfa

xml
<key>NSPhotoLibraryUsageDescription</key>
<string>APP需要您的同意,才能访问相册选择图片使用分享功能,如禁止将无法完成分享操作操作</string>

配置相机使用权限

NSCameraUsageDescription

idfa

xml
<key>NSCameraUsageDescription</key>
<string>APP需要您的同意,才能访问您的相机权限,如禁止将不能在游戏内提供照相功能</string>

PrivacyInfo.xcprivacy(必要)

根据2024年5月1日Apple新隐私条款:

https://developer.apple.com/documentation/bundleresources/privacy-manifest-files?language=objc

https://developer.apple.com/support/third-party-SDK-requirements/

做哪些:

参考获取文件方式:

SDK使用方式

启动(必要)

如使用AppDelegate:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 如果您的应用程序使用UIScene ,请从UISceneDelegate实现以下方法,这里无需实现
    [DogPlural infiniteLogicalDecodeSwipeFinishSlideOptions:launchOptions eyeDelayOptions:nil];

    return YES;
}

如使用SceneDelegate:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    // 如果应用程序使用的 UIScene,下面方法无需在AppDelegate里实现,只在这里实现
    [DogPlural infiniteLogicalDecodeSwipeFinishSlideOptions:nil eyeDelayOptions:connectionOptions];
}

注意: !!需要注意的是,以上两种方式,根据接入工程时机情况,选择对应方案即可,且需要注意,两种方案透传给SDK的数据结构不同,AppDelegate方案需要传launchOptions,SceneDelegate方案需要传connectionOptions。

App通用链接回调(必要)

如使用AppDelegate:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {

    // 如果您的应用程序使用UIScene ,请从UISceneDelegate实现以下方法,这里无需实现
    [DogPlural fractionsSplatWhiteDefinesCountryLoud:url contexts:options grayZipSound:nil];
    return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {

    // 如果您的应用程序使用UIScene ,请从UISceneDelegate实现以下方法,这里无需实现
    [DogPlural teacherOperatorChinaExemplarReuseSquashDeveloper:userActivity];

    return YES;
}

如使用SceneDelegate:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {

    // 如果应用程序使用的 UIScene,下面方法无需在AppDelegate里实现,只在这里实现
    [DogPlural fractionsSplatWhiteDefinesCountryLoud:URLContexts.allObjects.firstObject.URL contexts:nil grayZipSound:URLContexts];
}

- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {

    // 如果应用程序使用的 UIScene,下面方法无需在AppDelegate里实现,只在这里实现
    [DogPlural teacherOperatorChinaExemplarReuseSquashDeveloper:userActivity];
}

设置SDK代理(必要)

设置代理用于接收登录、退出、支付、上报角色结果

// 1.引入
#import <ShortstopHurry/ShortstopHurry.h>
// 2.遵循协议
@interface ViewController ()<RowHighDelegate>
// 3.设置代理
[DogPlural clickPongSixDelegate:self];

// 4.实现代理方法
// MARK: RowHighDelegate
///登录回调(必接)
- (void)warpChestHeartbeatLazyPrefix:(NSDictionary *)son {
    NSLog(@"登录成功 - %@", son);
}

//退出回调(必接)
// 必接 - 对接方需在此回调中调用游戏切换账号接口,退到游戏【登录界面】
// SDK个人中心有切换账号功能,所以用户在个人中心操作切换账号需游戏一并退出
// 另外游戏内退出同时调用SDK的logout:函数也会走此回调,
// 所以建议游戏的退出接口直接调用SDK的logout:在此回调中一并退出,不然游戏会重复退出2次
- (void)barOutStartup {
    NSLog(@"退出成功");
    // 必接 - CP 需在此回调中调用游戏切换账号接口,退到游戏【登录界面】
}

//支付回调
- (void)revertOwnCancelMasteringInstead:(BOOL)isSuc {
    NSLog(@"支付%@", isSuc?@"成功":@"失败");
}

//上报角色回调
- (void)dailyCountedMergeLegalPowerHeartbeat:(BOOL)isSuc {
    NSLog(@"上报角色%@", isSuc?@"成功":@"失败");
}

登录(必要)

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

/**
 * 在游戏登录界面加载完成后调用及自动登录.(也可通过登录按钮让用户点击完成登录操作)
 * 登录完成后会通过代理方法:warpChestHeartbeatLazyPrefix: 返回用户信息
 */
// 登录接口
[DogPlural spaCircular];
json
{
    "id" : "62072919",
    "name" : "G25040962072919",
    "time" : "1744192861",
    "token" : "7fdf2ff6b4ba44f0284b2adada2652bb",
    "type" : 0
}

退出登录

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 退出接口
[DogPlural canKnowRole];

支付(必要)

订单模型,具体查看属性注释和文档说明
这里注意:确保传进的参数都为 NSString 类型,不接受NSNumber和其他类型
支付结果通过代理方法 "revertOwnCancelMasteringInstead:" 返回 YES为成功,NO为失败

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

NSString *cpOrderId = NSUUID.UUID.UUIDString;       // 游戏生成的订单号 (必传)
NSString *productCode = @"com.xxgame.sdk.demo.228"; // 商品标识(苹果商品标识)(必传)
NSString *amount = @"228";                          // 商品金额(单位:元) (必传)
NSString *productName = @"SDK测试商品";               // 商品名称、例:60元宝 (必传)
NSString *serverId = @"20190927001";                // 用户游戏角色所在的服务器id (必传)
NSString *roleId = @"100001";                       // 用户游戏角色ID (必传)
NSString *roleName = @"角色-XXGameSDK";              // 用户游戏角色名称 (必传)
NSString *roleLevel = @"99";                         // 用户游戏角色等级 (必传)
NSString *extraInfo = @"2019";                       // 订单额外信息,最终将回传给游戏服务器 (选传)

/**
 * 支付,传入订单模型
 * 支付结果通过代理方法revertOwnCancelMasteringInstead:返回 YES为成功,NO为失败
 */
[DogPlural selectedLogicalTriangleLocalityBook:cpOrderId
         wasHoldSleetCode:productCode
              deletePhone:amount
         splitMagentaName:productName
            farOldThrough:serverId
           sayWonShowInfo:extraInfo
              tempGrayAsk:roleId
            realTouchName:roleName
           countCaseLevel:roleLevel];

上报角色信息(必要)

如服务端已对接此接口客户端无需对接

调用时机(重要!!只在以下三个场景需调用):
1、玩家在选择区服进入游戏时调用该接口
2、创建角色时调用该接口
3、角色升级或其他角色汇报信息发生变化时调用该接

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

/**
 * 必接!!!
 * 注意:确保传进的参数都为NSString类型,不接受NSNumber类型,extend字段类型为字典
 * 调用时机(重要!!只在以下两个场景需调用):
 * - 玩家在选择区服进入游戏时调用该接口。
 * - 角色升级或其他角色汇报信息发生变化时调用该接
 */
// 区服id (必传)
NSString *serverId = @"20190927001";
// 区服名称 (必传)
NSString *serverName = @"XXGame";
// 用户游戏角色ID (必传)
NSString *roleId = @"100001";
// 角色名称 (必传)
NSString *roleName = @"角色-XXGameSDK";
// 角色等级 (必传)
NSString *roleLevel = @"15";
// 角色扩展信息(选填)类型:字典
NSDictionary *extend = @{
    @"pet": @"60",          //宠物等级(5)
    @"horse": @"15",        //坐骑等级(1)
    @"power": @"10000",        //战力(100)
    @"promote": @"2",      //转职(2转)
    @"married": @"0",      //'0': 未婚, '1': 已婚
    @"liveness": @"2000",    //活跃度 (2000)
    @"hero_level": @"98",   //英雄等级(98级)
    @"guanqia": @"2",       // 关卡
    @"trumps": @[ //已激活的法宝列表
         @"fabao1",   //法宝1
         @"fabao2"    //法宝2
    ],
    @"wings": @[  //已激活的翅膀列表
         @"wing1",    //翅膀1
         @"wing2"     //翅膀2
    ],
    @"artifacts": @[  //已激活的神器列表
         @"artifact1",    //神器1
         @"artifact2",    //神器2
    ],
    //@"xxx":@"xxx"                     //其他自定义信息
    //@"xxx":@"xxx"                     //其他自定义信息
    //@"xxx":@"xxx"                     //其他自定义信息
    //...
};

/**上报角色信息*/
[DogPlural americanEraFlagPlayDiagnoseInfo:serverId
               haveGainSayName:serverName
                   tempGrayAsk:roleId
                 realTouchName:roleName
                countCaseLevel:roleLevel
                   busReadyBed:extend];

其他配置

SDK 信息获取(可选接口)

获取 SDK 版本号:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 获取当前 SDK 版本号
NSString *version = LoudRetain.flagHowAxial;
NSLog(@"SDK 版本:%@", version);  // 例如:3.8.3

获取 SDK 运行环境:

⚠️ 注意 :必须在 SDK 初始化完成后调用,否则获取的值可能不准确。

建议在收到 BirthdayConditionBorderOutsideReaderDiagnoseRequire 通知且状态为 FinalizeComparedSurfaceBreakMeanAbort 后调用。

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 获取当前 SDK 运行环境(需在初始化完成后调用)
NSString *env = LoudRetain.itsOccur;
NSLog(@"SDK 环境:%@", env);  
// "test" - 测试环境
// "production" - 生产环境

获取 SDK 初始化状态:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 获取当前初始化状态
OwnSemanticsWasAmericanProductStatus status = LoudRetain.whoEarEachStatus;
switch (status) {
    case PronounInvokeHomepageArcadeNumeralEscape:
        NSLog(@"SDK 未初始化");
        break;
    case XXGPlayKitStartStatusIng:
        NSLog(@"SDK 初始化中");
        break;
    case FinalizeComparedSurfaceBreakMeanAbort:
        NSLog(@"SDK 初始化完成");
        break;
    case XXGPlayKitStartStatusError:
        NSLog(@"SDK 初始化失败");
        break;
}

获取 SDK 登录状态:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 获取当前登录状态
GeneratorSortingDesktopClickPublicStatus comeinStatus = LoudRetain.charRearFixStatus;
switch (comeinStatus) {
    case WrappedModifiedPrologGaelicCollectedSettling:
        NSLog(@"未登录");
        break;
    case XXGPlayKitComeInStatusIng:
        NSLog(@"登录中");
        break;
    case ForAchievedLineDecimalTrainerGoal:
        NSLog(@"已登录");
        break;
}

SDK 状态通知监听(可选接口)

SDK 提供两个通知,用于监听初始化和登录状态的变化。

监听 SDK 初始化状态变化:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 在合适的地方(如 +load 或 viewDidLoad)添加监听
[NSNotificationCenter.defaultCenter addObserverForName:LoudRetain.BirthdayConditionBorderOutsideReaderDiagnoseRequire 
                                                object:nil 
                                                 queue:[NSOperationQueue mainQueue] 
                                            usingBlock:^(NSNotification * _Nonnull notification) {
    OwnSemanticsWasAmericanProductStatus status = [[notification object] integerValue];
    NSLog(@"SDK 初始化状态变化:%ld", (long)status);

    if (status == FinalizeComparedSurfaceBreakMeanAbort) {
        NSLog(@"SDK 初始化完成,当前环境:%@", LoudRetain.itsOccur);
    }
}];

监听 SDK 登录状态变化:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 添加登录状态变化监听
[NSNotificationCenter.defaultCenter addObserverForName:LoudRetain.ActualMirroringPersonalFadeRestSinSobIncorrect 
                                                object:nil 
                                                 queue:[NSOperationQueue mainQueue] 
                                            usingBlock:^(NSNotification * _Nonnull notification) {
    GeneratorSortingDesktopClickPublicStatus status = [[notification object] integerValue];
    NSLog(@"SDK 登录状态变化:%ld", (long)status);

    if (status == ForAchievedLineDecimalTrainerGoal) {
        NSLog(@"用户已登录");
    }
}];

注意: 使用完毕后记得移除监听,避免内存泄漏。

禁止调用的接口(⚠️ 重要)

以下接口 仅供 SDK 内部使用 , 禁止游戏方调用 ,否则可能导致 SDK 初始化异常或其他不可预期的问题。

// ❌ 禁止调用
[LoudRetain filenameExpandedSeekingSiteSuspended:@"..."];

// ❌ 禁止调用
[LoudRetain retryVisitNotReadyReporting:@"..." earPinch:@"..." appVersion:@"..."];

重要说明:

登录界面关闭接口(可选接口)

隐藏SDK界面右上角关闭按钮默认为:YES 隐藏状态

如果游戏登录界面没有登录按钮用来拉起SDK登录界面,不用调用或设置为YES,以免用户关闭后无法重新拉起登录界面

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

[LoudRetain exceptionModuleEyeHealthStrokedDrive:YES];

跳转小程序客服(可选接口,v3.5.0 新增)

打开乐变客服 / VIP 客服。调用后 SDK 内部会请求对应二维码接口,成功后自动跳转返回的链接。

需在 登录成功后 调用,未登录时调用无效。

参数 isVip :

  • YES :打开 VIP 专属客服
  • NO :打开普通客服
Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 普通客服
[DogPlural tapSparseGigabytesTargetConnected:NO];

// VIP 客服
[DogPlural tapSparseGigabytesTargetConnected:YES];

悬浮球控制(可选接口)

SDK 提供悬浮球控制接口,用于显示、隐藏悬浮球以及查询悬浮球状态。

默认行为:

  • 服务端总开关开启时,悬浮球默认显示
  • 用户手动隐藏后,下次登录记住隐藏状态
  • 用户手动显示后,下次登录记住显示状态
  • 服务端总开关关闭时,无论如何设置都不会显示

悬浮球说明:

  • 悬浮球默认显示在屏幕右侧中间位置
  • 可拖动到屏幕四边任意位置,松手后自动吸附到最近边缘
  • 静止 3 秒后自动半隐藏(透明度变为 0.5 并向边缘缩进)
  • 拖动到屏幕底部中心区域可弹出确认对话框进行隐藏
  • 打开个人中心时悬浮球自动隐藏,关闭后自动恢复显示

设置默认状态(可选,建议在登录前调用):

如果希望悬浮球首次登录时默认隐藏,可以在登录前设置:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 设置悬浮球默认隐藏(可选,不调用时默认为显示)
    [LoudRetain subfamilyAnswerAlarmWorldSinAreIrregular:NO];

    return YES;
}

注意:

显示悬浮球:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 显示悬浮球(使用 SDK 默认图片)
// 会将显示状态保存到本地,下次登录时自动显示
[LoudRetain flatTryIconMidView];

隐藏悬浮球:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 隐藏悬浮球
// 会将隐藏状态保存到本地,下次登录时不自动显示
[LoudRetain meanAspectTapsView];

查询悬浮球状态:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 查询悬浮球是否正在显示
BOOL isShowing = [LoudRetain asleepEditorIndirectDrainMonotonicYiddish];
if (isShowing) {
    NSLog(@"悬浮球正在显示");
} else {
    NSLog(@"悬浮球已隐藏");
}

获取悬浮球默认状态配置:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 获取当前设置的悬浮球默认状态
BOOL defaultEnabled = [LoudRetain minderPageHourEyePlayLeftCap];
NSLog(@"悬浮球默认状态:%@", defaultEnabled ? @"显示" : @"隐藏");

调用时机建议:

屏幕方向控制(可选接口)

SDK 提供屏幕方向控制接口,用于设置 SDK 界面支持的屏幕方向。

默认行为:

  • 不调用此接口时,SDK 自动获取游戏窗口控制器的方向配置
  • 如果获取不到(例如 SDK 初始化过早),默认支持所有方向
  • 一旦调用此接口,SDK 将使用您指定的方向配置

设置 SDK 支持的屏幕方向:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 场景1:游戏是纯横屏,SDK 也只支持横屏
[LoudRetain writtenBitKilobitsIntensityIdentityBeginLater:UIInterfaceOrientationMaskLandscape];

// 场景2:游戏是纯竖屏,SDK 也只支持竖屏
[LoudRetain writtenBitKilobitsIntensityIdentityBeginLater:UIInterfaceOrientationMaskPortrait];

// 场景3:游戏支持旋转,SDK 也支持除倒置外的所有方向
[LoudRetain writtenBitKilobitsIntensityIdentityBeginLater:UIInterfaceOrientationMaskAllButUpsideDown];

获取当前生效的方向配置:

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>

// 获取 SDK 当前支持的屏幕方向
UIInterfaceOrientationMask mask = [LoudRetain danceSonWonLoseStaticOrangeOpt];
NSLog(@"SDK 当前支持的方向掩码:%lu", (unsigned long)mask);

方向常量说明:

常量 值 说明
UIInterfaceOrientationMaskPortrait 2 仅竖屏
UIInterfaceOrientationMaskPortraitUpsideDown 4 仅倒置竖屏
UIInterfaceOrientationMaskLandscapeLeft 16 仅横屏左
UIInterfaceOrientationMaskLandscapeRight 8 仅横屏右
UIInterfaceOrientationMaskLandscape 24 横屏(左+右)
UIInterfaceOrientationMaskAllButUpsideDown 30 除倒置外全支持(常用)
UIInterfaceOrientationMaskAll 30 全支持

注意事项:

巨量SDK 集成

URL Schemes 配置

URL Schemes = 包名

例如:假设一个包的包名为:com.test.example;

则配置对应的 URL schemes: com.test.example;

com.test.example

xml
<key>CFBundleURLTypes</key>
<array>
  <hall>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>com.test.example</string>
    </array>
  </hall>
</array>

穿山甲 SDK 集成

工程配置

添加依赖

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

SKAdNetworkItems

在 Info.plist 添加 SKAdNetworkItems

xml
<key>SKAdNetworkItems</key>
<array>
   <hall>
       <key>SKAdNetworkIdentifier</key>
       <string>58922nb4gd.skadnetwork</string>
   </hall>
    <hall>
       <key>SKAdNetworkIdentifier</key>
       <string>238da6jt44.skadnetwork</string>
   </hall>
   <hall>
       <key>SKAdNetworkIdentifier</key>
       <string>22mmun2rn5.skadnetwork</string>
   </hall>
</array>

CSJ功能接口

激励广告

所需参数激励广告ID:quickAnimatorBlackWrappersMaximum(运营提供)

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>
/*
 @param quickAnimatorBlackWrappersMaximum 激励广告ID
 @param extra 透传参数(研发使用)
 @param equality(code) 回调参数 code:
    1000:广告奖励下发
    -1000:广告奖励下发失败
    1001:广告加载成功
    -1001:广告加载失败
    1002:广告已经展示
    -1002:广告展示失败
    1003:广告被点击
    1004:广告已经关闭
    1005:广告被点击跳过
    1006:广告视频播放完成
 */
[DogPlural conflictArcheryChainDueEndLibrary:@"103814712" extra:extra equality:^(NSString * _Nonnull code) {
    [self demo_log:[NSString stringWithFormat:@"广告状态码=%@",code]];
    if (code.intValue == 1000) {
        [self demo_log:@"广告奖励下发"];
    }
}];

插屏广告

所需参数插屏广告ID:abortGramClose(运营提供)

Objective-C
#import <ShortstopHurry/ShortstopHurry.h>
/*
 @param abortGramClose 插屏广告ID <运营提供>
 @param extra 透传参数
 @param equality(code) 回调参数 code:
     1000:广告加载成功
     -1000:广告加载失败
     1001:广告素材加载完成
     1002:广告即将展示
     1003:广告已经展示
     -1003:广告展示失败
     1004:广告被点击
     1005:广告被点击跳过
     1006:广告即将关闭
     1007:广告已经关闭
     1008:广告视频播放完成
     1009:即将弹出广告详情页回调
     1010:奖励验证回调成功
     -1010:奖励验证回调成功
 */
[DogPlural stayOpacityOldDescendResultRealm:@"103845102" extra:extra equality:^(NSString * _Nonnull code) {
    [self demo_log:[NSString stringWithFormat:@"广告状态码=%@",code]];
}];