Skip to content

LCM iOS SDK 接入指南

若本地文档不显示图片,请直接访问LCM在线文档 账号lcmdoc 密码lcm2019

一.SDK 集成

1.1 集成方式

  • 下载并解压iOS SDK
  • 根据不同环境导入不同的库
环境 接入地区 基础库 lcm 广告 AdvProvider 商店 StoreProvider 推送 PushProvider 绑定 SocialProvider
CN D商店 大陆 必须导入 导入appsflyer、talkingdata 导入DeNACN 无需导入 无需导入
AP D商店 港澳台、日韩 必须导入 咨询市场、运营 导入DeNATW 无需导入 无需导入
无商店 日韩 必须导入 咨询市场、运营 无需导入 无需导入 需要导入

以上结构存在于RC9.5.7以及更老版本,从RC9.6.0开始,CN D商店和 AP D商店进行合并,结构如下:

环境 接入地区 基础库 lcm 广告 AdvProvider 商店 StoreProvider 推送 PushProvider 绑定 SocialProvider
D商店 大陆 必须导入 导入appsflyer、talkingdata 导入StoreProvider 无需导入 无需导入
无商店 日韩 必须导入 咨询市场、运营 无需导入 无需导入 需要导入

注意:
1. D商店对应StoreProvider结构,对于国内游戏接入,需要将login/Wechatlogin/QQshare/Wechat三个插件保留,建议login/Googlelogin/Facebookshare/Facebook删掉。
2. 对于海外游戏接入,需要将login/Googlelogin/Facebookshare/Facebook三个插件保留,建议login/Wechatlogin/QQshare/Wechat删掉。

  • 添加依赖库
  • 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 登录失败
AUTH_SESSION_HEALTHTIME_EXCEED 玩游戏时间过长(RC9.6.0新增)

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 玩家未完成实名认证,无法进行购买

2.7 分享(选接,RC9.6.0新增)

国内暂时支持微信分享,海外支持facebook分享:

- (void)shareToWechat
{
    LCMStoreShareModle *shareModel = [[LCMStoreShareModle alloc] init];
    shareModel.sharePlatformSring = @"wechat";
    shareModel.shareContent = ShareImage;
    shareModel.shareScene = ShareSceneTimeline;
    UIImage *image = [UIImage imageNamed:@"item"];
    shareModel.imageData = UIImageJPEGRepresentation(image, 1.0);
    shareModel.thumbImageData = UIImageJPEGRepresentation([self compressImage:image toByte:30], 1.0);
    if ([LCMSDK isInstalled:shareModel]) {
        [LCMSDK shareThirdPartyShareMode:shareModel success:^(NSDictionary *successDic) {
            NSLog(@"%@",successDic);

        } failure:^(NSDictionary *failureDic) {
            NSLog(@"%@",failureDic);
        }];
    }else { 
        NSLog(@"未安装微信APP无法分享");
    }

}

- (void)shareToFacebook
{
    LCMStoreShareModle *shareModel = [[LCMStoreShareModle alloc] init];
    shareModel.sharePlatformSring = @"facebook";
    shareModel.shareContent = ShareImage;
    shareModel.shareScene = ShareSceneSession;
    UIImage *image = [UIImage imageNamed:@"item"];
    shareModel.imageData = UIImageJPEGRepresentation(image, 1.0);
    [LCMSDK shareThirdPartyShareMode:shareModel success:^(NSDictionary *successDic) {
        NSLog(@"%@",successDic);
    } failure:^(NSDictionary *failureDic) {
        NSLog(@"%@",failureDic);
    }];
}

三.其它功能

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.6.0
日期: 2019.05.17

Back to top