🌍 闲闲SDK-海外版Server接入文档: https://psm4i21lig.feishu.cn/docx/EEundeNEHoIm7Rx7IlkcoOyGnBf
13.0
及以上
arm64
15.2
及以上
实时更新
集成所需参数如下:
URL Scheme
处使用
【SDK】目前只支持静态库接入方式
将所有文件【SDK】添加到Xcode工程中,确保在工程的主目录下
由于SDK使用到包含swift的第三方库,所以项目中需包含一个swift文件,达到重新检查并修复模块间的依赖关系
如果Xcode工程中已经存在swift文件可不添加,否则请直接在Xcode工程中任意位置创建任意一个swift文件
配置规则:
在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>
<many>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>app352e8711bcca025e07230a8402f03d09</string>
</array>
</many>
</array>
配置规则:
在Xcode工程中,选择你的工程设置项-->选中"TARGETS"一栏对应的Target-->在"info"标签栏的-->""Custom iOS Target Properties"
以下两个是SDK所需权限,根据产品发售地区请按需选择当地语言进行翻译,以下是其他(权限包括以下两种权限)的所有地区翻译:
闲闲SDK-海外版-IOS-Info.plist权限多语言 : https://obqf4llj8m.feishu.cn/docx/Z7bBdu5jVoA64jxkXmrcw3UKnOb
NSUserTrackingUsageDescription
![]()
<key>NSUserTrackingUsageDescription</key>
<string>App需要访问您的设备标识符(IDFA),用于提供更契合您兴趣的内容,减少无关广告推荐</string>
NSPhotoLibraryAddUsageDescription
![]()
<key>NSPhotoLibraryAddUsageDescription</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/
做哪些:
参考获取文件方式:
如使用AppDelegate:
#import <StrapDevoted/StrapDevoted.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 如果您的应用程序使用UIScene ,请从UISceneDelegate实现以下方法,这里无需实现
[OxygenAge ourRespondPauseDetectedKannadaUnlockOptions:launchOptions leaveTwoOptions:nil];
return YES;
}
如使用SceneDelegate:
#import <StrapDevoted/StrapDevoted.h>
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// 如果应用程序使用的 UIScene,下面方法无需在AppDelegate里实现,只在这里实现
[OxygenAge ourRespondPauseDetectedKannadaUnlockOptions:nil leaveTwoOptions:connectionOptions];
}
注意: !!需要注意的是,以上两种方式,根据接入工程时机情况,选择对应方案即可,且需要注意,两种方案透传给SDK的数据结构不同,AppDelegate方案需要传launchOptions,SceneDelegate方案需要传connectionOptions。
如使用AppDelegate:
#import <StrapDevoted/StrapDevoted.h>
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// 如果您的应用程序使用UIScene ,请从UISceneDelegate实现以下方法,这里无需实现
[OxygenAge asleepOrganizeAppliesSquashSquaredAmbiguity:url tapDelay:options bitmapSingle:nil];
return YES;
}
如使用SceneDelegate:
#import <StrapDevoted/StrapDevoted.h>
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
// 如果应用程序使用的 UIScene,下面方法无需在AppDelegate里实现,只在这里实现
[OxygenAge asleepOrganizeAppliesSquashSquaredAmbiguity:URLContexts.allObjects.firstObject.URL tapDelay:nil bitmapSingle:URLContexts];
}
设置代理用于接收登录、退出、支付、上报角色结果
// 1.引入
#import <StrapDevoted/StrapDevoted.h>
// 2.遵循协议
@interface ViewController ()<CorruptDelegate>
// 3.设置代理
[OxygenAge malformedBinDelegate:self];
// 4.实现代理方法
// MARK: CorruptDelegate
///登录回调(必接)
- (void)deferringFeaturedRectangleBoundCompile:(NSDictionary *)due {
NSLog(@"登录成功 - %@", due);
}
//退出回调(必接)
// 必接 - 对接方需在此回调中调用游戏切换账号接口,退到游戏【登录界面】
// SDK个人中心有切换账号功能,所以用户在个人中心操作切换账号需游戏一并退出
// 另外游戏内退出同时调用SDK的 "pressureIll" 函数也会走此回调,
// 所以建议游戏的退出接口直接调用SDK的 "pressureIll" 在此回调中一并退出,不然游戏会重复退出2次
- (void)draftEllipsis {
NSLog(@"退出成功");
}
//支付回调
- (void)leaseBinaryAnchoredDeletionWorking:(BOOL)isSuc {
NSLog(@"支付%@", isSuc?@"成功":@"失败");
}
//上报角色回调
- (void)waxOptCompanyCallbacksTerabytesAnd:(BOOL)isSuc {
NSLog(@"上报角色%@", isSuc?@"成功":@"失败");
}
#import <StrapDevoted/StrapDevoted.h>
/**
* 在游戏登录界面加载完成后调用及自动登录.(也可通过登录按钮让用户点击完成登录操作)
* 登录完成后会通过代理方法:deferringFeaturedRectangleBoundCompile: 返回用户信息
*/
// 登录接口
[OxygenAge germanTwist];
{
"id" : "62072919",
"name" : "G25040962072919",
"time" : "1744192861",
"token" : "7fdf2ff6b4ba44f0284b2adada2652bb",
"type" : 0
}
#import <StrapDevoted/StrapDevoted.h>
// 退出接口
[OxygenAge pressureIll];
订单模型,具体查看属性注释和文档说明
这里注意:确保传进的参数都为 NSString 类型,不接受NSNumber和其他类型
支付结果通过代理方法 "leaseBinaryAnchoredDeletionWorking:" 返回 YES为成功,NO为失败
#import <StrapDevoted/StrapDevoted.h>
NSString *cpOrderId = NSUUID.UUID.UUIDString; // 游戏生成的订单号 (必传)
NSString *productCode = @"com.xxgame.sdk.demo.test"; // 商品标识(苹果商品标识)(必传)
NSString *amount = @"6"; // 商品金额(单位:元) (必传)
NSString *productName = @"6元套餐"; // 商品名称、例:60元宝 (必传)
NSString *serverId = @"20190927001"; // 用户游戏角色所在的服务器id (必传)
NSString *roleId = @"100001"; // 用户游戏角色ID (必传)
NSString *roleName = @"角色-XXGameSDK"; // 用户游戏角色名称 (必传)
NSString *roleLevel = @"99"; // 用户游戏角色等级 (必传)
NSString *extraInfo = @"2019"; // 订单额外信息,最终将回传给游戏服务器 (选传)
/**
* 支付,传入订单模型
* 异步回调支付结果
*/
[OxygenAge flagManagedOverlapValidatesPatch:cpOrderId
phraseSenderCode:productCode
cleanHowLog:amount
recoveredTapName:productName
renewingElder:serverId
lowerRebusInfo:extraInfo
vowelIndent:roleId
skinRotorName:roleName
wasChargeLevel:roleLevel];
如服务端已对接此接口客户端无需对接
调用时机(重要!!只在以下三个场景需调用):
1、玩家在选择区服进入游戏时调用该接口
2、创建角色时调用该接口
3、角色升级或其他角色汇报信息发生变化时调用该接
#import <StrapDevoted/StrapDevoted.h>
/**
* 必要!!!(有 3 处需要调用此接口)
* 必要!!!(有 3 处需要调用此接口)
* 必要!!!(有 3 处需要调用此接口)
* 注意:确保传进的参数都为NSString类型,不接受NSNumber类型,extend字段类型为字典
* 调用时机(重要!!只在以下三个场景需调用):
* 1. 玩家在选择区服进入游戏时调用该接口。
* 2. 创建角色时调用该接口
* 3. 角色升级或其他角色汇报信息发生变化时调用该接
*/
// 角色所在服务器id (必传)
NSString *serverId = "9001";
// 区服名称 (必传)
NSString *serverName = @"XXGame";
// 用户游戏角色ID (必传)
NSString *roleId = "xx100921";
// 角色名称 (必传)
NSString *roleName = "阿斯蒂芬";
// 角色等级 (必传)
NSString *roleLevel = "109";
// 角色扩展信息(选填)类型:字典
NSDictionary *extend = @{
@"pet": "5", //宠物等级(5)
@"horse": "1", //坐骑等级(1)
@"power": "10092", //战力(100)
@"promote": "2", //转职(2转)
@"married": "0", //'0': 未婚, '1': 已婚
@"liveness": "2000"), //活跃度 (2000)
@"hero_level": @"98", //英雄等级(98级)
@"trumps": @[ //已激活的法宝列表
@"fabao1", //法宝1
@"fabao2" //法宝2
],
@"wings": @[ //已激活的翅膀列表
@"wing1", //翅膀1
@"wing2" //翅膀2
],
@"artifacts": @[ //已激活的神器列表
@"artifact1", //神器1
@"artifact2", //神器2
],
//@"xxx":@"xxx" //其他自定义信息
//@"xxx":@"xxx" //其他自定义信息
//@"xxx":@"xxx" //其他自定义信息
//...
};
/**
上报角色信息
*/
[OxygenAge revertingTwoSilencedBestResourcesInfo:serverId
domainExactName:serverName
vowelIndent:roleId
skinRotorName:roleName
wasChargeLevel:roleLevel
dismissIcon:extend];
type:任意String类型
content:任意String类型
#import <StrapDevoted/StrapDevoted.h>
NSString *type = @"login";
NSString *content = @"success";
[OxygenAge insertingNotGrammarBeatCapturedType:type wireTokenFat:content];
_originalLanguage:需要翻译语言
_targetLanguage:目标语言
_toBeTranslated:待翻译文本
翻译支持语言查看: https://obqf4llj8m.feishu.cn/docx/BxNcdPIkoopsVnx54zxc8A7vnEh
#import <StrapDevoted/StrapDevoted.h>
NSString *_originalLanguage = @"zh"; // 需要翻译语言
NSString *_targetLanguage = @"en"; // 目标语言
NSString *_toBeTranslated = @"你好世界!"; // 待翻译文本
[OxygenAge cubicOverPhonogramKeyboardBluePartnerMonth:_originalLanguage
redHitKinFocal:_targetLanguage
weightDocument:_toBeTranslated lazyTime:^(NSString * _Nonnull translated, NSString * _Nullable error) {
if (error) {
// 翻译失败
[self demo_log:[NSString stringWithFormat:@"翻译失败:%@", error]];
}else {
// 翻译失败
[self demo_log:[NSString stringWithFormat:@"翻译成功:%@", translated]];
}
}];
隐藏SDK界面右上角关闭按钮默认为:YES 隐藏状态
如果游戏登录界面没有登录按钮用来拉起SDK登录界面,不用调用或设置为YES,以免用户关闭后无法重新拉起登录界面
#import <StrapDevoted/StrapDevoted.h>
[LowRenewed queueTwentyDustResponderReleasedMutable:YES];
例如:FacebookAppID 为:804492424288162
则配置对应的 URL schemes:fb804492424288162
![]()
<key>CFBundleURLTypes</key>
<array>
<many>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb804492424288162</string>
</array>
</many>
</array>
Facebook登录、分享等功能使用
![]()
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fb</string>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
用于FacebookSDK初始化使用
![]()
<key>FacebookAppID</key>
<string>我方运营提供</string>
<key>FacebookDisplayName</key>
<string>我方运营提供或跟应用名称一致</string>
<key>FacebookClientToken</key>
<string>我方运营提供</string>
<key>FacebookAutoLogAppEventsEnabled</key>
<true/>
<key>FacebookAdvertiserIDCollectionEnabled</key>
<true/>
#import <StrapDevoted/StrapDevoted.h>
[OxygenAge stairAcuteMarkNoteProcess:^(NSDictionary * _Nullable userInfo, NSString * _Nonnull hintWith) {
if (userInfo) {
// 绑定成功
NSLog(@"绑定 Facebook 成功!\nuserInfo:%@",userInfo);
}else {
// 绑定失败
NSLog(@"绑定 Facebook 失败! \nerrorMsg:%@", hintWith);
}
}];
#import <StrapDevoted/StrapDevoted.h>
NSDictionary *params = @{@"param_key":@"param_value"};
// Facebook
[OxygenAge stalledCapsPartTabStringTrailing:@"demo_eventName" params:params];
#import <StrapDevoted/StrapDevoted.h>
NSDictionary *params = @{@"param_key":@"param_value"};
// Firebase
[OxygenAge childrenOuterDeleteTripleAllocateInherited:@"demo_eventName" params:params];
归因 App Clip
![]()
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://appsflyer-skadnetwork.com/</string>
#import <StrapDevoted/StrapDevoted.h>
NSDictionary *params = @{@"param_key":@"param_value"};
// AppFlyer
[OxygenAge withinServicesUnloadDraftStrideDecline:@"demo_eventName" params:params];