LCM iOS SDK 接入指南
一.SDK 集成
1.1 集成方式
- 下载并解压iOS SDK
- 根据不同环境导入不同的库
环境 | 接入地区 | 基础库 lcm | 广告 AdvProvider | 商店 StoreProvider | 推送 PushProvider | 绑定 SocialProvider |
---|---|---|---|---|---|---|
CN D商店 | 大陆 | 必须导入 | 导入appsflyer、talkingdata | 导入DeNACN | 无需导入 | 无需导入 |
AP D商店 | 港澳台、日韩 | 必须导入 | 咨询市场、运营 | 导入DeNATW | 无需导入 | 无需导入 |
无商店 | 日韩 | 必须导入 | 咨询市场、运营 | 无需导入 | 无需导入 | 需要导入 |
- 添加依赖库
SystemConfiguration.framework
AVFoundation.framework
ImageIO.framework
AdSupport.framework
CoreLocation.framework
CoreMotion.framework
Security.framework
CoreTelephony.framework
StoreKit.framework
libz.tbd
libc++.tbd
-
libsqlite3.0.tbd
-
工程里新建 并 配置
appInfo.json
(可以copypickle
工程里面的到游戏项目里)
{"appVersion":"1.0","sandbox":"false","region":"cn"}
参数 说明 appVersion 游戏版本:例如 1.0.1 sandbox 是否是沙箱环境:正式服为true,沙箱服为false region 地区:大陆为cn,海外游戏为 ap -
点击项目->点击
Build Setting
->搜索Other Linker Flags
->添加-ObjC
- 推送设置:如果游戏有推送功能,点击项目->点击
Capabilities
->搜索Push Notifications
->打开NO
- 点击项目->点击
Capabilities
->搜索Keychain Sharing
->打开NO
,并添加以下: com.store.denacn.shared
com.LCM.shared
com.denachina.lcm
com.store.denatw.shared
com.mobage.shared
- 点击项目->点击
Info
,为Info.plist
添加3个权限:(相机和相册权限是RC9.5.3
开始加入,保存游戏截图到相册权限是RC9.5.5
加入)
<key>NSCalendarsUsageDescription</key>
<string>需要使用日历</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需同意保存游戏截图到相册</string>
<key>NSCameraUsageDescription</key>
<string>允许访问相机</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>允许访问相册</string>
1.2 配置微信、QQ登录
1.3【非必接】配置Link/Load(绑定)
二.初始化SDK
2.1 导入头文件
-
在工程的
AppDelegate.m
里面导入头文件#import <lcm/LCMAPI.h>
-
并且实现协议
<LCMEventHandler>
@interface AppDelegate ()<LCMEventHandler>
- (void) onRemoteMessage:(NSString *)message withExtras:(NSString *)extras{
NSLog(@"message: %@, extras: %@",message,extras);
}
-(void) onLoginComplete:(NSString *)accessToken withUser:(LCMUser *)user{
NSLog(@"onLoginComplete: %@",accessToken);
}
- (void) onSessionError:(LCMError *)error{
NSLog(@"lcmerror: %@",error.errorMessage);
}
- (void) onSessionUpdate:(NSString *)accessToken withUser:(LCMUser *)user{
NSLog(@"user info: %@",user/*[user toDictionary]*/);
}
- (void) onLogoutComplete:(NSString *)extra{
}
- (void) onInitComplete:(LCMInitializer *)initializer{
if (initializer.error) {
NSLog(@"onInitError: %@", initializer.error.errorMessage);
}else{
NSLog(@"InitComplete");
[initializer continueProcessing];
}
}
-(void)onAdditionalOrder:(NSDictionary *)extras withError:(LCMError *)error{
if(error){
NSLog(@"订阅 或 补单 失败");
}
}
2.2 初始化SDK
【PS:老游戏(接过9.5.3之前版本)忽略,新游戏对接,需要在调用[LCMSDK init:self WithOptions:launchOptions]
之前调用[LCMSDK setSDKProxy:[XXXclass class]]
,XXXclass
为实现了<LCMEventHandler>
的封装LCM SDK
方法的实现类】
在工程的AppDelegate.m
里面导入头文件- (BOOL)application: application: didFinishLaunchingWithOptions:
里添加LCM的初始化方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//在viewController之后调用init初始化,以防在某些回调中使用viewController时对象还未生成
[LCMSDK init:self WithOptions:launchOptions];
return YES;
}
2.3 onSessionError:
处理
游戏研发需要在回调函数onSessionError:
,判断对应的错误码类型,展示对应的错误信息弹窗。
error.errorCode | 说明 |
---|---|
AUTH_SESSION_OCCUPIED |
账号已在异地登录 |
AUTH_USER_FREEZE_TEMPORARY |
账户已被临时冻结 |
AUTH_USER_FREEZE_PERMANENT |
账户已被永久冻结 |
AUTH_STORE_PROVIDER_ERROR |
登录失败 |
2.4 登陆后公告检测
游戏研发在onLoginComplete: withUser:
回调里面调用[LCMSDK checkAnnouncement];
接口。
2.5 获取商品列表
游戏研发需要调用[LCMVCBundle getAsList:]
获取商品信息,商店里展示获取的商品列表,另外玩家点击购买调用[bundle buy: withCallback:]
接口。
/**
* 【支付接入】
* 推荐App在应用初始化的阶段就获取相关的应用内可购买道具
* 获取可被购买的道具列表,并保存在内存中,以便之后购买
**/
[LCMVCBundle getAsList:^(NSArray *bundles, LCMError *error) {
if(error){
NSLog(@"fetchVCBundle error, errorCode %ld, errorMessage: %@",(long)error.errorCode,error.errorMessage);
}else{
for (LCMVCBundle *vcBundle in bundles) {
NSLog(@"%@", vcBundle.sku);
}
}
}];
2.6 购买商品
当玩家点击商品购买时触发[bundle buy: withCallback:]
购买行为,当error
存在时,游戏接入方需要展示对应的错误类型;当error
不存在时,即购买成功,需要研发告知游戏客服端购买成功,进行发放道具相关逻辑。
[bundle buy:@"" withCallback:^(LCMWallet *wallet, NSDictionary *payInfo, NSString *memo, LCMError *error) {
if (error) {
NSLog(@"error: %@",error.description);
}else{
}
}];
补充LCMError
错误类型:
error.errorCode | 说明 |
---|---|
406 | 支付通道关闭 |
410 | 账户异常,请联系客服 |
BANK_PURCHASE_IS_LOCKED_ERROR |
上笔订单未完成,无法创建新订单 |
BANK_PURCHASE_USER_CANCEL |
玩家取消了购买 |
REAL_NAME_CANCEL_AND_NOT_SKIP |
玩家未完成实名认证,无法进行购买 |
三.其它功能
3.1 登录/退出登录
-
登录
[LCMSDK login];
- 退出登录[LCMSDK logout];
3.2 Menubar控制
-
隐藏
Menubar
[LCMSDK hideMenubar];
- 显示Menubar
[LCMSDK showMenubar];
-
显示
Menubar
,按照指定位置[LCMSDK showMenubarWithPosition:(int)position];
参数 | 说明 |
---|---|
MENUBAR_POSITION_LEFT_TOP |
Menubar 显示在左上角 |
MENUBAR_POSITION_RIGHT_TOP |
Menubar 显示在右上角 |
MENUBAR_POSITION_LEFT_BOTTOM |
Menubar 显示在左下角 |
MENUBAR_POSITION_RIGHT_BOTTOM |
Menubar 显示在右下角 |
- 在
Info.plist
配置MenuBarPosition
(Number类型)参数,控制Menubar
默认显示的位置
参数 | 说明 |
---|---|
-1 | Menubar 默认不显示 |
0 | Menubar 默认显示在左上角 |
1 | Menubar 默认显示在右上角 |
2 | Menubar 默认显示在左下角 |
3 | Menubar 默认显示在右下角 |
3.3【必接】游戏事件打点
[LCMSDK setExtra:@"CreateRole" withDetail:json];
详细参考
3.4【非必接】帐号绑定/载入/解绑第三方账户(Link/Load)
3.5 调起客服
[LCMSDK showCSInViewController];
3.6 调起账户页面
[LCMSDK additionalFunction:STORE_ACCOUNT_MANAGER];
3.7 本地推送
3.8 LCM SDK
log开启、关闭
在Info.plist
配置debugLog
(Boolean类型)参数,YES
为开启日志,NO
为关闭日志。
3.9 海外版本语言国际化配置
3.x.1 客服界面错屏处理
在Info.plist
配置LCMBlackDeal
(Boolean类型)参数YES
。
3.x.2 苹果评分
[LCMSDK requestReview:(NSString*)appID];
四.SDK UI自定义
4.1 激活码自定义UI
/**
* 【onActivation】
* LCMSDK必接接口
* LCMSDK的激活码事件回调函数,
* App会在登录时获取激活码信息(若配置),
* 如果发现需要激活码再能进入,会在此回调中返回游戏相关内容,
* 游戏需要在此回调中绘制UI请求用户输入激活码,
* 调用[LCMSDK authCode:code]函数,将激活码告诉LCMSDK,
* 当游戏需要LCMSDK继续之后的登录流程时,可以调用[activation continueProcessing],
* 否则LCMSDK会停止在当前流程
**/
- (void) onActivation:(LCMActivation *) activation{
//使用默认UI提示用户填写激活码
/**
* 以下是自定义UI的代码示例
//设置激活码到LCMSDK
[LCMSDK authCode:code];
//继续后续流程
[activation continueProcessing];
**/
[activation showDefaultUI];//自定义UI需要注释掉该默认UI接口
}
4.2 强更自定义UI
/**
* 【onUpdate】
* LCMSDK必接接口
* LCMSDK的更新事件回调函数,
* App会在打开时获取更新信息(若配置),
* 如果发现可用更新,会在此回调中返回游戏更新内容,
* 游戏需要在此回调中绘制UI展现更新内容,
* 游戏可以调用[updater install]直接跳转AppStore进行更新,
* 当游戏需要LCMSDK继续之后的登录流程时,可以调用[updater continueProcessing],
* 否则LCMSDK会停止在当前流程
**/
- (void) onUpdate:(LCMUpdater *)updater{
NSLog(@"%@", updater.toJSONString);
//App请绘制自己的UI提供最好的用户体验,不到万不得已,请不要使用默认UI
/**
* 以下是自定义UI的代码示例
if (isConfirm) {
//判断该更新是否可跳过
if (updater.canSkip) {
//在可跳过的情况下,才继续后续流程,否则停止在当前流程
[updater continueProcessing];
}
//不管是否可跳过,用户点击确认更新时,执行install跳转Appstore进行更新
[updater install];
}else{
//用户点击取消,跳过强制更新,仅在更新被配置为可跳过的情况下才会显示取消按钮
[updater continueProcessing];
}
**/
[updater showDefaultUI];//自定义UI需要注释掉该默认UI接口
}
4.3 公告自定义UI
/**
* 【onAnnouncement】
* LCMSDK必接接口
* LCMSDK的公告获取事件回调函数,
* 注意:主动查下与登陆前公告都会回调到这个接口,
* App会在打开时获取公告(若配置),
* 如果发现可用公告,会在此回调中返回游戏公告内容,
* 游戏需要在此回调中绘制UI展现公告,
* 当游戏需要LCMSDK继续之后的登录流程时,可以调用[announcement continueProcessing],
* 否则LCMSDK会停止在当前流程
**/
- (void) onAnnouncement:(LCMAnnouncement *)announcement{
NSLog(@"%@",announcement.toJSONString);
//App请绘制自己的UI提供最好的用户体验,不到万不得已,请不要使用默认UI
if (announcement.isBeforeLoginAnnouncement) {
[announcement showDefaultUI:^() {}];//自定义UI需要注释掉该默认UI接口
}else {
//首先判断是否有登陆后公告,如果没有就不显示
if (announcement.error && announcement.error.errorType == ANNOUNCEMENT_NONE_ERROR) {
NSLog(@"onAnnouncement:%@", announcement.error.description);
}else {
[announcement showDefaultUI:^() {}];//自定义UI需要注释掉该默认UI接口
}
}
}
五.常见问题
5.1 SDK初始化失败?
- 检查一下
bundle id
是否正确(或是跟LCM确认下bundle id
是否配置),LCM 服务器端对bundle id
有校验,如果不正确会初始化失败。
5.2 证书相关问题?
- 如果是DeNA内部的研发,证书是由LCM这边提供;外部研发需要自己公司申请证书相关,游戏出包后会由LCM打包工具进行重新签名。
5.3 购买失败?
- 检查当前设备
App Store
地区是否正确 - 咨询运营检查OPE后台商品配置是否正确
- 咨询HO同学苹果后台商品是否配置正确
5.4 报‘No LCMSTOREPROVIDER found.’错误?
- 检查D商店是否导入,可以尝试删除重新导入
- 检查导入的D商店库是否和
appInfo.json
里的region
对应 - 检查是否添加
-ObjC
六.联系方式
- 技术 QQ 群 :
878394398
LCM SDK
邮箱:sdk-app_cn@dena.jp
版本:RC 9.5.7
日期: 2019.03.12