04/29/2024 11:54:53

Line 渠道说明

一、 开发者平台配置

一、开发者平台配置

Android系统,MSDK5.15版本(包括5.15)之后,由于官方Line-SDK的限制,MSDKLine模块不支持Internal构建方式打包。

1.1 注册账号

业务需自行去 LINE 平台 申请 App 并配置好基础信息。

1.2 新建Provider

1.3 设置应用信息

二、 Android工程配置

二、Android 工程配置

[info] 版本须知 由于 Line SDK 只兼容 miniSdkVersion >= 17,所以在 Android 4.2 以下系统上运行可能会存在问题,建议游戏设置 minSdkVersion >= 17。

minSdkVersion : 17 targetSdkVersion : 28

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]

  1. 替换 {YOUR_LINE_CHANNEL_ID} 为业务在 Line 开发者平台上申请的 ChannelID
  2. 替换 {YOUR_LINE_UNIVERSAL_LINK} 为业务在 Line 开发者平台上填写的 iOS universal link 。如果没有开启可不填,可参照 3.2 UniversalLink配置 部分
  3. LINE_CHECK_SDK_VERSION_ENABLE 用于校验运行设备的 Android 系统版本,如果设备系统版本在 Android 4.2以下时,调用 Line 渠道相关接口,会返回不支持。该开关 ‘默认开启’,如果想关闭可以设置为 0,但是需要业务评估风险。
  4. 在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 兼容处理

  1. Android Gradle 升级到 3.2 ,并配置 Java8 支持。
  2. Unity Gradle 升级到 4.6 或者以上版本。(MSDK已验证:Unity 2017 最高升到 4.6,其他升到 4.10以上)
  3. buildToolsVersion 升级到 28.0.1或者以上。

3) UnrealEngine 兼容处理以支持集成 Line 编译 (以 UE4.18 为例)

由于构建机上 UE4.18 默认的配置不足以支持集成 Line 编译,需要到 UE4_18 引擎目录进行修改:

  1. 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
    
  2. 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
         }
         ...
     }
    
  3. 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工程配置

三、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之前的版本,忽略该配置

Universal Link 是 Apple 从 iOS 9 引入的一种打通 web 和 app 之间跳转的机制。在 Safari 或者 WebView 中打开与 app 关联的链接时,会自动跳转到 app 并且不丢失参数内容。Universal Link 解决了 URL Scheme 的部分问题:

(1)当跳转失败时,会直接在 Safari/WebView 中打开链接; (2)可以借助 Universal Link 统一 web 端和 native 的路由; (3)跳转时不会弹出提示框,体验更好。

要使用 Universal Link,要将域名和 app 关联起来,这个关联是双向的:

(1)开启AppleID Associated Domains能力

根据 Apple官方文档 找证书管理相关同学申请开通 AppleID Associated Domains 的能力,如下图所示:

3

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 开发者管理端

image-20201126145311055

填写正确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再安装。

(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 文件的域名地址。

image-20201126153940674

如何判断Universal Link配置是正确的

场景一: 正常登陆流程中,在从Line app跳转到游戏的app时,如果有二次确认框就 一定不是 通过Universal Link的方式。

image-20201126153135845

场景二:

如果在未配置Universial Link时是可以登录,配置了反而不能登录,并且跳转到Line app之后有跳转到浏览器,并且Line app给出了出错提示,这是说明配置出错,检查管理端的channelid和Universal Link等配置跟 MSDKConfig.ini中的 对应的配置是否一致,LINE_UNIVERSAL_LINK_IOS、LINE_CHANNEL_ID

image-20201126153536262

场景三:

如果登录从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

(2)Enabling Universal Links

(3)苹果官方的UL测试工具

3.3 Unity 引擎适配 LineSDK 的 Swift 和 Objective-C 的混编问题

MSDK5.11(包含5.11)之后的版本

注意:业务如果已经5.11之前就集成了MSDKLine渠道,并且已经通过脚本处理了兼容Swift版本可以忽略该方法。

找到Unity中的XCodePostProcess文件

删掉注释,打开宏定义

image-20200818153409391

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)接口声明

C#
C++
// 登出回调、应用唤醒回调

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)接口声明

C#
C++
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)示例代码

C#
C++
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] 注意 图片可以是本地图片或者网络图片。



Copyright © 2024 MSDK.
All rights reserved.

results matching ""

    No results matching ""