Skip to content

LCM iOS SDK 接入指南

若本地文档不显示图片,请直接访问LCM在线文档

一.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 无需导入 无需导入
无商店 日韩 必须导入 咨询市场、运营 无需导入 无需导入 需要导入

RC9.6.1新增日志LogProvider(可选,LCM建议必接,游戏只需拖入工程,无接口对应):

RC9.6.3目录结构调整,将QQ微信Facebook三方库整合到公共三方文件夹PublicThirdLib,另外将StoreProvider目录下的share 提升到ShareProvider目录内。

注意(为了防止苹果审核出问题,海外不要有微信、QQ相关,国内不要有Google、Facebook相关):
1. 对于国内D商店游戏接入,需要将SocialProviderStoreProvider/login/GoogleStoreProvider/login/FacebookShareProvider/FacebookPublicThirdLib/Facebook删掉。
2. 对于海外D商店游戏接入,需要将SocialProviderStoreProvider/login/WechatStoreProvider/login/QQShareProvider/WechatShareProvider/TencentQQPublicThirdLib/TencentQQPublicThirdLib/Wechat删掉。
3. 对于海外无商店游戏接入,需要将StoreProviderShareProvider/WechatShareProvider/TencentQQPublicThirdLib/TencentQQPublicThirdLib/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 配置第三方登录

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新增)

国内暂时支持微信、QQ分享,海外支持facebook分享;
分享不一定有回调,不可依赖分享回调,只要调用了分享,默认按成功处理。

2.7.1 接口分享

- (void)shareToWechat
{
    LCMShareModel *shareModel = [LCMShareModel new];
    shareModel.platformType = LCMSharePlatformWechat;// 分享渠道-微信
    shareModel.sceneType = LCMShareSceneTimeline;// 分享场景-朋友圈
    shareModel.contentType = LCMShareContentImage;// 内容类型-图片分享
    shareModel.title = @"分享标题";
    shareModel.descriptionText = @"分享描述";
    shareModel.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"bg"]);
    shareModel.thumbImageData = UIImagePNGRepresentation([UIImage imageNamed:@"icon"]);

    [LCMSDK share:shareModel success:^{
        NSLog(@"微信分享成功");
    } failure:^(NSError *error) {
        NSString *msg = [NSString stringWithFormat:@"微信分享失败,原因:%@", error.userInfo];
        NSLog(@"%@", msg);
    }];  
}

- (void)shareToQQ
{
    LCMShareModel *shareModel = [LCMShareModel new];
    shareModel.platformType = LCMSharePlatformQQ;// 分享渠道-QQ
    shareModel.sceneType = LCMShareSceneTimeline;// 分享场景-好友
    shareModel.contentType = LCMShareContentURL;// 内容类型-链接分享
    shareModel.shareURL = @"https://www.mobage.cn/";
    shareModel.title = @"分享标题";
    shareModel.descriptionText = @"分享描述";

    [LCMSDK share:shareModel success:^{
        NSLog(@"QQ分享成功");
    } failure:^(NSError *error) {
        NSString *msg = [NSString stringWithFormat:@"QQ分享失败,原因:%@", error.userInfo];
        NSLog(msg);
    }];
}

- (void)shareToFacebook
{
    LCMShareModel *shareModel = [LCMShareModel new];
    shareModel.platformType = LCMSharePlatformFacebook;// 分享渠道-FB
    shareModel.sceneType = LCMShareSceneTimeline;// 分享场景-好友
    shareModel.contentType = LCMShareContentURL;// 内容类型-链接分享
    shareModel.shareURL = @"https://www.mobage.cn/";
    shareModel.title = @"分享标题";
    shareModel.descriptionText = @"分享描述";

    [LCMSDK share:shareModel success:^{
        NSLog(@"FB分享成功");
    } failure:^(NSError *error) {
        NSString *msg = [NSString stringWithFormat:@"FB分享失败,原因:%@", error.userInfo];
        NSLog(msg);
    }];}

2.7.2 截屏分享

[LCMSDK screenshotShare:^{
            NSLog(@"截屏分享成功");
        } failure:^(NSError *error) {
            NSLog(@"截屏分享失败,原因:%@", error.description);
        }];

接口调用后、分享页面如下所示:

三.其它功能

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];

3.x.3 快捷指令(苹果推荐位加分项)

a、工程配置
    <1>info.plist配置
        在info.plist中增加NSUserActivityTypes项(Array类型),
        并在该项下增加一项 值为:包名+'.LCMShortcuts',
        例如包名为com.denachina.pickle,则添加项目为'com.denachina.pickle.LCMShortcuts'  
    <2>添加权限
       Xcode10以及之前版本,请在Capabilities中打开Siri权限
       Xcode11+,请在Signing & Capabilities中添加Siri权限
       如果添加权限失败,请找LCM支持同学,需要在苹果开发者后台开通Siri权限。
b、调用示例代码
/*@func  加载默认快接指令-简洁接口
 *@param title标题、Siri与搜索会用到
 *@param receiveBlock 用户唤起快接指令回调;假如您定义的快接方式为打开游戏Boss副本,收到此回调后,进入该Boss副本.
 *注意:必须配置快接方式类型到info.plist->NSUserActivityTypes下,格式为 包名+'.LCMShortcuts'
 */
[LCMRecommendedShortcutWrapper loadShortcuts:@"打开游戏Boss副本" receiveShortcuts:^{
        NSLog(@"收到快接指令回调,打开游戏Boss副本");
        // 游戏代码...
    }];
c、测试
游戏运行一次后,做如下操作
  <1>从苹果商店下载快捷指令APP、可以添加本游戏为快捷指令,点击所设快捷指令,可以打开游戏;
  <2>iOS9.0+ 可以在搜索(Spotlight)中 键入所设置title(示例代码为打开游戏Boss副本),可以搜索到本游戏;
  <3>打开Siri、语音说出所设置title(示例代码为打开游戏Boss副本),即可打开游戏。

四.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接口
        }
    }
}

4.4 自定义web客服

//type 为1是,是web表单客服。

[LCMSDK showCSInViewController:(NSUInteger) type;

五.常见问题

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.3 日期: 2019.09.16

Back to top