12/12/2024 11:37:55
Line 渠道说明
一、开发者平台配置
Android系统,MSDK5.15版本(包括5.15)之后,由于官方Line-SDK的限制,MSDKLine模块不支持Internal构建方式打包。
1.1 注册账号
业务需自行去 LINE 平台 申请 App 并配置好基础信息。
1.2 新建Provider
1.3 设置应用信息
二、Android 工程配置
[info] 版本须知 由于 Line SDK 只兼容 miniSdkVersion >= 17,所以在 Android 4.2 以下系统上运行可能会存在问题,建议游戏设置 minSdkVersion >= 17。
Android系统,MSDK5.15版本(包括5.15)之后,由于官方Line-SDK的限制,MSDKLine模块不支持Internal构建方式打包。
2.1 AndroidManifest.xml 配置
<uses-permission android:name="android.permission.INTERNET" />
2.2 build.gradle 文件 android 节点下设置
android{
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
[info] 由于LINE渠道引入了 Java8 的新特性,所以在gradle文件中设置强制使用 Java8
2.3 MSDKConfig.ini 文件设置
在 assets/MSDKConfig.ini 文件中,增加或修改如下配置:
[Line 渠道配置]
LINE_CHANNEL_ID = {YOUR_LINE_CHANNEL_ID}
LINE_UNIVERSAL_LINK_IOS = {YOUR_LINE_UNIVERSAL_LINK}
LINE_CHECK_SDK_VERSION_ENABLE = 1
[info]
- 替换 {YOUR_LINE_CHANNEL_ID} 为业务在 Line 开发者平台上申请的 ChannelID
- 替换 {YOUR_LINE_UNIVERSAL_LINK} 为业务在 Line 开发者平台上填写的 iOS universal link 。如果没有开启可不填,可参照 3.2 UniversalLink配置 部分
- LINE_CHECK_SDK_VERSION_ENABLE 用于校验运行设备的 Android 系统版本,如果设备系统版本在 Android 4.2以下时,调用 Line 渠道相关接口,会返回不支持。该开关 ‘默认开启’,如果想关闭可以设置为 0,但是需要业务评估风险。
- 在iOS平台,在MSDK5.15之前的ChannelID是在info.plist中的LineSDKConfig中获取(参照 3.1部分),在MSDK5.15及之后优先读取info.plist的LineSDKConfig中的ChannelID,如果获取参数为空否】则从MSDKConfig.ini中读取LINE_CHANNEL_ID配置。
2.4 各版本引擎对 Java8 兼容性处理须知
1)Unity4.x,Unity5.x 兼容处理
Android系统,在MSDK5.15之前,使用最新的 DexMerge 工具来解决方法数超过65536的问题。
Android系统,在MSDK5.15版本(包括5.15)之后,由于官方Line-SDK的限制,MSDKLine模块不支持Internal构建方式打包。
2)Unity 2017-2019、UnrealEngine 兼容处理
- Android Gradle 升级到 3.2 ,并配置 Java8 支持。
- Unity Gradle 升级到 4.6 或者以上版本。(MSDK已验证:Unity 2017 最高升到 4.6,其他升到 4.10以上)
- buildToolsVersion 升级到 28.0.1或者以上。
3) UnrealEngine 兼容处理以支持集成 Line 编译 (以 UE4.18 为例)
由于构建机上 UE4.18 默认的配置不足以支持集成 Line 编译,需要到 UE4_18 引擎目录进行修改:
- gradle-wrapper.properties
# 文件路径:${UE418_PATH}/Engine/Build/Android/Java/gradle/gradle/wrapper/gradle-wrapper.properties # 旧配置 # distributionUrl=http\://android.oa.com/gradle/gradle-2.14.1-all.zip # 新配置 distributionUrl=http\://android.oa.com/gradle/gradle-4.6-all.zip
- build.gradle
// 文件路径:${UE418_PATH}/Engine/Build/Android/Java/gradle/build.gradle buildscript { ... dependencies { // 旧配置 // classpath 'com.android.tools.build:gradle:2.2.2' // 新配置 classpath 'com.android.tools.build:gradle:3.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } ... }
- build.gradle
// 文件路径: ${UE418_PATH}/Engine/Build/Android/Java/gradle/app/build.gradle // 由于升级了gradle 导致一些api不可用,需要做如下修改: ... def Set<String> outputFiles = [] ... android { /** * 修改release包的apk文件名和路径 * Studio3.0 */ android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = OUTPUT_PATH.substring(OUTPUT_PATH.lastIndexOf("/") + 1, OUTPUT_PATH.length()) outputFiles.add(outputFile) } } } afterEvaluate { assembleDebug.doLast { outputFiles.each { output -> println("######### assembleDebug doLast: " + output) String outputPath = OUTPUT_PATH.substring(0, OUTPUT_PATH.lastIndexOf("/")) String filename = OUTPUT_PATH.substring(OUTPUT_PATH.lastIndexOf("/") + 1, OUTPUT_PATH.length()) println("######### assembleDebug doLast: " + outputPath + " filename: " + filename) copy { from output into outputPath } } } assembleRelease.doLast { outputFiles.each { output -> println("######### assembleRelease doLast: " + output) String outputPath = OUTPUT_PATH.substring(0, OUTPUT_PATH.lastIndexOf("/")) String filename = OUTPUT_PATH.substring(OUTPUT_PATH.lastIndexOf("/") + 1, OUTPUT_PATH.length()) println("######### assembleRelease doLast: " + outputPath + " filename: " + filename) copy { from output into outputPath } } } }
三、iOS 工程配置
3.1 Xcode 工程配置文件 info.plist
找到或新建如下节点:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>line3rdp.{YOUR_BUNDLE_ID}</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>lineauth2</string>
<string>line</string>
</array>
<key>LineSDKConfig</key>
<dict>
<key>ChannelID</key>
<string>{YOUR_LINE_CHANNEL_ID}</string>
</dict>
其中,{YOUR_BUNDLE_ID} 需要修改为游戏工程的 BundleIdentifier (需要与在 Line 开发者平台上配置的 BundleIdentifier 一致),{YOUR_LINE_CHANNEL_ID} 需要修改为业务申请的 ChannelID [info] 如果 info.plist 中没有配置在Line开发者网站上申请的 ChannelID,在登录时会报错找不到 ChannelID 的值进而无法登录
在iOS平台,在MSDK5.15之前的ChannelID是在info.plist中的LineSDKConfig中获取,在MSDK5.15及之后优先读取info.plist的LineSDKConfig中的ChannelID,如果获取参数为空否】则从MSDKConfig.ini中读取LINE_CHANNEL_ID配置。
3.2 UniversalLink配置
MSDKLine的UniversalLink的支持在 MSDK 5.15(包含5.15) 之后的版本,其中iOS的Line app版本必须是8.16以上
注意:业务如果是5.15之前的版本,忽略该配置
3.2.1 什么是 Universal Link
Universal Link 是 Apple 从 iOS 9 引入的一种打通 web 和 app 之间跳转的机制。在 Safari 或者 WebView 中打开与 app 关联的链接时,会自动跳转到 app 并且不丢失参数内容。Universal Link 解决了 URL Scheme 的部分问题:
(1)当跳转失败时,会直接在 Safari/WebView 中打开链接; (2)可以借助 Universal Link 统一 web 端和 native 的路由; (3)跳转时不会弹出提示框,体验更好。
3.2.2 Universal Link 使用
要使用 Universal Link,要将域名和 app 关联起来,这个关联是双向的:
(1)开启AppleID Associated Domains能力
根据 Apple官方文档 找证书管理相关同学申请开通 AppleID Associated Domains 的能力,如下图所示:
AppleID 开启了 Associated Domains 的能力之后请重新生成签名描述文件。
(2)app 对域名的认证:在 Xcode 的 Signing&Capabilities选项里设置 Associated Domains,将域名添加进去,Domains
固定写applinks:+官网域名
,注意无需加https://
样例如下:
(3)域名对 app 的认证:在 web 服务器根目录放一个名为 apple-app-site-association 的 json 文件,注意不需要后缀名,里面描述哪些路径会跳转到哪个 app。其中 Json内容如下:
{
"applinks": {
"apps": [],
"details": [{
"paths": ["/line-auth/*"],
"appID": "YOUR_TEAM_ID.ios.bundle.id"
},
{
"paths": ["/line-auth/*"],
"appID": "JBS4AWYMFX.com.tencent.itop.example"
},
{
"paths": ["/line-auth/*"],
"appID": "JBS4AWYMFX.com.tencent.imsdk2"
}]
}
}
paths中的 /line-auth/* 是Line渠道的固定配置
appID中的 YOUR_TEAM_ID: 苹果开发者网站上对应TEAM_ID配置
appID中的 ios.bundle.id:具体要填写app在苹果开发者网站上对应的Bundle ID 参数
这里可以填写多个,比如你同一个app有其他的登录渠道也使用了UniversalLink,这里添加其他渠道对应的 paths 参数即可,或者你有多个app共享一个apple-app-site-association的json文件,上述实例中每一个 appID对应一个具体的app
(4)在Line的开发者平台填写对应的 Bundle ID 和 universal link配置 Line 开发者管理端
填写正确iOS bundle ID 和 iOS universal link
其中示例中的 https://docs.itop.qq.com 为放置apple-app-site-association的json文件的web服务器的域名地址。这里的域名地址配置每个游戏业务配置不一样。带上 /line-auth/最后的 "/" 不要漏掉
(5) 配置MSDKConfig.ini
在MSDKAppSetting.bundle/MSDKConfig.ini
中新增LINE_UNIVERSAL_LINK_IOS
的配置项,填写在Line的开发者平台上配置的Universal Link的值。
3.2.3 注意事项
(1)域名必须通过 HTTPS 访问 Universal Link 才能生效; (2)apple-app-site-association 只能放在域名根目录下,不能有跳转; (3)系统会在 app 初次安装、升级时去对应的域名下请求 apple-app-site-association 文件(实际结果,未体现在苹果官方文档上),如果 Universal Link 不可达,而配置都正常的话,可以尝试重启手机或卸载 app再安装。
Universal Link 运作流程
(1)app 第一次启动或者更新版本后第一次启动(实际结果,未体现在苹果官方文档上); (2)app 向工程里配置的域名发起 Get 请求拉取 apple-app-site-association Json 文件; (3)app 将 apple-app-site-association 注册到系统; (4)由任意 WebView 发起跳转 url; (5)如果命中了 apple-app-site-association 注册过的通用链接,则打开 app,触发 Universal Link delegate; (6)没命中,WebView 继续跳转 url。
在进行 apple-app-site-association 以及 app Xcode 工程配置之后,整个 Universal Link 运作流程完全由iOS系统控制。
在上面第2部出现 apple-app-site-association 文件访问不可用时,会导致新安装用户后续都不能通过UniversalLink跳转app,除非卸载重装。
3.2.4 实现 iOS 入口函数
(1)Unity
由于当前 GCloudCore 对该入口方法 hook 不生效,所以在 Unity 的UnityAppController.mm文件的 UnityAppController 类中添加 iOS 的生命周期入口函数,添加前请检查确认该入口函数是否已经存在,如果没有就手动添加(函数中不需要额外添加代码): 注意:生命周期入口函数不要在UnityAppController的子类中添加。确保入口函数是在跟 application:openURL:options: 等系统生命周期函数在同一个类中
- (BOOL)application:(UIApplication *)application continueUserActivity:
(NSUserActivity *)userActivity restorationHandler:(void(^)
(NSArray<id<UIUserActivityRestoring>> *
__nullablerestorableObjects))restorationHandler {
return YES;
}
Copy
(2)UnrealEngine
在iOS 中实现一个 iOSAppDelegate 的 category ,放在 MSDKCore/Source/MSDKCore/Private/iOS 插件中。该方案使用iOS categery 实现, 有存在被其他 SDK 替换掉的风险,游戏务必验证 UL 是否生效。
新建一个 IOSAppDelegate+MSDK.mm文件,内容如下:
# define WITH_MSDK 1
# if WITH_MSDK
# ifdef __APPLE__
# import <Foundation/Foundation.h>
# import "IOSAppDelegate.h"//UnrealEngine
# include "CoreDelegates.h"//UnrealEngine
# include "MSDKApplicationDelegate.h"
@interface IOSAppDelegate(MSDK)
@end
@implementation IOSAppDelegate(MSDK)
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
NSLog(@"IOSAppDelegate(MSDK) continueUserActivity ");
[[MSDKApplicationDelegate sharedInstance] application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
@end
# endif
# endif
Copy
MSDK V5.8.000(GCloud V2.0.14)及以上版本已使用iOS categery 实现, 有存在被其他 SDK 替换掉的风险,游戏务必验证 UL 是否生效
因目前 Soda 和蓝盾企业签名证书暂不具备 Universal Link 能力,请各业务务必使用开发签名证书调试
3.2.5 如何验证
验证apple-app-site-association文件是否可达并有效
在iOS的备忘录中输入之前配置的Universal Link的链接,点击链接看是否直接跳转到游戏app,如果是说明apple-app-site-association文件可达并有效,如果跳转到浏览器说明配置不对,下图的 https://docs.itop.qq.com 需要替换成游戏自己的配置了 apple-app-site-association 文件的域名地址。
如何判断Universal Link配置是正确的
场景一: 正常登陆流程中,在从Line app跳转到游戏的app时,如果有二次确认框就 一定不是 通过Universal Link的方式。
场景二:
如果在未配置Universial Link时是可以登录,配置了反而不能登录,并且跳转到Line app之后有跳转到浏览器,并且Line app给出了出错提示,这是说明配置出错,检查管理端的channelid和Universal Link等配置跟 MSDKConfig.ini中的 对应的配置是否一致,LINE_UNIVERSAL_LINK_IOS、LINE_CHANNEL_ID
场景三:
如果登录从Line App跳回,但是在登录返回日志中有一下关键字:
Callback from Line with Scheme with options
或
Callback from Line with Scheme with sourceApplication
表明当前不是通过Universal Link跳转app的
场景四:
如果以上三种情况都没有出现,并且登录从Line App跳回,并且日志中存在:
Callback from Line with UniversalLink
说明当前的Universal Link 一定是正确的
3.2.6 参考
(1)Universal Links for Developers
(3)苹果官方的UL测试工具
3.3 Unity 引擎适配 LineSDK 的 Swift 和 Objective-C 的混编问题
MSDK5.11(包含5.11)之后的版本
注意:业务如果已经5.11之前就集成了MSDKLine渠道,并且已经通过脚本处理了兼容Swift版本可以忽略该方法。
找到Unity中的XCodePostProcess文件
删掉注释,打开宏定义
MSDK5.11之前的版本
由于Line不再维护Objective-C版本的SDK,且后续的SDK都是swift版本,所以当前集成的都是swift版本,所以这里涉及到iOS的Swift和Objective-C的混编问题,Xcode为了兼容混编需要有一个bridge的桥接层对齐两种语言的类名等,需要如下操作。
Swift-LineSDK 必须是Xcode10.3及以上版本才支持
1.新建文件,选择Swift file类型
2.自定义文件名称,但确保后缀是.swift文件,点击 “ Create”
3.一定要选择 "Create Bridging Header",否则Xcode就不会创建桥接层文件了。
4.确保Xcode工程中将多出两个文件,文件内容无需更改
如果遇到以下报错
在Library Search Paths 中添加以下
3.4 UnrealEngine 引擎适配 LineSDK 的 Swift 和 Objective-C 的混编问题
在 MSDK V5.7 及之后的版本, 需要处理 UnrealEngine 的 Swift 和 Objective-C 的混编问题
详情请参考 UnrealEngine在iOS平台支持Swift和Objective-C混编配置
3.5 MSDKConfig.ini文件配置
添加完 MSDKGarena 的 iOS 插件后,在 Xcode 工程中找到 MSDKAppSetting.bundle/MSDKConfig.ini 文件,增加或修改如下配置:
[Line 渠道配置]
LINE_CHANNEL_ID = {YOUR_LINE_CHANNEL_ID}
[info] 替换 {YOUR_LINE_CHANNEL_ID} 为业务在 Line 开发者平台上申请的 ChannelID
3.6 Unity XUPorter的 xx.projmods 文件的配置
Unity 导出 XCode 工程时,需要配置 xx.projmods 文件,使导出的 XCode 工程能得到 3.1 的配置
{
"group": "MSDKWeChat",
"libs": [],
"frameworks": [],
"files": [],
"folders": [],
"excludes": [],
"headerpaths":[],
"build_settings": {},
"system_capabilities": {},
"Info.plist":{
"LSApplicationQueriesSchemes":
[
"lineauth2",
"line"
],
"CFBundleURLTypes" :
[
{
"CFBundleTypeRole":"Editor",
"CFBundleURLSchemes":"line3rdp.{YOUR_BUNDLE_ID}"
}
],
"LineSDKConfig":{
"ChannelID":"{YOUR_LINE_CHANNEL_ID}"
}
}
}
其中,{YOUR_BUNDLE_ID} 需要修改为游戏工程的 BundleIdentifier (需要与在Line开发者平台上配置的 BundleIdentifier 一致),{YOUR_LINE_CHANNEL_ID} 需要修改为业务申请的 ChannelID
3.7 UnrealEngine 的DefaultEngine.ini 文件的配置
UnrealEngine 构建导出 .ipa 文件时,需要配置工程目录下的 Config/DefaultEngine.ini 文件,或者在 Unreal 工程中找到配置项,找到如下描述对应的位置并修改或添加,使得导出的 .ipa 文件能得到 3.1 的配置
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>line3rdp.{YOUR_BUNDLE_ID}</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>lineauth2</string>
<string>line</string>
</array>
<key>LineSDKConfig</key>
<dict>
<key>ChannelID</key>
<string>{YOUR_LINE_CHANNEL_ID}</string>
</dict>
其中,{YOUR_BUNDLE_ID} 需要修改为游戏工程的 BundleIdentifier (需要与在 Line 开发者平台上配置的 BundleIdentifier 一致),{YOUR_LINE_CHANNEL_ID} 需要修改为业务申请的 ChannelID
四、 功能说明
4.1 登录及绑定回调设置
1)功能描述
2)接口声明
// 登出回调、应用唤醒回调
public static event OnMSDKRetEventHandler<MSDKBaseRet> LoginBaseRetEvent;
// 登录回调,包括 login、bind、autologin、switchuser 等
public static event OnMSDKRetEventHandler<MSDKLoginRet> LoginRetEvent;
class MSDKLoginObserver
{
public:
// 登录回调,包括 login、bind、autologin、switchuser 等
virtual void OnLoginRetNotify(const MSDKLoginRet &loginRet) {};
// 登出回调、应用唤醒回调
virtual void OnBaseRetNotify(const MSDKBaseRet &baseRet) {};
};
4.2 登录功能
1)功能描述
Line 无需安装 APP 就可以登录
- iOS 端和安卓端在有安装 Line APP 的情况下会拉起 Line APP 进行登录;如果没有安装 Line APP,则会拉起 Web 页面进行登录
- iOS 端无论是拉起 APP 授权还是通过 Web 页面登录,账号登录成功后都会拉起 Web 页面提示是否拉起游戏客户端,此时点击拒绝的话将不会拉起游戏客户端,游戏客户端也无法收到回调
- Line 的授权登录需要赋予 openid, profile 两项权限,前者是为了获取玩家的 Line openid,后者是为了获取玩家的 Line AccessToken,可以通过 permissions 字段来设置。如果业务填写的 permissions 字段为空,那么在登录 Line 时 MSDK 将默认使用 openid 和 profile 权限。
2)接口声明
public static void Login(string channel, string permissions = "", string subChannel = "", string extraJson = "")
public static void Login(const String &channel, const String &permissions, const String &subChannel, const String &extraJson)
3)示例代码
MSDKLogin.Login("Line");
std:string permissionList = "profile,openid";
MSDKLogin::Login("Line", permissionList);
4.3 发送消息功能
1) 支持类型列表
序号 | 功能 | 必填字段 | 所需 APP 和登陆状态 |
---|---|---|---|
1 | 发送 - 文本 | desc | 需下载 Line APP |
2 | 发送 - 图片 | imagePath | 需下载 Line APP |
2) 功能描述
Line 渠道提供发送消息功能,仅支持发送文本或图片,想要发送的文本请在 MSDKFriendReqInfo.desc 中赋值。想要发送的图片请在 MSDKFriendReqInfo.imagePath 中传递图片路径(本地或者网络图片路径皆可)。
[info] 注意 图片可以是本地图片或者网络图片。
All rights reserved.