添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
俊逸的罐头  ·  王贵昌·  3 月前    · 
帅气的便当  ·  React Event Handlers ...·  4 月前    · 
大力的凉面  ·  open() — ...·  6 月前    · 
跳到主要内容

海外游戏对接文档--iOS

版本

当前版本及SDK下载

当前版本 1.8.7
SDK下载:sdk: https://quqi.com/s/6/wbfqCS2xRZ8gw2ji

注意

该SDK集成了谷歌、Facebook、Apple第三方登录功能,若应用内自带谷歌、Facebook、Apple登录,运行程序可能会出现 "引用多个第三方库"而引发冲突,

SDK功能

1.初始化 3.用户中心(绑定、切换、游戏社区、问卷奖励) 5.信息上报 6.苹果内购 7.商城评价 8.Firebase云消息功能 9.数数科技用户信息上报

1.工程配置

1.1 U8打包

项目需使用U8工具进行打包,请按照以下步骤进行U8打包

  1. 将U8打包工具放在任意位置,确认channels中MCOOS和common目录下config.json参数是否正确

U8打包common配置

名称 描述
product_name 游戏简称,例如妙酷测试可写为mkcs
AppId U8AppID,可和对接人员确认参数是否正确
AppKey U8AppKey,可和对接人员确认参数是否正确
U8Url U8Url,可和对接人员确认参数是否正确

U8打包config配置 MCOOS目录下config.js配置详解

名称 描述
desc 游戏介绍,可直接填入游戏名称,例如妙库测试
CFBundleIdentifier 项目bundleID
Channel u8渠道,可和对接人员确认参数是否正确
name 渠道名称,默认为MCOOS,请勿修改
key 渠道key,可和对接人员确认参数是否正确
gameID 渠道游戏id,可和对接人员确认参数是否正确
payKey 渠道游戏支付key,可和对接人员确认参数是否正确
channel 渠道,可为空
appsFlyerDevKey AppsFlyer devKey值,需要在appsFlyer进行申请
appleAppID 苹果应用ID,需要在苹果应用后台获取。苹果登录或者绑定与AppsFlyer信息上报必填
googleClientID 谷歌应用ClientID,需要在谷歌应用后台获取。谷歌登录或者绑定必填
fbAppId Facebook应用ID,需要在Facebook应用后台获取。Facebook登录或者绑定必填
fbDisplayNAame Facebook应用名称,需要在Facebook应用后台获取。Facebook登录或者绑定必填
gooleAppId 谷歌应用AppID,需要在谷歌应用后台获取。谷歌登录或者绑定必填
  1. cd进入buildscript目录,执行以下代码
./build.py  游戏工程的xcodeproj文件地址  ../u8test -n
  1. 运行后会选择渠道,输入‘MCOOS’
  2. 成功后会生成 工程名.MCOOS包
  3. 使用XCode打开 工程名.MCOOS包,填入开发者账号

1.2 其他配置

1.SDK包含苹果登录功能,需要在xcode工程的Signing&Capabilities界面加入Sign in with Apple功能。

xcode添加apple登录功能

2.添加Facebook登录功能

!> SDK包含Facebook登录功能,需要在xcode工程新增swift文件,xcode会自动加入桥头文件。

3.消息推送配置 消息推送配置

1.3 问卷功能

需要在surveyHero创建账号,并制作问卷。 SurveyHero文档链接 https://developer.surveyhero.com/api/ 服务端回调请填写该回调: https://ioshk-api.m-co.cn/survey_webhook_response

2.SDK接口

2.1 初始化(必接)

初始化应该在程序启动时调用, 也就是在didFinishLaunchingWithOptions方法里

#import <U8SDKCore/U8SDK+AppDelegate.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *sdkconfig = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"U8SDK"];
[[U8SDK sharedInstance] initWithParams:sdkconfig];
[[U8SDK sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
[[U8Analytics sharedInstance] startLevel:@"1"];
return YES;
}

2.2.1 登录接口

该接口参数可以为空,默认采用IDFV值
登录接口需要在 OnPlatformInit 回调内调用
[[U8SDK sharedInstance] loginCustom:@""];

2.2.2 登出接口

[[U8SDK sharedInstance] logout];

2.3 个人中心接口

[[U8SDK sharedInstance] showAccountCenter];

2.4 上报信息接口(必接)

U8UserExtraData* extraData = [[U8UserExtraData alloc] init];
extraData.dataType = TYPE_ENTER_GAME;
extraData.roleID = @"testRole";
extraData.roleName = @"角色名称";
extraData.serverID = 1;
extraData.serverName = @"第一区";
extraData.roleLevel = @"1";
extraData.moneyNum = 100;
extraData.roleCreateTime = time(NULL);
extraData.roleLevelUpTime = time(NULL)
//extraData.eventName = @"af_xxxxxx"; //若dataType为TYPE_OTHER_EVENT时,eventName为必填项,af上报的事件名
[[U8SDK sharedInstance] submitExtraData:extraData];

调用 U8User.getInstance().submitExtraData(UserExtraData extraData),其中,UserExtraData就是游戏内玩家的数据,比如在选择服务器时,extraData中的dataType为 TYPE_SELECT_SERVER

data_type值 含义 value
TYPE_SELECT_SERVER 选择服务器 1
TYPE_CREATE_ROLE 角色创建 2
TYPE_ENTER_GAME 进入游戏 3
TYPE_LEVEL_UP 角色升级 4
TYPE_EXIT_GAME 退出游戏 5
TYPE_SHOW_RV 看完广告 6
TYPE_DEVICE_START 设备启动 7
TYPE_LOGIN_PID 设备PID登陆成功 8
TYPE_BIND_ACCOUNT 绑定账号成功 9
TYPE_DEVICE_ENTER_GAME 设备成功进入游戏 10
TYPE_DEVCIE_ENTER_SERVER 设备开始进入服 11
TYPE_OTHER_EVENT 其他上报信息 12
TYPE_TUTORIAL_COMPLETION 角色完成引导 13
TYPE_LOGIN_ROLE 角色登录 14
TYPE_DEVICE_LOAD 设备加载过程,可能会分几步,所以此上报需要填写lodingEvent字段 15
TYPE_RETENTION_2 留存两天 16
TYPE_RETENTION_3 留存三天 17

!> 选择服务器时,因为还没有进入游戏,无法知道角色数据,extraData中只需要传入服务器信息即可。

关于U8UserExtraData 数据结构,其中设备加载过程需填写loadingEvent字段值

!> 当data_type值为TYPE_OTHER_EVENT时,将会上报AF与Firebase事件,事件名只能由数字、字母和下划线组成

参数名称 参数类型 参数说明
dataType int 调用时机
serverID String 玩家所在服务器的ID
serverName String 玩家所在服务器的名称
roleID String 玩家角色ID
roleName String 玩家角色名称
roleLevel String 玩家角色等级
moneyNum String 当前角色身上拥有的游戏币数量
roleCreateTime long 角色创建时间,从1970年到现在的时间,单位秒,必须传入真实的数据,否则UC审核不过
roleLevelUpTime long 角色等级变化时间,从1970年到现在的时间,单位秒
vip String 玩家VIP等级
loadingEvent String 表示加载过程的不同阶段,格式为loading_xxx
eventName String 当data_type值为TYPE_OTHER_EVENT时必填,af上报的事件名
param NSDictionary af上报事件的参数

2.5 商城评价

[[U8SDK sharedInstance] storeReview:@"test_test"];
参数传入触发条件

2.6 订阅恢复(选接)

//用户点击订阅恢复时,游戏需传入的参数
//params(NSDictionary类型)中的参数如下:
//extra:订阅恢复时,游戏透传的参数
//serverId:玩家所在服id
[[U8SDK sharedInstance] restoreCompletedTransactions:params];

2.7 获取商品信息(选接)

[[U8SDK sharedInstance] getProductsInfo];

2.8 获取商品回调

productArray(NSMutableArray类型)(包含NSDictionary数据的数组):
//NSDictionary中的参数如下:
//product_id:商品id
//price:价格
//symbol:货币符号
//title:本地化商品名称
//localizedDescription:本地化描述(1.8.7.1新增)
//priceAmountMicros:价格,与price返回相同(1.8.7.1新增)
//countryCode:区域设置的国家或地区代码。国家或地区码的示例包括“GB”、“FR”和“HK”(1.8.7.1新增)
//priceCurrencyCode:区域设置的货币代码。示例货币代码包括“USD”、“EUR”和“JPY”(1.8.7.1新增)

-(void) OnProductsInfoBack:(NSMutableArray*)productArray
{
NSLog(@"%@", productArray);//
}

返回值举例:

[
{
countryCode = CN;
localizedDescription = "\U6309\U6708\U7eed\U8d39\U6309\U6708\U7eed\U8d39\U6309\U6708\U7eed\U8d39\U6309\U6708\U7eed\U8d39\U6309\U6708\U7eed\U8d39\U6309\U6708\U7eed\U8d39";
price = 10;
priceAmountMicros = 10;
priceCurrencyCode = CNY;
"product_id" = "com.miaoju.iap.auto.month";
symbol = "\U00a5";
title = "\U6309\U6708\U7eed\U8d39";
}
]

2.9 支付充值(必接)

U8ProductInfo* productInfo = [[U8ProductInfo alloc] init];
productInfo.productName = @"礼包1";
productInfo.productDesc = @"礼包1";
productInfo.productId = @"libao1";
productInfo.price = [NSNumber numberWithInt:30];
productInfo.buyNum = 1;
productInfo.coinNum = 900;
productInfo.userName = @"test001";
productInfo.roleId = @"12345";
productInfo.roleName = @"角色";
productInfo.roleLevel = @"66";
productInfo.serverId = @"1";
productInfo.serverName = @"桃源";
productInfo.vip = @"1";
productInfo.notifyUrl = @"http://110.54.33.45/game/pay/notify"; //普通支付notifyUrl
productInfo.subNotifyUrl = @"http://andtest-api.m-co.cn/subtest.php";//订阅支付notifuUrl
NSMutableArray *detailArr = [[NSMutableArray alloc] init];
NSDictionary *dic = @{
@"mj_daoju_id":@"id111", //道具id,游戏自己定义
@"mj_daoju_name":@"name111",//道具名称,游戏自己定义
@"mj_daoju_type":@"type111",//道具类型,游戏自己定义
@"mj_daoju_value":@(0),//道具价值,游戏自己定义
};
[detailArr addObject:dic];
productInfo.productDetails = detailArr;
[[U8SDK sharedInstance] pay:productInfo];

关于U8ProductInfo对象:

参数名称 参数类型 参数说明
productId NSString 充值商品ID,游戏内的商品ID
productName NSString 商品名称,比如100元宝,500钻石...
productDesc NSString 商品描述,比如 充值100元宝,赠送20元宝
price Number 充值金额$\color{red}{单位:美元}$
buyNum NSInteger 购买数量,一般都是1
coinNum NSInteger 玩家当前身上剩余的游戏币
userName NSString 玩家唯一标识
serverId NSString 玩家所在服务器的ID
serverName NSString 玩家所在服务器的名称
roleID NSString 玩家角色ID
roleName NSString 玩家角色名称
roleLevel NSString 玩家角色等级
vip NSString 玩家vip等级
notifyUrl NSString 游戏服务器支付回调地址,渠道SDK支付成功,异步通知U8Server,U8Server根据该地址,通知游戏服务器发货
subNotifyUrl NSString 游戏服务器订阅回调地址,渠道SDK订阅成功,异步通知U8Server,U8Server根据该地址,通知游戏服务器发货
extension NSString 支付成功之后,U8Server通知游戏服务器时,原样返回给游戏服务器
productDetails NSArray 道具详情。非必填参数,但若需要填入该参数,请按照代码实例的内容进行编写

2.10 Naver社区

主页横幅功能

//参数:传入当前UIViewController
-(void)displayNaverBanner:(UIViewController *)mainView;

例子

[[U8SDK sharedInstance] displayNaverBanner:self];

维护用横幅

//参数:传入当前UIViewController
-(void)displaySorry:(UIViewController *)mainView;

例子

[[U8SDK sharedInstance] displaySorry:self];

跳转公告栏

//参数:mainView 传入当前UIViewController
//参数:boardId 公告栏ID
-(void)displayBoard:(UIViewController *)mainView boardId:(NSNumber *)boardId;

例子

[[U8SDK sharedInstance] displayNaverBoard:self boardId:@(1)];

2.11 数数上报

2.11.1 数数科技用户属性设置

//eventType: 0:发送事件;1:用户数据上报set;2:用户数据上报setOnce;3:用户数据上报add;4.公共属性上报;6.一次性事件上报
//trackName:事件名称,当eventType=0或eventType=6时必传,其他情况可不传
//infoDic :上报属性数据。当eventType=0或eventType=6时,infoDic可不传;其他情况必传,字典项
-(void)submitTAInfo:(int)eventType trackName:(NSString *)trackName info:(NSDictionary *)infoDic

2.11.2 获取数数预置属性

返回事件预置属性的Key以"#"开头

-(NSDictionary *)getTAPresetProperties;

2.12 问卷功能接口

初始化问卷

参数
roleID : 角色id
serverID : 服务器id
callbackUrl : 问卷奖励回调地址
-(void)initUserSurver:(NSString *)roleID serverID:(NSString *)serverID callbackUrl:(NSString *)callbackUrl

若有问卷可以显示将收到OnInitUserSurveySuccess回调,此时可显示进入问卷中心入口

打开问卷中心界面

若游戏收到OnInitUserSurveySuccess回调可显示问卷中心入口,此时可以调用以下方法

-(void) openUserSurvey;

2.13 激励视频广告接口

参数名称 参数说明 是否必填
productName 广告位置,可用来标识具体广告位置,需在IronSource后台配置, 为空时,由IronSource返回默认视频奖励
roleID 游戏角色ID
extra 游戏透传参数,在服务端回调时会原样返回
callbackUrl 用户激励视频回调地址
NSDictionary *dic = @{
@"productName" : @"xxx",
@"roleID":@"roleIDxxx",
@"extra":@"extraxxxxx"
@"callbackUrl":@"xxx"
};
[[U8SDK sharedInstance] rewardedVideo:dic];

2.14 获取用户信息(选接)

-(void)getUserInfoBack:(void (^)(id result))successCallBack failCallBack:(void(^)(id error))failCallBack

参考:

[[U8SDK sharedInstance] getUserInfoBack:^(id result) {
NSLog(@"获取用户信息成功,info = %@",result);
} failCallBack:^(id error) {
NSLog(@"获取用户信息失败,error = %@",error);
}];
成功返回例子:
{
"userID" : 171795,
"sdkUserID" : "2F14BBEA-BBF3-4170-986F-20D3C0F1A507",
"country" : "TW",
"regTime" : "2022-07-11 15:10:59",
"currentCountry" : "TW",
"retainedDays" : 3,
"totalCharge" : 0,
"totalChargeNum" : 0
}
失败返回例子:
{
"state":3,
"errorMsg":"xxxxxx"
}

其中获取用户信息成功返回内容

参数名称 参数说明
userID 用户唯一标识
sdkUserID 平台userid
country 注册国家
firstChargeTime 首次付费时间
lastChargeTime 最近一次付费时间
regTime 注册时间
retainedDays 活跃天数
sdkUserID 平台userid
totalCharge 总充值金额
totalChargeNum 总充值次数
currentCountry 当前登录国家

2.15 切换账号接口

-(void)switchAccount;

2.16 绑定账号接口

-(void)bindAccount;

2.17 弹窗引导配置开启消息

弹窗触发频次: 1)每个设备一周(7天)最多弹出2次;超过2次后,一周内不再弹出 2)一天最多弹出一次(0-24点算一天) 3)用户开启后,该用户不再弹出 4)app删除重装后,重新计算次数

-(void)openNotificationAlert;

调用示例

[[U8SDK sharedInstance] openNotificationAlert];

3.AppDelegate事件处理

需要在AppDelegate以下对应的生命周期方法中调用U8SDK种对应这些方法:

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[[U8SDK sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo
{
[[U8SDK sharedInstance] application:application didReceiveRemoteNotification:userInfo];
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[[U8SDK sharedInstance] application:application didReceiveRemoteNotification:userInfo];
}
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
[[U8SDK sharedInstance] application:application didReceiveLocalNotification:notification];
}
- (void)applicationWillResignActive:(UIApplication *)application {
[[U8SDK sharedInstance] applicationWillResignActive:application];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[U8SDK sharedInstance] applicationDidEnterBackground:application];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[U8SDK sharedInstance] applicationWillEnterForeground:application];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[U8SDK sharedInstance] applicationDidBecomeActive:application];
}
- (void)applicationWillTerminate:(UIApplication *)application {
[[U8SDK sharedInstance] applicationWillTerminate:application];
}
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [[U8SDK sharedInstance] application:application handleOpenURL:url];
}
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [[U8SDK sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
}

需要在AppDelegate中还需遵循UNUserNotificationCenterDelegate协议,并在下列协议声明方法中调用U8SDK方法响应这些方法

AppDelegate.h

#import <UserNotifications/UNUserNotificationCenter.h>
#import <UserNotifications/UNNotification.h>
#import <UserNotifications/UNNotificationContent.h>
#import <UserNotifications/UNNotificationRequest.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>

@property (strong, nonatomic) UIWindow *window;


@end

AppDelegate.m

/**
UNUserNotificationCenter delegate
*/
-(void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
NSDictionary *userInfo = notification.request.content.userInfo;
NSLog(@"userInfo1 = %@",userInfo);
return [[U8SDK sharedInstance] userNotificationCenter:center willPresentNotification:notification withCompletionHandler:completionHandler];
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler{
return [[U8SDK sharedInstance] userNotificationCenter:center didReceiveNotificationResponse:response withCompletionHandler:completionHandler];
}

4.设置U8SDK回调代理

在初始化成功后, 还需要设置U8SDK的回调函数, 回调对象需要实现U8SDKDelegate的各个接口

[[U8SDK sharedInstance] setDelegate:self];

渠道SDK中初始化成功,登录成功,登出成功,支付成功等,会回调到该接口。 可以参考u8sdkdemo中DemoViewController.m中这些接口的实现。

-(UIView *)GetView
{
return [self GetViewController].view;
}
-(UIViewController *)GetViewController
{
return self;
}

4.1 初始化成功回调

初始化成功后再进行登录操作。

-(void) OnPlatformInit:(NSDictionary*)param
{
[self SendCallback:"OnInitSuc" withParams:param];
}

数数访客ID,游戏服务端上报数数数据用到,初始化成功后可以获取

- (NSString *)getDistinctID;

//例子
NSString *distincetId = [[U8SDK sharedInstance] getDistinctID];
NSLog(@"distincetId %@",distincetId);

AppsFlyer UID,初始化成功后可以获取

- (NSString *)getAfID;

//例子
NSString *afId = [[U8SDK sharedInstance] getAfID];
NSLog(@"afId = %@",afId);

4.2 登录回调

//param(NSDictionary类型)中的参数如下:
//userID:U8Server生成的唯一用户ID
//sdkUserID:渠道SDK平台用户唯一ID,游戏服务器需要将游戏账户ID和该sdkUserID进行绑定。
//username:U8Server生成的用户名,比如234234234.mco, 4353453453.baidu, 65756756756.uc
//sdkUserName:渠道SDK平台用户名,可能为空,部分渠道SDK没有返回用户名
//token:U8Server生成的会话ID,游戏服务器拿该字段去U8Server做二次登录验证
//extension:U8Server返回的扩展字段,部分渠道SDK需要,游戏中无需使用该字段的值
//timestamp:U8Server生成的时间戳,游戏服务器去U8Server做二次登录验证时,传给U8Server
//third_login_type 第三方登陆类型 0:游客 1:Google,2:facebook,3:apple
-(void) OnUserLogin:(NSDictionary*)param
{
[self SendCallback:"OnLoginSuc" withParams:param];
}

4.3 支付回调

一般不需要做逻辑处理,最终支付成功,以U8Server回调通知到游戏服务器为准。