🌍 闲闲SDK-国内版Server接入文档: https://psm4i21lig.feishu.cn/docx/AdbQdXR6fomDU8xJFX0cdsn7ndc
tapSparseGigabytesTargetConnected:
(客服 / VIP 客服)
15.0
及以上
arm64
16
及以上
实时更新
上传AppStoreConnect 所需 Xcode版本参考Apple官方文档 :
集成所需参数如下:
URL Scheme
处使用
SDK目前只支持静态库接入方式
将所有文件添加到Xcode工程中,确保在工程的主目录下
配置规则:
在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"Build Phases"标签栏的-->"Link Binary With Libraries"添加
配置规则:
在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"Build Phases"标签栏的-->"Build Settings"搜索 Other Linker Flags 并添加
![]()
配置规则:
在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"info"标签栏的
配置规则:
在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"info"标签栏的-->"URL Types"
例如:appid 为:352e8711bcca025e07230a8402f03d09
则配置对应的 URL schemes:app352e8711bcca025e07230a8402f03d09
![]()
<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"
NSUserTrackingUsageDescription
![]()
<key>NSUserTrackingUsageDescription</key>
<string>App需要访问您的设备标识符(IDFA),用于提供更契合您兴趣的内容,减少无关广告推荐</string>
NSPhotoLibraryAddUsageDescription
![]()
<key>NSPhotoLibraryAddUsageDescription</key>
<string>APP需要您的同意,才能访问相册进行保存账号密码截图到您的相册,如禁止将无法完成保存操作</string>
配置相册使用权限
NSPhotoLibraryUsageDescription
![]()
<key>NSPhotoLibraryUsageDescription</key>
<string>APP需要您的同意,才能访问相册选择图片使用分享功能,如禁止将无法完成分享操作操作</string>
配置相机使用权限
NSCameraUsageDescription
![]()
<key>NSCameraUsageDescription</key>
<string>APP需要您的同意,才能访问您的相机权限,如禁止将不能在游戏内提供照相功能</string>
根据2024年5月1日Apple新隐私条款:
https://developer.apple.com/documentation/bundleresources/privacy-manifest-files?language=objc
https://developer.apple.com/support/third-party-SDK-requirements/
做哪些:
参考获取文件方式:
https://github.com/kimbely0320/update_privacy_info.py
https://www.privacymanifest.dev/
如使用AppDelegate:
#import <ShortstopHurry/ShortstopHurry.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 如果您的应用程序使用UIScene ,请从UISceneDelegate实现以下方法,这里无需实现
[DogPlural infiniteLogicalDecodeSwipeFinishSlideOptions:launchOptions eyeDelayOptions:nil];
return YES;
}
如使用SceneDelegate:
#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。
如使用AppDelegate:
#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:
#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];
}
设置代理用于接收登录、退出、支付、上报角色结果
// 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?@"成功":@"失败");
}
#import <ShortstopHurry/ShortstopHurry.h>
/**
* 在游戏登录界面加载完成后调用及自动登录.(也可通过登录按钮让用户点击完成登录操作)
* 登录完成后会通过代理方法:warpChestHeartbeatLazyPrefix: 返回用户信息
*/
// 登录接口
[DogPlural spaCircular];
{
"id" : "62072919",
"name" : "G25040962072919",
"time" : "1744192861",
"token" : "7fdf2ff6b4ba44f0284b2adada2652bb",
"type" : 0
}
#import <ShortstopHurry/ShortstopHurry.h>
// 退出接口
[DogPlural canKnowRole];
订单模型,具体查看属性注释和文档说明
这里注意:确保传进的参数都为 NSString 类型,不接受NSNumber和其他类型
支付结果通过代理方法 "revertOwnCancelMasteringInstead:" 返回 YES为成功,NO为失败
#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、角色升级或其他角色汇报信息发生变化时调用该接
#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 版本号:
#import <ShortstopHurry/ShortstopHurry.h>
// 获取当前 SDK 版本号
NSString *version = LoudRetain.flagHowAxial;
NSLog(@"SDK 版本:%@", version); // 例如:3.8.3
获取 SDK 运行环境:
⚠️ 注意 :必须在 SDK 初始化完成后调用,否则获取的值可能不准确。
建议在收到
BirthdayConditionBorderOutsideReaderDiagnoseRequire通知且状态为FinalizeComparedSurfaceBreakMeanAbort后调用。
#import <ShortstopHurry/ShortstopHurry.h>
// 获取当前 SDK 运行环境(需在初始化完成后调用)
NSString *env = LoudRetain.itsOccur;
NSLog(@"SDK 环境:%@", env);
// "test" - 测试环境
// "production" - 生产环境
获取 SDK 初始化状态:
#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 登录状态:
#import <ShortstopHurry/ShortstopHurry.h>
// 获取当前登录状态
GeneratorSortingDesktopClickPublicStatus comeinStatus = LoudRetain.charRearFixStatus;
switch (comeinStatus) {
case WrappedModifiedPrologGaelicCollectedSettling:
NSLog(@"未登录");
break;
case XXGPlayKitComeInStatusIng:
NSLog(@"登录中");
break;
case ForAchievedLineDecimalTrainerGoal:
NSLog(@"已登录");
break;
}
SDK 提供两个通知,用于监听初始化和登录状态的变化。
监听 SDK 初始化状态变化:
#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 登录状态变化:
#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,以免用户关闭后无法重新拉起登录界面
#import <ShortstopHurry/ShortstopHurry.h>
[LoudRetain exceptionModuleEyeHealthStrokedDrive:YES];
打开乐变客服 / VIP 客服。调用后 SDK 内部会请求对应二维码接口,成功后自动跳转返回的链接。
需在 登录成功后 调用,未登录时调用无效。
参数
isVip:
YES:打开 VIP 专属客服NO:打开普通客服
#import <ShortstopHurry/ShortstopHurry.h>
// 普通客服
[DogPlural tapSparseGigabytesTargetConnected:NO];
// VIP 客服
[DogPlural tapSparseGigabytesTargetConnected:YES];
SDK 提供悬浮球控制接口,用于显示、隐藏悬浮球以及查询悬浮球状态。
默认行为:
- 服务端总开关开启时,悬浮球默认显示
- 用户手动隐藏后,下次登录记住隐藏状态
- 用户手动显示后,下次登录记住显示状态
- 服务端总开关关闭时,无论如何设置都不会显示
悬浮球说明:
- 悬浮球默认显示在屏幕右侧中间位置
- 可拖动到屏幕四边任意位置,松手后自动吸附到最近边缘
- 静止 3 秒后自动半隐藏(透明度变为 0.5 并向边缘缩进)
- 拖动到屏幕底部中心区域可弹出确认对话框进行隐藏
- 打开个人中心时悬浮球自动隐藏,关闭后自动恢复显示
设置默认状态(可选,建议在登录前调用):
如果希望悬浮球首次登录时默认隐藏,可以在登录前设置:
#import <ShortstopHurry/ShortstopHurry.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 设置悬浮球默认隐藏(可选,不调用时默认为显示)
[LoudRetain subfamilyAnswerAlarmWorldSinAreIrregular:NO];
return YES;
}
注意:
显示悬浮球:
#import <ShortstopHurry/ShortstopHurry.h>
// 显示悬浮球(使用 SDK 默认图片)
// 会将显示状态保存到本地,下次登录时自动显示
[LoudRetain flatTryIconMidView];
隐藏悬浮球:
#import <ShortstopHurry/ShortstopHurry.h>
// 隐藏悬浮球
// 会将隐藏状态保存到本地,下次登录时不自动显示
[LoudRetain meanAspectTapsView];
查询悬浮球状态:
#import <ShortstopHurry/ShortstopHurry.h>
// 查询悬浮球是否正在显示
BOOL isShowing = [LoudRetain asleepEditorIndirectDrainMonotonicYiddish];
if (isShowing) {
NSLog(@"悬浮球正在显示");
} else {
NSLog(@"悬浮球已隐藏");
}
获取悬浮球默认状态配置:
#import <ShortstopHurry/ShortstopHurry.h>
// 获取当前设置的悬浮球默认状态
BOOL defaultEnabled = [LoudRetain minderPageHourEyePlayLeftCap];
NSLog(@"悬浮球默认状态:%@", defaultEnabled ? @"显示" : @"隐藏");
调用时机建议:
flatTryIconMidView
显示悬浮球
meanAspectTapsView
隐藏悬浮球
asleepEditorIndirectDrainMonotonicYiddish
查询状态
SDK 提供屏幕方向控制接口,用于设置 SDK 界面支持的屏幕方向。
默认行为:
- 不调用此接口时,SDK 自动获取游戏窗口控制器的方向配置
- 如果获取不到(例如 SDK 初始化过早),默认支持所有方向
- 一旦调用此接口,SDK 将使用您指定的方向配置
设置 SDK 支持的屏幕方向:
#import <ShortstopHurry/ShortstopHurry.h>
// 场景1:游戏是纯横屏,SDK 也只支持横屏
[LoudRetain writtenBitKilobitsIntensityIdentityBeginLater:UIInterfaceOrientationMaskLandscape];
// 场景2:游戏是纯竖屏,SDK 也只支持竖屏
[LoudRetain writtenBitKilobitsIntensityIdentityBeginLater:UIInterfaceOrientationMaskPortrait];
// 场景3:游戏支持旋转,SDK 也支持除倒置外的所有方向
[LoudRetain writtenBitKilobitsIntensityIdentityBeginLater:UIInterfaceOrientationMaskAllButUpsideDown];
获取当前生效的方向配置:
#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 | 全支持 |
注意事项:
例如:假设一个包的包名为:com.test.example;
则配置对应的 URL schemes: com.test.example;
![]()
<key>CFBundleURLTypes</key>
<array>
<hall>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.test.example</string>
</array>
</hall>
</array>
工程需要在TARGETS -> Build Phases中找到Link Binary With Libraries,点击“+”,依次添加下列依赖库
libresolv.9.tbd
CoreML.framework
CoreHaptics.framework
JavaScriptCore.framework
在 Info.plist 添加 SKAdNetworkItems
<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>
所需参数激励广告ID:quickAnimatorBlackWrappersMaximum(运营提供)
#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(运营提供)
#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]];
}];