12/03/2024 18:29:20
Garena 渠道说明
重要提示:
从 V5.37.100 版本开始:
- Garena Android SDK 要求 compileSDK 版本不低于 33
- 【重要】Garena SDK 不再支持 Garena App 的登录和分享
- 【重要】Garena Android SDK 不再支持拉起游戏携带参数数据
- 【重要】iOS 端 Google 子渠道登录功能,需要在 Info.plist 中设置 GIDClientID 值,该值对应 Google 渠道的 iOS client ID;可以参考 【3.3 获取 Google iOS ClientID】 章节获取 iOS client ID
- 【重要】Garena iOS SDK 要求使用 Xcode15.3 及以上编译,否则会编译失败
- 【重要】MSDKExtend 模块 Garena 废弃 getGuestUid 和 getGuestPwd 两个同步接口,原用例按钮返回空值,请不要再使用
- 【重要】MSDKExtend 模块新增 getGuestUidAsync 和 getGuestPwdAsync 两个异步接口,请使用新的异步接口
2021年6月30日前必须更新至 Garena4.0.13(MSDK5.16)版本,否则可能存在 Google 相关失败。
一、开发者平台配置
由 Garena 统一给出 appid 等相关信息。
[info]
1、由于 Garena iOS SDK 4.0.19 版本(对应 MSDKGarena 插件的 5.31 版本)使用到了 iOS SDK 16+ 的库,要求必须使用 XCode 14.2 及以上版本编译,最低 iOS 支持版本也需要变更为 iOS 11,否则会出现缺少相关 Swift 库导致编译不通过的现象。同时 Garena iOS 版本使用到了 Swift 的混编能力,业务需要根据 UnrealEngine在iOS平台支持Swift和Objective-C混编配置 进行 UnrealEngine 的 Swift 混编适配;
2、Garena Android SDK 4.0.16 版本,使用 targetVersion 30 编译后,由于 Android 11 不再允许直接访问 SD 卡,所以在 Android 11 设备上卸载重装游戏客户端会导致老的游客账号丢失,建议游戏侧可以鼓励玩家绑定游客账号到平台账号,以及直接覆盖安装来规避影响。
二、Android 工程配置
2.1 通用工程配置
1)权限配置
- Garena 4.0.15 - 4.0.27 之间版本,在 AndroidManifest.xml 中增加以下权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
- Garena 4.0.28 之后版本,权限变更为
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
[info] WRITE_EXTERNAL_STORAGE、GET_ACCOUNTS、RECORD_AUDIO 为敏感权限
2)配置 Garena App id 及 key
在工程的 assets/MSDKConfig.ini 文件中添加以下配置
[Garena渠道配置]
GARENA_APP_SDK_ASSIGN_ID = {YOUR_GARENA_APP_ID}
GARENA_APP_SDK_KEY= {YOUR_APP_KEY}
GARENA_LOGIN_TITLE = {YOUR_LOGIN_TITLE}
[info] 替换 {YOUR_GARENA_APP_ID} 为业务申请的 Garena APP ID ,{YOUR_APP_KEY} 为业务申请的 APP KEY ,{YOUR_LOGIN_TITLE} 用于 Garena Web 登录,用户可以设置自定义标题。如果未设置,标题将使用该字段默认值
2.2 Garena 各子渠道配置
1)子渠道 Guest 配置
1、找到对应引擎目录下的 authenticator.xml
文件
//uthenticator.xml 文件在 Unity 工程的位置
Plugins\Android\gcloudsdk-msdk-garena\res\xml
//authenticator.xml 文件在 UnrealEngine 工程的位置
MSDKGarena\Source\MSDKGarena\lib\Android\msdk-garena\res\xml
[info] Garena 4.0.28 及以上版本已调整为此路径
2、将 {GARENA_APP_SDK_ASSIGN_ID} 替换成游戏自己的 Garena APPID
<?xml version="1.0" encoding="utf-8"?>
<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.garena.msdk{YOUR_GARENA_APP_ID}">
</account-authenticator>
<!-- Gareana 4.0.28 及以上版本,请替换为下方配置-->
<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="{your packageName}"
android:icon="@drawable/android_icon"
android:label="@string/app_name"
android:smallIcon="@drawable/android_icon" />
[info]
1、由于 Android 11 不再允许直接访问 SD 卡,卸载重装游戏客户端会导致老的游客账号丢失,建议游戏侧可以鼓励玩家绑定游客账号到平台账号,以及直接覆盖安装来规避影响;
2、{your packageName} 配置为游戏的 Android 包名,注意不要用占位符 ${applicationId};
3、android:icon 和 android:smallIcon 配置任意图片资源即可,比如游戏的 icon;
4、android:label 配置为游戏名即可。
2)子渠道 Garena 配置
插件目录下的 AndroidManifest.xml 文件中找到如下配置并修改
<meta-data
android:name="com.garena.sdk.applicationId"
android:value="{GARENA_APP_SDK_ASSIGN_ID}"/>
[info] 替换 {GARENA_APP_SDK_ASSIGN_ID} 为业务申请的 Garena APP ID
<!-- Garena 4.0.28 之前版本-->
<provider android:name="com.tencent.gcloud.msdk.common.GarenaFileProvider"
android:authorities="com.garena.android.fileprovider{GARENA_APP_SDK_ASSIGN_ID}"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<!-- Garena 4.0.28 及以上版本,请移除上面 GarenaFileProvider 的配置,替换为下方配置-->
<provider
android:name="com.garena.android.share.GGFileProvider"
android:authorities="com.garena.android.fileprovider{GARENA_APP_SDK_ASSIGN_ID}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
[info] {garena_app_sdk_assign_id} 需要改成 Garena 的 APPID,分享图片时使用,否则会导致分享图片失败
3)子渠道 Facebook 配置
插件目录下的 AndroidManifest.xml 文件中找到如下配置并修改
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<meta-data
android:name="com.facebook.sdk.ClientToken"
android:value="@string/facebook_client_token"/>
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"/>
<provider
android:authorities="com.facebook.app.FacebookContentProvider{GARENA_FACEBOOK_APPID}"
android:name="com.facebook.FacebookContentProvider"
android:exported="true"/>
[info]
1、替换 facebook_app_id 为业务申请的 Facebook 的 AppID。
2、替换 facebook_client_token 为业务申请的 Facebook 的 token 值。登录 Facebook 管理端进入应用管理页面,点击 App settings -> Advanced -> 对应 Security 模块内即可看到 Client token。
4)子渠道 Google 配置
插件目录下的 AndroidManifest.xml 文件中找到如下配置并修改
<meta-data
android:name="com.garena.sdk.google_client_id"
android:value="{GARENA_GOOGLE_CLIENT_ID}"/>
[info] {GARENA_GOOGLE_CLIENT_ID} 需要改成 Google 的 'Web' 类型 客户端ID
5)子渠道 Email 配置
<activity
android:name="com.beetalk.sdk.EmailAuthActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"/>
[info] Email 登录需要联系 Garena 进行后台配置
6)如何适配 targetVersion 29
1、将 gradle 文件的 targetVersion 设置为 29
2、在 AndroidManifest.xml 中 application 节点下添加 requestLegacyExternalStorage 属性
<application
android:requestLegacyExternalStorage="true"
...
>
<application/>
7)Garena 平台日志开关配置
MSDKConfig.ini 默认开启 Garena 平台日志开关, 开启:1,关闭:0
GARENA_DEBUG_LOG_ENABLE = 1
2.3 升级 MSDK V5.31 之后编译问题解决方案
2.3.1 Unity 引擎
1、业务侧需要在 baseProjectTemplate.gradle 文件中增加 kotlin 插件配置以及 AwemeOpenSDK maven 仓库地址
buildscript {
repositories {
、、、
maven { url "https://artifact.bytedance.com/repository/AwemeOpenSDK" }
}
dependencies {
、、、
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
}
}
[info] 由于 Garena SDK 强依赖字节 Tiktok SDK,所以需要添加 AwemeOpenSDK Maven 仓库地址
2、gradle 及 gradle 插件版本要求
- gradle 最低版本:3.6.4
- gradle 插件最低版本:6.7.1
2.3.2 UE 引擎
1、在 MSDK_Garena_UPL.xml 文件的 buildscriptGadleAdditions 节点加入以下配置
<buildscriptGadleAdditions>
<insert>
<![<![CDATA[
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
}
]]>]
</insert>
</buildscriptGadleAdditions>
2、在 MSDK_Garena_UPL.xml 文件的 baseBuildGradleAdditions 节点加入以下配置
<baseBuildGradleAdditions>
<insert>
<![<![CDATA[
{GRADLE_ADDITIONS}
]]>]
</insert>
</baseBuildGradleAdditions>
2.3.3 接口调整
自 Garena Android 4.0.28 版本之后,Garena 不再支持静默分享类型 kMSDKFriendReqTypeTextSilent
三、iOS 工程配置
3.1 Xcode 工程配置文件 info.plist
找到或新建如下节点
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>Garena</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb{YOUR_FACEBOOK_APP_ID}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>Garena</string>
<key>CFBundleURLSchemes</key>
<array>
<string>gop{YOUR_GARENA_APP_ID}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>Google</string>
<key>CFBundleURLSchemes</key>
<array>
<string>{YOUR_GOOGLE_URL_SCHEME}</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>twitter</string>
<key>CFBundleURLSchemes</key>
<array>
<string>twitterkit-{YOUR_TWITTER_KEY}</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
<string>twitterauth</string>
<string>fb-messenger-api</string>
<string>fbshareextension</string>
<string>fbauth2</string>
<string>fb-messenger-share-api</string>
<string>fbapi</string>
<string>garenagc</string>
<string>beetalk</string>
<string>line</string>
<string>gop{YOUR_GARENA_APP_ID}</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>FacebookAppID</key>
<string>{YOUR_FACEBOOK_APP_ID}</string>
<key>FacebookClientToken</key>
<string>{YOUR_FACEBOOK_CLIENT_TOKEN}</string>
<key>DataDomeKey</key>
<string>{YOUR_DATADOME_KEY}</string>
<key>DataDomeProxyEnabled</key>
<false/>
<key>GOPAppID</key>
<string>{YOUR_GARENA_APP_ID}</string>
<key>GoogleClientID</key>
<string>{YOUR_GOOGLE_CLIENT_ID}</string>
<key>TwitterSecret</key>
<string>{YOUR_TWITTER_SECRET}</string>
<key>TwitterKey</key>
<string>{YOUR_TWITTER_KEY}</string>
1、DataDomeProxyEnabled :Garena 侧需求参数,有相关功能需求可以与 Garena 侧沟通并决定是否配置;无实际需求的话默认保持为 false 即可;
2.{YOUR_FACEBOOK_APP_ID} 需要修改为游戏申请的 Facebook AppID;
3、{YOUR_FACEBOOK_CLIENT_TOKEN} 可在 Facebook 管理端查看,在我的应用->应用设置->高级->客户端口令查看;
4、{YOUR_DATADOME_KEY} Garena 侧需求参数,有相关功能需求可以与 Garena 侧沟通获取参数内容并配置在该处;若没有实际需求,可填任意非空字符串;
5、{YOUR_GARENA_APP_ID} 需要修改为游戏申请的 Garena AppID;
6、{YOUR_GOOGLE_CLIENT_ID} 需要修改为游戏申请的 Google ClientID;
7、{YOUR_GOOGLE_URL_SCHEMES} 需要修改为游戏申请的 Google UrlSchemes。
[info]
1、一般情况下,申请的 Google URLSchemes 的值为 Google ClientID 的倒置,例如,在Google申请的 Google ClientID 为 123456789-xxxxxxxxx.apps.googleusercontent.com,Google URLSchemes 的值即为com.googleusercontent.apps.123456789-xxxxxxxxx
2、如果游戏侧无需实现 Twitter 子渠道相关功能,这里的 TwitterSecret 和 TwitterKey 两个配置项也需要配置,参数可以随意填写一个,如果不配置可能会导致发生 crash
3.2 MSDKConfig.ini 文件配置
添加完 MSDKGarena 的 iOS 插件后,在 Xcode 工程中找到 MSDKAppSetting.bundle/MSDKConfig.ini 文件,增加或修改如下配置
[Garena 渠道配置]
GARENA_APP_SDK_ASSIGN_ID = {YOUR_GARENA_APP_ID}
GARENA_APP_SDK_KEY= {YOUR_APP_KEY}
GARENA_LOGIN_TITLE = {YOUR_LOGIN_TITLE}
[info] 替换 {YOUR_GARENA_APP_ID} 为业务申请的 APP ID ,{YOUR_APP_KEY} 为业务申请的 APP KEY ,{YOUR_LOGIN_TITLE} 用于 Garena Web 登录,用户可以设置自定义标题。如果未设置,标题将使用该字段默认值
3.3 获取 Google iOS ClientID
前往登录 Google Cloud 控制台
找到 【API 和服务】入口
通过以下链路: 凭据 -> OAuth2.0客户端ID -> 点击进入到 iOS 客户端ID 配置页中 -> Additional Information -> "iOS 网址架构"(iOS URL scheme) 下获取到该值
3.3 Unity XUPorter 的 xx.projmods 文件的配置
Unity 导出 XCode 工程时,需要配置 xx.projmods 文件,使导出的 XCode 工程能得到 3.1 的配置
{
"group": "MSDKGarena",
"libs": [],
"frameworks": [],
"files": [],
"folders": [],
"excludes": [],
"headerpaths":[],
"build_settings": {},
"system_capabilities": {},
"Info.plist":{
"LSApplicationQueriesSchemes":
[
"twitter",
"twitterauth",
"fb-messenger-api",
"fbshareextension",
"fbauth2",
"fb-messenger-share-api",
"fbapi",
"garenagc",
"beetalk",
"line",
"gop{YOUR_GARENA_APP_ID}"
],
"CFBundleURLTypes" :
[
{
"CFBundleTypeRole":"Editor",
"CFBundleURLName":"Garena",
"CFBundleURLSchemes":["gop{YOUR_GARENA_APP_ID}"]
},
{
"CFBundleTypeRole":"Editor",
"CFBundleURLName":"Garena",
"CFBundleURLSchemes":["fb{YOUR_FACEBOOK_APP_ID}"]
},
{
"CFBundleTypeRole":"Editor",
"CFBundleURLName":"Google",
"CFBundleURLSchemes":["{YOUR_GOOGLE_URL_SCHEME}"]
}
],
"GOPAppID":"{YOUR_GARENA_APP_ID}",
"FacebookAppID":"{YOUR_FACEBOOK_APP_ID}",
"GoogleClientID":"{YOUR_GOOGLE_CLIENT_ID}",
"TwitterSecret":"{YOUR_TWITTER_SECRET}",
"TwitterKey":"{YOUR_TWITTER_KEY}",
"DataDomeKey":"{YOUR_DATADOME_KEY}",
"DataDomeProxyEnabled":false,
"FacebookClientToken":"{YOUR_FACEBOOK_CLIENT_TOKEN}"
}
}
1、{YOUR_FACEBOOK_APP_ID}需要修改为游戏申请的 Facebook AppID;
2、{YOUR_GARENA_APP_ID}需要修改为游戏申请的 Garena AppID;
3、{YOUR_GOOGLE_CLIENT_ID}需要修改为游戏申请的 Google ClientID;
4、{YOUR_GOOGLE_URL_SCHEMES}需要修改为游戏申请的 Google UrlSchemes。
[info]
1、一般情况下,申请的 Google URLSchemes 的值为 Google ClientID 的倒置,例如,在Google申请的 Google ClientID 为 123456789-xxxxxxxxx.apps.googleusercontent.com,Google URLSchemes 的值即为com.googleusercontent.apps.123456789-xxxxxxxxx
2、如果游戏侧无需实现 Twitter 子渠道相关功能,这里的 TwitterSecret 和 TwitterKey 两个配置项也需要配置,参数可以随意填写一个,如果不配置可能会导致发生 crash
3.4 iOS 依赖 frameworks 列表
添加完 MSDKGarena 的 iOS 插件后,在 Xcode 工程中找到工程的 BuildPhrases 配置,增加或修改如下配置
Social.framework
CoreServices.framework
Accelerate.framework
CoreLocation.framework
CoreMedia.framework
MapKit.framework
AdSupport.framework
AuthenticationServices.framework
LocalAuthentication.framework
SafariServices.framework
CoreGraphics.framework
WebKit.framework
DataDomeSDK.xcframework
[info] 在 XCode 中的 Copy Bundle Resources 配置中还需要添加 TwitterKitResources.bundle 文件,否则应用启动时可能会发生 crash
3.5 MSDKGarena V5.17 及之后的版本,需要处理 UnrealEngine 的 Swift 和 Objective-C 混编问题
详情请参考 UnrealEngine在iOS平台支持Swift和Objective-C混编配置
3.6 Unity 引擎适配 Garena iOS SDK 的 Swift 和 Objective-C 的混编问题
找到 Unity 中的 XCodePostProcess 文件
删掉注释,打开宏定义
3.7 风险提示
Garena iOS SDK 4.0.6版本(对应 MSDKGarena 5.17 版本)开始新增了 AdSupport.framework 库,经 Garena 侧确认,该库用于 Facebook 上报事件获取 IDFA,需要业务使用 ATT 框架弹窗声明权限并在 info.plist 中说明请求 IDFA 数据的原因,否则会有提审风险。
四、功能说明
4.1 登录及绑定回调设置
1)功能描述
接受 MSDK 登录模块的回调,游戏需要注册回调函数进行处理;强烈建议游戏在应用启动函数中进行注册。同时建议在接收到其他渠道绑定成功的回调后,调用重置游客接口重置游客数据,让玩家可以在下次登录的时候,直接使用绑定了其他子渠道的账号进行登录。如果游客绑定其他子渠道成功后未调用重置游客接口,则再次使用游客登录会返回2203(iOS)或者2019(Android)的错误码,导致游客登录失败。所以当您游客登录报错返回2203(iOS)或者2019(Android)错误码时,建议您调用重置游客接口重置后再次登录。 同时,由于重置游客接口通过 OnExtendRetEvent(C#)或者 MSDKExtendObserver(C++)回调给游戏,所以游戏侧需要实现这两个回调函数,详情可以参考下面的示例。
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) {};
};
3)示例代码
MSDKLogin.LoginRetEvent += OnLoginRetEvent;
MSDKLogin.LoginBaseRetEvent += OnLoginBaseRetEvent;
MSDKExtend.ExtendRetEvent += mExtendCallBack.OnExtendRetEvent;
public void OnLoginRetEvent(MSDKLoginRet loginRet)
{
Debug.Log("OnLoginRetNotify in Login");
string methodTag = "";
if (loginRet.MethodNameId == (int)MSDKMethodNameID.MSDK_LOGIN_LOGIN)
{
methodTag = "Login";
}
else if (loginRet.MethodNameId == (int)MSDKMethodNameID.MSDK_LOGIN_BIND)
{
methodTag = "Bind";
// 在登录回调中判断,当当前为绑定接口回调、当前绑定主渠道为 Garena 且登录回调码为 Success 时候直接调用重置游客接口
if(loginRet.Channel.Equals("Garena") && loginRet.RetCode == MSDKError.SUCCESS)
{
MSDKExtend.Invoke ("Garena", "resetGuest", "");
}
}
}
public void OnExtendRetEvent (MSDKExtendRet extendRet)
{
string methodTag = extendRet.ExtendMethodName;
mCurrentTestMgr.ShowLogInNewLine (methodTag + Tools.Instance.GetRetString(extendRet));
}
MSDKLogin::SetLoginObserver(new MSDKDemoBaseLoginObserver());
class MSDKDemoBaseLoginObserver: public GCloud::MSDK::MSDKLoginObserver {
// 登录回调,包括 login、bind、autologin、switchuser 等
public:
virtual void OnLoginRetNotify(const GCloud::MSDK::MSDKLoginRet &loginRet) {
// 在登录回调中判断,当当前为绑定接口回调、当前绑定主渠道为 Garena 且登录回调码为 Success 时候直接调用重置游客接口
if (loginRet.methodNameID == kMethodNameBind && loginRet.retCode == MSDKError::SUCCESS && loginRet.channel == "Garena") {
notifyToResetGuest(loginRet);
}
UMSDKDemoBase::showNormalAlert(loginRet);
};
// 绑定账号成功后获取到回调,重置游客账号
void notifyToResetGuest(const MSDKLoginRet &loginRet) {
String result =MSDKExtend::Invoke(loginRet.channel.c_str(), "resetGuest", "");
LOG_DEBUG("extend invoke result: %s,channel:%s,methodName:%s,json:%s", result.c_str(),loginRet.channel.c_str(),"resetGuest","");
}
};
class MyExtendObserver : public GCloud::MSDK::MSDKExtendObserver {
public:
void OnExtendNotify(const MSDKExtendRet &extendRet) {
handleCallback(extendRet, extendRet.methodNameID);
};
};
4.2 登录功能
Garena 无需安装 APP 就可以登录,也可以通过 Garena 的多个登录子渠道( Garena、Facebook、Google、Guest、Apple 和 Email)进行登录。
public static void Login(string channel, string permissions = "", string subChannel = "", string extraJson = "")
static void Login(const String &channel, const String &permissions = "",
const String &subChannel = "", const String &extraJson = "");
[info]
1、Email 登录最低 Garena SDK 支持: Android(4.0.20+ ),iOS(v4.0.12);
2、Garena SDK 在 Android 4.0.20, iOS 4.0.12 以上版本支持自定义权限功能。默认权限为:"public_profile,user_friends,email"
。如需调整,可以通过登录时 permissions 字段进行自定义传递;
3、iOS 如果有安装 APP,会拉起 APP 进行登录,否则会拉起 Web 界面进行登录;
4、登录的子渠道名称会在 LoginRet 的 extraJson 字段中返回给游戏,例如 "extraJson":"{"subChannel":"Facebook"}"。
4.3 绑定功能
Garena 渠道有多个登录子渠道分别为 Garena、Facebook、Google、Guest、 Apple 和 Email,Garena 以子渠道 Guest 登录后,可绑定其他子渠道以方便账号找回等功能。调用绑定接口时,会拉起对应子渠道的 APP(或者打开对应渠道的 web 登录页面)进行授权登录操作,授权完成返回游戏后,MSDK会将该渠道账号与之前登录的游客账号绑定。
public static void Bind(string channel, string permissions = "", string subChannel = "", string extraJson = "")
static void Bind(const String &channel, const String &permissions = "",
const String &subChannel = "", const String &extraJson = "");
[info]
1、Garena 渠道的绑定失败后,建议游戏调用一次 Garena 的 Guest 登录;
2、Garena SDK 调用绑定操作后,不管绑定结果是成功或失败,Garena SDK 的 session 会置为新的被绑定渠道(其实当前还是 Guest 登录态),这时再次去绑定的话会因为 session 校验不通过而失败。所以,建议游戏在 Garena 渠道绑定失败后调用一次 Garena 的 Guest 登录,回到正常的游客登录状态。
4.4 好友功能
Garena 渠道为复杂渠道,好友分享功能需要通过子渠道来实现,目前支持的分享子渠道有 Garena、Facebook 和 Line 三种,调用的接口及示例如下(以 Facebook 子渠道示例)。
1)接口声明
// 发送消息给好友(Send)
public static void SendMessage(MSDKFriendReqInfo info, string channel = "")
// 分享消息到平台(Share)
public static void Share(MSDKFriendReqInfo info, string channel = "")
// 发送消息给好友(Send)
public static void SendMessage(const MSDKFriendReqInfo &reqInfo, const string &channel = "");
// 分享消息到平台(Share)
public static void Share(const MSDKFriendReqInfo &reqInfo, const string &channel = "");
2)示例代码
var reqInfo = new MSDKFriendReqInfo
{
// 以 Garena-Facebook 分享图片举例
Type = FriendReqType.Friend_REQ_IMG,
ImagePath = "http://mat1.gtimg.com/www/qq2018/imgs/qq_logo_2018x2.png";
ExtraJson = "{"mediaTagName":"me","subChannel":"Facebook","caption":"caption"}";
};
MSDKFriend.Share (reqInfo, "Garena");
MSDKFriendReqInfo info;
info.type = kMSDKFriendReqTypeIMG;
info.imagePath = "http://mat1.gtimg.com/www/qq2018/imgs/qq_logo_2018x2.png";
info.extraJson = "{"mediaTagName":"me","subChannel":"Facebook","caption":"caption"}";
MSDKFriend::Share(info, "Garena");
3)支持类型列表(Garena)
分享类型 |
MSDK 接口 | 必填字段 | 所需 APP 和登陆状态 |
对应 Garena 方法 |
---|---|---|---|---|
链接 (Friend_REQ_LINK) | SendMessage | scene、mediaTagName、link、title、caption、desc、thumbPath | 需 Garena 登录态 | GGSendLinkToSession |
图片 (Friend_REQ_IMG) | SendMessage | scene、imagePath、mediaTagName | 需 Garena 登录态 | GGSendMediaToSession |
文本和游戏图标 (Friend_REQ_TEXT) | SendMessage | title、desc、mediaTagName、thumbPath | 需 Garena 登录态 | GGSendGameToSession |
4)支持类型列表(Facebook)
分享类型 |
MSDK 接口 | 必填字段 | 所需 APP 和登陆状态 |
对应 Garena 方法 |
---|---|---|---|---|
邀请 (Friend_REQ_INVITE) | SendMessage | title、desc | - | GGSendRequestInvitationToFacebook |
链接 (Friend_REQ_LINK) | Share | title、desc、link、thumbPath、caption | - | GGSendLinkToFacebook |
图片 (Friend_REQ_IMG) | Share | scene、mediaTagName、imagePath、caption | - | GGSendMediaToFacebook |
[info]
1、出于优化考虑,Facebook 不再推荐通过 SDK 方式分享消息到 Facebook(Messenger APP),所以 Garena iOS SDK 在 3.1.3 版本取消了相关接口的封装,MSDK 侧也在 3.3.7 版本(封装 Garena 3.1.3)取消了发送 Link 和 Image 类型消息到 Facebook(Messenger APP)的两个接口;
2、Garena SDK Android 版本也在 4.0.21 版本将发送图片到 Facebook(Messenger APP) 标记为过期,并不再支持。
5)支持类型列表(Line)
分享类型 |
MSDK 接口 | 必填字段 | 所需 APP 和登陆状态 |
对应 Garena 方法 |
---|---|---|---|---|
图片 (Friend_REQ_IMG) | SendMessage | imagePath | 需要安装 Line APP | GGShareImageToLine |
链接 (Friend_REQ_LINK) | SendMessage | desc、link | 需要安装 Line APP | GGShareLinkToLine |
[info] Line 图片分享类型,imagePath 字段需要传本地绝对路径。
6)参数说明表
序号 | 参数名 | 用途 |
---|---|---|
1 | title | 标题 |
2 | desc | 概述,简单描述分享内容 |
3 | link | 分享链接,可以是图片链接、音乐链接、视频链接或者跳转链接等等 |
4 | imagePath | 本地图片地址或者是网络图片 URL(iOS 只支持网络图片) |
5 | thumbPath | 缩略图,一般就是游戏的 icon,可以是 icon 的本地地址或者是 icon URL(iOS 只支持网络图片) |
6 | mediaPath | 多媒体地址(音乐或者视频源) |
7 | user | 可以是 id 或者是 openid,比如静默分享时需要指定分享给指定的用户 |
8 | mediaTagName | 可以根据游戏需求,传入额外参数或者任意空字符串 |
9 | fbObjectId | 静默发送消息给游戏好友(Facebook)的目标玩家 openid |
7)好友功能高级用法(MSDK 5.7版本开始支持)
很多游戏经常会有发送邀请消息给好友,好友点击后可以直接进入游戏房间(或者队伍)的功能,MSDK 支持在发送消息的时候,将房间号等信息在 mediaTagName 参数中传递,并分享到 Garena 的聊天界面。这样,当对方点击该消息并拉起游戏时,mediaTagName 中的信息会透传给游戏客户端,并通过 onWakeupNotify 中的 wakeupRet.extraJson 中的 game_data 字段返回给游戏。其中,onWakeupNotify 中返回的结构体示例如下:
{
"ret":-1,
"msg":"",
"methodNameID":119,
"retCode":0,
"retMsg":"Success",
"extraJson":"{\"params\":\"{\\\"platform\\\":\\\"1\\\",\\\"from_open_id\\\":\\\"f9aed405b81abfbdfeb305c431335ca3\\\",\\\"open_id\\\":\\\"9317b7044e2feaeff33d1feac2de33b4\\\"}\",\"game_data\":\"33\"}"
}
当游戏的当前登录账号与 Garena APP 登录的账号不同或者当前没有登录账号的情况下,从消息体拉起账号会触发异账号,关于异账号的描述可以参考 切换游戏账号
[info]
1、iOS 的分享和发送图片只可以是网络图片,网络图片不会保存到本地;
2、发送 link 及 image 类型消息到 Facebook 接口依赖 Messenger APP,未安装 Messenger APP 的情况下会返回"eFlag_BT_NotSupportApi"的错误信息(iOS 设备);Android 端设备未安装 Messenger APP 的情况下会返回"Need install APP"的错误信息;
3、上面情况双端返回不一致的原因是 Garena SDK 提供了安卓端判断 Messenger APP 是否安装的接口,但是没有提供 iOS 端相应的接口;
4、如果使用 Facebook 渠道登录过游戏,就不能再作为 Garena 的子渠道 Facebook 登录了,会返回1013的错误码;
5、Garena 账号被绑定了之后,就再也不能被绑定了;
6、在任何子渠道登录的情况下(包括无登录态)都可以拉起 Line APP 进行发送消息;同样的,如果没有安装 Line APP 则不能发送消息到 Line。
4.5 上报事件到 Facebook 子渠道(MSDK 5.8 版本开始支持)
1)功能描述
MSDK 5.8版本后,Garena SDK 提供了上报事件到 Facebook 的接口,MSDK 侧对应的进行了封装,用以解决在业务接入 Garena 复杂渠道的同时,不能调用 Facebook SDK 接口上报事件到 Facebook 控制台的问题。
2)接口描述
public string Invoke (string channel, string extendMethodName, string paramsJson)
String MSDKExtend::Invoke(const String& channel, const String& extendMethodName, const String& paramsJson)
3)入参说明
序号 | 参数名 | 用途 |
---|---|---|
1 | channel | 当前登录渠道,在调用此接口时需要固定传入 Garena |
2 | extendMethodName | 调用扩展模块函数名,在调用此接口时固定传入 facebookReportEvent |
3 | paramsJson | 上报事件参数,需要以 JSON 字符串的形式传入,eventName 为必填字段,是上报事件的名称;params 参数中将各个键值对以 JSON Object 的形式传入,示例如下 {"eventName":"ReportEventName","params":"{"param1":"value1","param2":"value2"}"} |
4)上报结果查看
上报结果可以在 Facebook Developer 上,对应的应用控制台->查看应用分析查看
在应用分析界面,可以根据上报的事件名称点进对应的上报事件查看数据
[info]
1、调用事件上报接口,上报的事件会有一定程度的延迟(跟网络环境、Facebook 侧网络波动等因素有关),所以经常会出现有上报事件名称,但是没有详细数据的情况,这个是正常现象,一般建议收到上报成功的回调后半小时左右再查看;
2、Facebook 侧统计上报事件使用的时间并不是中国标准时间(UTC+8),如果查看当日事件查找不到对应上报的话,可以在控制台找到。日期修改为“昨天”或“最近7天”,再次查看事件上报结果;
3、事件上报的回调会通过 OnExtendRetEvent(C#) 或者 MSDKExtendObserver(C++)回调给游戏,建议参考上面的重置游客逻辑注册好相应的回调。
All rights reserved.