概述
MSDK登录功能是游戏玩家登录游戏的最快捷方便的方式:玩家可以使用QQ账号,微信账号,游客账号登录您的游戏,可用于iOS、Android的手机,平板设备。
显示详情接入向导
1 前置条件
1) 您已经在腾讯开放平台上注册游戏并通过审核,或您的腾讯接口人已经通过内部渠道帮您注册游戏。
2) 您已经按初始化模块说明完成 初始化。
3) 确认您的游戏登录权限已开通。完成游戏注册后此权限已经默认开通,如果您调用登录接口返回"-303, no permission",请联系MSDK联调支持的同学。
2 参考Demo示例
手Q登录示例参考 MSDKDemo/LoginViewController.mm 的登录部分。
微信登录示例参考 MSDKDemo/LoginViewController.mm 的登录部分。
3 调用此模块其他接口
完成前面1-2步骤后,即已完全接入此模块,可直接调用此模块的其他接口不需要额外的配置。此模块各部分说明如下。
1)授权登录:拉起手Q/微信客户端或web页面(手Q未安装)授权。
2)游客登录:游客模式授权。
3)异账号处理:手Q/微信平台要求处理不同账号登录的异账号场景。
4)获取票据:在游戏需要票据(如支付)的地方调用此接口可获取当前用户的票据信息。
5)退出登录:用户需要注销或切换账号时可调用此接口清除登录用户的票据信息。
Universal Link
Universal Link 是 Apple 从 iOS 9 引入的一种打通 web 和 app 之间跳转的机制。在 Safari 或者 WebView 中打开与 app 关联的链接时,会自动跳转到 app 并且不丢失参数内容。Universal Link 的使用、相关配置及平台侧(手Q、微信)支持情况等详细描述可参考 接入MSDK Universal link授权登录能力说明
检测 Universal Link
概要说明
MSDK 3.3.15 版本开始新增 Universal Link 接入后检测接口,可用于检测接⼊ Universal Link 是否正确接入。目前只支持微信平台, 仅可在MSDK测试环境下调用,请勿在正式环境调用
可通过OnCheckULNotify
回调查看检测结果。
1)示例代码
//设置回调
MyObserver* ob = MyObserver::GetInstance();
WGPlatform::GetInstance()->WGSetObserver(ob);
//检查微信 UL
WGPlatform::GetInstance()->WGCheckWXUniversalLink();
//回调示例例
void MyObserver::onCheckULNotify(CheckULRet& checkUlRet)
{
if (checkUlRet.success)
{
//检测成功
}
}
2)CheckULRet 数据结构介绍
//CheckULRet 数据结构介绍
typedef struct sCheckULRet
{
int step; // 检查步骤
bool success; // 检测是否成功
std::string errorInfo; // 错误信息
std::string suggestion; // 建议开发者处理方案
sCheckULRet() {}
} CheckULRet;
// 其中 step 分 7 步骤,对应枚举类型如下:
typedef enum _eULCheckStep {
eULCheckStepParams, // 参数检查
eULCheckStepSystemVersion,// 当前系统版本检查
eULCheckStepWechatVersion,// 微信客户端版本检查
eULCheckStepSDKInnerOperation,// 微信SDK内部操作检查
eULCheckStepLaunchWechat,// App拉起微信检查
eULCheckStepBackToCurrentApp,// 由微信返回当前App检查
eULCheckStepFinal,// 最终检查
} eULCheckStep;
// 会依次回调这 7 个 step,当回调了 eULCheckStepFinal,说明检测通过,Universal Link 接入成功。 任一 step 回调的 success 为 false, 流程终止,后续不再回调,可以根据 errorInfo 查看当前步骤错误的原因,根据 suggestion 修复问题。
Apple 登录
msdk 3.3.12 版本开始支持 Apple 登录。
配置说明
1 Apple Developer Potral 配置
实现 Sign in with Apple 功能之前,需要在 Apple Developer Portal:
- 获取 Team ID;
- 创建用于向 Apple 发送请求时标识请求来源的 client_id;
- 对于 iOS 应用来说,client_id 亦即 App ID(Bundle ID)
- 创建描述文件
- 创建用于计算 client_secret 的 key 以及对应的 Key ID;
1.1 获取 Team ID
- 登录 Apple Developer Portal,点击 Account;
- 点击左侧边栏的 Membership,即可看到 Team ID;
1.2 创建 App ID
- 登录 Apple Developer Portal,点击 Account;
- 点击左侧边栏的 Certificates, IDs & Profiles;
- 点击左侧边栏的 Identifiers,然后点击蓝色加号;
- 第一步选择 App IDs,点击 Continue;
- 输入 Description 以及 Bundle ID,在 Capabilities 下勾选 Sign in with Apple;
- 点击 Continue,点击 Register;
对于现存 App ID 来说,只需找到想要增加 Sign in with Apple 的 App ID ,在 Capabilities 下勾选 Sign in with Apple 即可。
1.3 创建描述文件
- 登录 Apple Developer Portal,点击 Account;
- 点击左侧边栏的 Certificates, IDs & Profiles;
- 点击左侧边栏的 Profiles,然后点击蓝色加号;
- 选择证书类型, 点击 Continue
- 选择上一步注册的 App ID, 点击 Continue
- 选择签名证书,点击 Continue
- 选择设备,点击 Continue
- 为描述文件命名,点击 Continue
- 下载描述文件,点击 Download
- 安装下载的描述文件到开发或者打包环境中
对于现存的描述文件来说,只需在 App ID 的 Capabilities 添加 Sign in with Apple 之后, 重新编辑、保存和下载即可
1.4 创建 Key 以及获取 Key ID
- 登录 Apple Developer Portal,点击 Account;
- 点击左侧边栏的 Keys,然后点击蓝色加号;
- 输入 Key Name,勾选 Sign in with Apple;
- 点击 Sign in with Apple 旁边的 Configure,选择上述配置了 Sign in with Apple 功能的 App ID 作为 Primary App ID,点击保存;
- 点击 Continue,点击 Register;
- 下载 Key 文件(只能下载一次,确保不要丢失),获取 Key ID
将上述过程中获得的 App ID,Team ID,Key ID,Key 文件中的内容在游戏接入时配置到飞鹰系统中即可。配置路径在:游戏管理 -> 我的游戏 -> SDK参数 -> 搜索:编辑iOS信息 -> MSDKV3苹果渠道配置(联调环境/正式环境)。
2 iOS 工程配置
Apple 从 XCode 11开始支持 Apple ID 登录,当运行的 iOS 系统版本在 iOS 13 及以上版本的时候,功能正常,否则登录返回错误码 8002 eFlag_Apple_NotSupport
2.1 Xcode 中添加 Capability
2.2 Xcode BuildPhases 配置
在 Xcode BuildPhases 中添加 AuthenticationServices.framework,同时设置Status 为 optional,Xcode 11 编译可以不设置 optional,默认即可
Apple 登录界面要求
[human-interface-guidelines] 是苹果要求的界面风格,有明确的界面要求,游戏方需要关注的是:
按钮的外观颜色要求
登录按钮存在三种外观:白色、带边框的白色和黑色。选择适合背景的按钮外观有要求
白色按钮
用于深色或者彩色背景
白色按钮带边框
用于不能提供足够对比度的白色或者浅色白净
黑色按钮
用于提供足够对比度的白色或浅色背景
按钮的位置要求
- 使用与其他登录按钮大小相同的 Apple 登录按钮
- 避免让滚动才看到按钮
- 默认情况下,“使用 Apple 登录” 按钮具有圆角
- 此外按钮不能出现拉伸或者压缩导致的比例丢失
- 按钮需要在所有其他登录方式上面
其他关注点
苹果提供了 “Sign in With Apple” 和 “Continue With Apple” 两种文档用于登录按钮(Objective-c 和 Swift 原生UI组件),业务侧可选择符合您登录体验的文案,文案的语言会随着手机系统语言进行本地化。
Apple 登录 openID 的说明
同一开发者账号下的所有 App,在同一个 iCloud 账号下返回的 userID 均相同, MSDK 后台透传该 userID 作为 openID 使用。
iCloud 账号在 Apple 登录时 userID 变化情况说明
操作 | 结果 |
---|---|
同一 App,多次登录 | userID 值不变 |
同一 App,卸载后安装 | userID 值不变 |
同一开发者账号下的所有 App | userID 值相同 |
iCloud 账号不同 ,App 相同 | userID 值不同 |
授权登录
概要说明
拉起手Q/微信客户端或web页面(手Q未安装)授权,在用户授权以后通过OnLoginNotify
回调通知游戏获取到LoginRet登录信息。
注册回调
1)功能描述
为接收MSDK的登录回调,您需要设置回调Observer,建议在游戏启动的两个入口处设置。登录结果会通过回调函数OnLoginNotify
通知给您。
2)接口声明
void WGSetObserver(WGPlatformObserver* pObserver);
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
pObserver | WGPlatformObserver 类 | 登录结果信息类,具体成员跳转查看 |
4)返回值
无
5)示例代码
//设置回调
MyObserver* ob = MyObserver::GetInstance();
WGPlatform::GetInstance()->WGSetObserver(ob);
//回调示例
void MyObserver::OnLoginNotify(LoginRet& loginRet)
{
if(loginRet.flag == eFlag_Succ)
{
//登录成功
//游戏TODO:进入游戏
}
else if (loginRet.flag == eFlag_NeedRealNameAuth)
{
//需要进行实名认证,业务可自行设置实名认证流程,在info.plist中配置MSDK_REAL_NAME_AUTH_SWITCH,默认0;3.2.14版本后要求配置必须为1
//0,业务无需做任何操作保持在登录页即可,MSDK自动弹出实名注册界面引导用户注册,注册完引导用户重新登录
//1,业务无需做任何操作保持在登录页即可,MSDK自动弹出实名注册界面引导用户注册,业务需再次监听登录回调,实名注册成功MSDK会自动调用本地票据登录接口进行自动登录
}
else
{
//登录失败
//游戏TODO:根据flag提示玩家相关信息
}
}
6)特殊说明
V3.3.21 版本 开始新增授权登录回调中微信授权scope字段透传能力,如下:
授权登录回调OnLoginNotify
中,新增微信授权scope字段透传,业务侧可根据该字段判断用户是否有授权关系链权限;scope字段在LoginRet
的extra_json
中,示例如下:
用户授权关系链权限的scope样式:
loginRet.extra_json = "{\"scope\":\"snsapi_userinfo,snsapi_friend,snsapi_message\"}";
用户未授权关系链权限的scope样式:
loginRet.extra_json = "{\"scope\":\"snsapi_userinfo,snsapi_message\"}";
注意事项:
1.授权登录scope透传仅限微信平台,QQ平台不支持
2.授权登录时默认个人信息与好友关系链在同一页面授权。如需好友关系链单独授权页面:
- 微信平台需向微信(企业微信
wxgame
)平台侧申请开通 - QQ平台当前不再支持该特性配置,请关注后续版本更新
7)名称解释
名称 | 描述 | 支持平台 | 调用接口 |
---|---|---|---|
授权登录 | 游戏通过拉起平台的授权界面,引导用户授权游戏获得登录所需票据 | 手Q/微信 | WGLogin |
快速登录 | 玩家的操作使平台拉起游戏时会透传登录相关的票据信息从而登录进入游戏。 | 手Q | 无 |
自动登录 | 之前已经在手Q或微信给游戏授权过,那么下次启动游戏时可用保存在本地的票据直接登录,避免再次唤起手Q/微信 | 手Q/微信 | WGLogin |
自动刷新 | MSDK提供自动刷新微信票据接口 | MSDK 提供功能 | 无 |
异账号 | 当前游戏内登录的账号和平台登录的账号不一致 | MSDK 提供功能 | WGSwitchUser |
推荐登录流程
调用登录
1)功能描述
您可以通过调用WGLogin
接口进行指定平台拉起授权登录 或者 进行自动登录,调用结果会通过回调函数OnLoginNotify
通知给您,函数声明及调用示例代码如下:
2)接口声明
void WGLogin(ePlatform platform = ePlatform_None);
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
platform | ePlatform 枚举 | 游戏需要授权登录的平台类型 |
4)返回值
无,登录信息通过OnLoginNotify
回调返回给游戏
5)示例代码
//QQ登录,QQ登录前需设置QQ相关权限
WGPlatform::GetInstance()->WGSetPermission(eOPEN_ALL);
WGPlatform::GetInstance()->WGLogin(ePlatform_QQ);
//微信登录
WGPlatform::GetInstance()->WGLogin(ePlatform_Weixin);
//游客登录(仅iOS)
WGPlatform::GetInstance()->WGLogin(ePlatform_Guest);
//Apple登录(仅iOS)
WGPlatform::GetInstance()->WGLogin(ePlatform_Apple);
6)特殊说明
-
因为微信和手Q各自的bug,会导致游戏在多个场景下收不到登录回调。游戏在调用WGLogin后,然后回到游戏时建议做一个超时判断, 如果超过15秒则认为登录超时。其中收不到回调的场景包括但不限于:
i) 在iOS9以上系统,点击授权页面左上角系统自带的“返回xx游戏”按钮,不会有登录回调 -
MSDK 3.3.22版本开始支持微信视频号授权,调用WGLogin接口,传入 ePlatform.ePlatform_WeixinVideoLive,在MSDK的回调中获取tdiAuthBuffer,用于后续的直播登录。
视频号授权注意事项:
- 视频号直播授权当前仅支持微信渠道
- 登录回调中tdiAuthBuffer存在于_extra_json字段中,以Base64的格式返回,通过Json解析获取,请使用标准的Base64解码后使用
- MSDK仅做tdiAuthBuffer内容的返回,具体使用方法联系MSDK助手对接
7)名词解释
无
调用登录(3.0.8及以上版本使用)
1)功能描述
具有防重复点击,防超时功能,您可以通过调用WGLogin 接口进行指定平台拉起授权登录 或者 进行自动登录,调用成功返回eFlag_Succ,如果正在登录中返回eFlag_Logining,登录结果会通过回调函数通知给您,函数声明及调用示例代码如下:
2)接口声明
eFlag WGLoginOpt(ePlatform platform = ePlatform_None, int overtime = DEFAUTL_LOGIN_OVERTIME);
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
platform | ePlatform 枚举 | 游戏需要授权登录的平台类型 |
overtime | int | 登录超时时间,超时从授权回来开始计算,单位秒 |
4)返回值
成功返回eFlag_Succ,如果正在登录中返回eFlag_Logining,登录信息通过 WGPlatformObserver 回调返回给游戏
5)示例代码
//QQ登录,QQ登录前需设置QQ相关权限
WGPlatform::GetInstance()->WGSetPermission(eOPEN_ALL);
WGPlatform::GetInstance()->WGLoginOpt(ePlatform_QQ,20);
//微信登录
WGPlatform::GetInstance()->WGLoginOpt(ePlatform_Weixin,20);
//游客登录(仅iOS)
WGPlatform::GetInstance()->WGLoginOpt(ePlatform_Guest,20);
6)特殊说明
msdk增加了登录超时的回调
7)名词解释
无
游客登录
概要说明
由于苹果审核要求用户在不提供任何账号密码的情况下可完整体验游戏流程,MSDK提供游客模式方便游戏快速接入实现该要求,目前游客模式仅限于iOS端。游客模式登录和获取票据同手Q、微信一样,可参考授权登录和获取票据。除了登录和获取票据游客模式还需注意以下几点事项:
1 游客模式支付 游客模式支付同手Q、微信支付一样,需先调用米大师的注册支付(补发货)接口,然后再调用支付接口,支付时需注意游客模式的session_id和session_type的值为:
//支付时游客模式session_id和session_type固定为:
sessionId = "hy_gameid";
sessionType = "st_dummy";
2 游客模式不支持的接口 有些接口如关系链、LBS、公告等接口游客模式是不支持的,若游戏在游客模式下调用这些接口时返回值相对应的Ret的flag为eFlag_InvalidOnGuest,请注意该flag。
3 游客重置 在GameServer清除相关数据之后,可以调用游客重置接口清除MSDK留在终端的Guest账号数据,下次登录Guest模式将会生成新的Guest账号。
4 玩家提醒 由于游客模式无需任何账号密码,故游客模式账号、游戏数据仅限本机使用。以下几种场景将导致游客数据丢失:
1) iPhone升级或降级系统后重新激活并设置为新的iPhone
2) 还原并抹掉iPhone数据
3) 删除游戏并重装
故用户在进行游客模式登录时可进行友好提醒,具体提醒可参考:
游客登录流程
在Guest模式下,登录分为注册和登录两个序列。但两个场景的差异性被MSDK屏蔽,游戏不需关心两者的不同。这里只做方案说明:
账号模式和Guest模式流程比较
注册回调
参见授权登录 注册回调
调用登录接口
参见授权登录登录接口调用
调用刷新游客id接口
1)功能描述
刷新游客模式下的id。
2)接口声明
void WGResetGuestID();
3)参数说明
无
4)返回值
无
5)示例代码
WGPlatform::GetInstance()->WGResetGuestID();
6)特殊说明
现网版本请勿调用游客重置接口,以防用户数据丢失。
7)名词解释
无
扫码登录
1)功能描述
支持拉起登录二维码显示界面,玩家可以通过另外一个已经登录微信/QQ 对应社交账号的手机扫描二维码,根据提示授权后,游戏即可获得登录票据信息,一般用于电视或平板环境,或者手机未安装平台客户端的情况。无论机器上是否有安装微信/QQ APP,均可拉起二维码进行扫码授权登录。
备注:3.3.16 版本开始支持QQ 扫码登录。
2)接口声明
void WGQrCodeLogin(ePlatform platform);
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
platform | int | 游戏需要授权登录的平台类型 |
4)返回值
无,登录信息通过 WGPlatformObserver 回调返回给游戏
5)示例代码
WGPlatform::GetInstance()->WGQrCodeLogin((ePlatform)Platform);
6)特殊说明
关于微信扫码登录权限:非精品的游戏统一由游戏邮件向微信申请,精品的游戏由协同统一接入处理。
拉取到的二维码图片有效期5分钟,过期扫码无法登录成功。
7)名称解释
无
微信视频号授权(跨平台)
1)功能描述
MSDK 封装视频号授权接口,通过调用 WGChannelPermissionAuth 接口,当前微信要求传入 snsapi_channels_livestream,在 MSDK 的回调中获取 tdiAuthBuffer,用于后续的直播登录。3.3.26 版本开始新增该接口。
2)示例代码
请使用 WGChannelPermissionAuth 接口,参数设置为 ePlatform.ePlatform_WeixinVideoLive、snsapi_channels_livestream,在视频号授权的接口 ChannelPermissionAuthEvent 接收回调。调用示例:
// ePlatform_WeixinVideoLive,表示微信视频号渠道
// snsapi_channels_livestream,同时也是一个特殊标记权限
WGPlatform.Instance.WGChannelPermissionAuth(ePlatform.ePlatform_WeixinVideoLive, "snsapi_channels_livestream");
回调示例:
MsdkEvent.Instance.ChannelPermissionAuthEvent += (LoginRet ret) =>
{
Debug.Log(ret.ToString());
message = ret.ToString();
switch (ret.flag)
{
case eFlag.eFlag_Succ:
// 视频号授权成功
Debug.Log("视频号授权成功!");
break;
case eFlag.eFlag_WX_UserCancel:
Debug.Log("视频号授权-用户取消!");
break;
case eFlag.eFlag_WX_UserDeny:
Debug.Log("视频号授权-用户拒绝!");
break;
default:
// 视频号授权失败
Debug.Log("视频号授权失败!");
break;
}
};
返回结果:
{
"_flag": 0,
"_desc": "",
"_platform": 8,
"_open_id": "",
"_user_id": "",
"_pf": "",
"_pf_key": "",
"_token": [],
"_prajna_ext": "",
"_extra_json": "{\"tdiAuthBase64\":\"Cp4BMV9CZ0FBYTRpb3RxYVA3aUgwQ1AzejkzRlZWY0Y4OG55NmZPZlZtaXh3ZUZNVHMwYVdJK0FF\\nVFpQR1c1SnpKbDdySWpnSnV6MEJRL2EyUXlQQlJWMG0xejNlTzRTR25ZN1VvSmt4N01idmxyemVp\\nOGNRU21lSnkxZGt6M0JubTFsNkgxZGJIMWVYRWNMMDdJa3dlYzJQMVZCUmhnPT0SF2lsaW5rYXBw\\nXzA2MDAwMDNiNzhjMTc2\\n\"}"
}
3)注意事项
- 视频号授权当前仅支持微信视频号
- 当前传入 snsapi_channels_livestream,后续微信可能会变动
- 登录回调中 tdiAuthBuffer 存在于 _extra_json 字段中,以 Base64 的格式返回,通过 Json 解析获取,请使用标准的 Base64 解码后使用
- 该功能不限制登录渠道及登录态,即可以跨平台调用该接口
- MSDK 仅做 tdiAuthBuffer 内容的返回,具体使用方法联系MSDK助手对接
第三方平台拉起登录
MSDK 3.3.21及以上版本需关注
为对抗租号平台,从MSDK 3.3.21版本开始屏蔽QQ游戏中心启动游戏时的快速登录能力,游戏未登录状态下从QQ游戏中心启动将无法直接登录成功进入游戏;游戏中心启动异账号场景相关操作指引(游戏评估处理):
1) 游戏未登录:保持在登录页或调用QQ登录拉起QQ授权
2) 游戏已登录:
2.1) 无异账号:等待MSDK登录回调,登录成功则可进游戏
2.2) 有异账号:
2.2.1) 用户选择本地账号:等待MSDK登录回调,登录成功则可进游戏
2.2.2) 用户选择拉起账号:退回登录页或调用QQ登录拉起QQ授权页
注意事项:
更新到3.3.21版本的业务需联系QQ平台侧,取消业务在QQ游戏中心启动时scheme携带的accesstoken、paytoken字段,避免已登录用户游戏内登录态受影响。
1)功能描述
可以在手Q游戏列表,或分享链接中直接将手Q已登录的账号信息传到游戏实现登录,不需要游戏再次授权。
- 环境依赖:
- MSDK 1.8.0i以上;
- 手Q4.6.2以上;
- 游戏配置scheme:
- 成功则拉起游戏,携带openId、accessToken、payToken、pf和pfKey。
2)接口声明
为接收MSDK提供的游戏被拉起的回调,您需要处理OnWakeupNotify
回调。
- 第三方平台拉起登录和异账号结果在wakeupRet的flag中返回,相关的flag说明如下:
eFlag_Succ:
不存在异账号,成功唤起。这种情况下的拉起App的URL不携带票据,和之前版本的拉起一致。
eFlag_AccountRefresh:
不存在异账号,MSDK已通过拉起App的URL携带的票据信息将本地账号票据刷新。
eFlag_UrlLogin:
不存在异账号,游戏通过第三方平台信息登录成功。游戏接收到此flag以后直接读取LoginRet结构体中的票据进行游戏授权流程。
eFlag_NeedLogin:
游戏本地账号和拉起账号均无法登录。游戏接收到此flag以后需要弹出登录页让用户登录。
eFlag_NeedSelectAccount:
游戏本地账号和拉起账号存在异账号,游戏接收到此flag以后需要弹出对话框让用户选择登录的账号。
当flag为eFlag_NeedSelectAccount时,游戏需要弹出对话框由用户选择使用原账户,还是第三方平台携带的账户。这是手Q平台要求必须实现的逻辑,不实现在平台审核时将会被拒绝上线。
提示示例(界面由各游戏分别实现)
![Alt text](./res/QQ5.png)
用户选择后,需要调用WGSwitchUser接口进行异账号后续逻辑处理。(两个选项都需要调用下面这个接口,详见示例代码)
bool WGSwitchUser(bool flag);
描述: 通过外部拉起的URL登录。该接口用于异账号场景发生时,用户选择使用外部拉起账号时调用。 参数: - flag - 为YES时表示用户需要切换到外部账号,此时该接口会使用上一次保存的异账号登录数据登录。登录成功后通过onLoginNotify回调;如果没有票据,或票据无效函数将会返回NO,不会发生onLoginNotify回调。 - 为NO时表示用户继续使用原账号,此时删除保存的异账号数据,避免产生混淆。 返回 如果没有票据,或票据无效将会返回NO;其它情况返回YES。
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
wakeupRet | WakeupRet 结构体 | 游戏拉起的信息 |
4)返回值
无
5)示例代码
- 在拉起app时增加设置回调的代码
-(BOOL)application:(UIApplication*)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSLog(@"url == %@",url);
WGPlatform* plat = WGPlatform::GetInstance();
WGPlatformObserver *ob = plat->GetObserver();
if (!ob) {
MyObserver* ob = new MyObserver();
ob->setViewcontroller(self.viewController);
plat->WGSetObserver(ob);
}
return [WGInterface HandleOpenURL:url];
}
- 拉起回调代码示例如下:
void MyObserver::OnWakeupNotify (WakeupRet& wakeupRet)
{
switch (wakeupRet.flag)
{
case eFlag_Succ:[viewController setLogInfo:@"唤醒成功"];
break;
case eFlag_NeedLogin:[viewController setLogInfo:@"异账号发生,需要进入登录页"];
break;
case eFlag_UrlLogin:[viewController setLogInfo:@"异账号发生,通过外部拉起登录成功"];
break;
case eFlag_NeedSelectAccount:
{
[viewController setLogInfo:@"异账号发生,需要提示用户选择"];
UIAlertView *alert = [[[UIAlertView alloc]initWithTitle:@"异账号" message:@"发现异账号,请选择使用哪个账号登录" delegate:viewController cancelButtonTitle:@"不切换,使用原账号" otherButtonTitles:@"切换外部账号登录", nil] autorelease];
[alert show];
}
break;
case eFlag_AccountRefresh:[viewController setLogInfo:@"外部账号和已登录账号相同,使用外部票据更新本地票据"];
break;
default:
break;
}
if(eFlag_Succ == wakeupRet.flag ||
eFlag_NeedLogin == wakeupRet.flag ||
eFlag_UrlLogin == wakeupRet.flag ||
eFlag_NeedSelectAccount == wakeupRet.flag ||
eFlag_AccountRefresh == wakeupRet.flag)
{
[viewController setLogInfo:@"唤醒成功"];
}
else
{
[viewController setLogInfo:@"唤醒失败"];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
BOOL switchFlag = NO;
switch (buttonIndex)
{
case 0:
NSLog(@"用户选择不切换账号");
break;
case 1:
{
NSLog(@"用户选择切换账号");
switchFlag = YES;
}
break;
default:
break;
}
WGPlatform* plat = WGPlatform::GetInstance();
plat->WGSwitchUser(switchFlag);
6)特殊说明
- 手Q版本4.6以上才支持快速登录。
- URL Types中的scheme 需配置tencentlaunch+AppID拉起时才会携带登录信息。
异账号处理
概括说明
用户从平台拉起进入游戏,因为账号不一致(平台不一致或者平台一致但账号不一致),需要游戏弹框提示异账号。异账号场景详细描述参考异账号说明文档
处理回调
为接收MSDK提供的游戏被拉起的回调,您需要处理OnWakeupNotify
回调。
1)功能描述
平台拉起进入游戏携带的信息,会通过OnWakeupNotify
传递给游戏。
2)接口声明
virtual void OnWakeupNotify(WakeupRet& wakeupRet) = 0;
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
wakeupRet | WakeupRet 结构体 | 游戏拉起的信息 |
4)返回值
无
5)示例代码
void MyObserver::OnWakeupNotify(WakeupRet& wakeupRet)
{
switch (wakeupRet.flag)
{
case eFlag_Succ:
//本地账号登录成功,可直接进入游戏,或也可调用自动登录接口WGLogin(),等待登录回调
break;
case eFlag_NeedLogin:
//没有有效的票据,登出游戏让用户重新登录
break;
case eFlag_UrlLogin:
//本地无账号信息,自动用拉起的账号登录,需等待登录回调
break;
case eFlag_NeedSelectAccount:
//需要弹出提示框让用户选择登录的账号,并根据用户的选择调用WGSwitchUser接口
break;
case eFlag_AccountRefresh:
//外部账号和已登录账号相同,使用外部票据更新本地票据,需等待登录回调
break;
default:
break;
}
}
6)特殊说明
收到eFlag_NeedSelectAccount
时即为触发异账号场景,此时游戏需要弹出提示框让用户选择需要登录的账号,并根据用户的选择调用WGSwitchUser:
接口,如果WGSwitchUser:
返回true,则等待OnLoginNotify
回调获取切换账号的结果,如果WGSwitchUser:
返回false,则需退至登录页让玩家重新授权登录。
7)名词解释
切换账号
1)功能描述
当异账号判断的wakeupRet.flag为eFlag_NeedSelectAccount时,游戏需要弹框提示用户,选择本地账号或者拉起账号登录游戏,游戏需要根据用户选择的结果调用接口WGSwitchUser:
完成用户登录。
2)接口声明
bool WGSwitchUser(bool flag);
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
flag | bool | true : 切换到外部账号; false : 继续使用原账号 |
4)返回值
true : 表明此账号有票据。MSDK会去验证此票据的有效性,并在OnLoginNotify
中返回验证结果。
false : 表明此账号无票据或票据不合法。可直接登录,让用户重新授权登录。
5)示例代码
WGPlatform* plat = WGPlatform::GetInstance();
BOOL success = plat->WGSwitchUser(switchFlag);
if (success)
{
//切换成功,等待OnLoginNotify回调
}
else
{
//切换失败,调用WGLogout接口并退出至登录页
plat->WGLogout();
}
6)特殊说明
无
7)名词解释
无
获取票据
1)功能描述
您在登录回调中通过解析LoginRet中的 TokenRet可以获得登录的回调票据,除此之外,您还可以调用WGGetLoginRecord
接口来获取当前的登录票据。LoginRet票据信息中包含玩家的openid,pf,pfkey,LoginRet中的TokenRet包含pay_token(QQ登录时特有),access_token(微信登录时特有)等信息。您在进行支付时将会用到这些信息。
2)接口声明
int WGGetLoginRecord(LoginRet& loginRet);
3)参数说明
参数名称 | 类型 | 说明 |
---|---|---|
loginRet | LoginRet 结构体 | 登录票据的信息 |
4)返回值
返回值为票据信息对应登录平台
5)示例代码
LoginRet ret;
WGPlatform::GetInstance()->WGGetLoginRecord(ret);
if (ret.flag == eFlag_Succ)
{
//获取票据成功,可正常读取票据信息
}
else if (ret.flag == eFlag_Checking_Token)
{
//MSDK正在检查票据有效性,可稍等3~5秒再次获取
}
else
{
//本地无票据或票据无效
}
6)特殊说明
1、您通过此接口获取到的票据以后需要判断LoginRet.flag,如果为0(eFlag_Succ),则票据正常有效可直接使用;如果为5001(eFlag_Checking_Token),这表明MSDK正在校验票据,此时获取到的票据无效。需要稍后重试。
2、该接口会涉及到查询本地数据库,高频调用会对性能有损耗,所以不适合高频调用。例如unity游戏不要在update函数频繁调用
7)名词解释
实名制
按照文化部《网络游戏管理暂行办法》的相关要求,网络游戏用户需要使用有效身份证件进行实名注册才可登录游戏,为了减轻游戏开发的负担我们为游戏定制了实名认证的界面以及整套接口,通过该模块您可以花费几分钟的时间来完成实名认证的功能。
实名制详细描述参考实名制说明文档
退出登录
1 概括说明
您可以调用WGLogout接口来退出登录,清除本地票据
2 注册回调
无
3 调用接口
1)功能描述
获得登录的回调票据
2)接口声明
bool WGLogout();
3)参数说明
无
4)返回值
返回true,您无需处理返回值
5)示例代码
WGPlatform::GetInstance()->WGLogout();
6)特殊说明
无
7)名称解释
无
MSDK票据自动刷新流程
MSDK2.6.0i版本之后,在支持之前版本登录流程的基础上优化了新流程,业务只需关注WGLogin
、WGGetLoginRecord
两个接口即可完成登录和票据处理。
-
游戏自动登录的调用逻辑:
游戏启动直接调用
WGLogin()
接口,等待OnLoginNotify()
回调,流程如下:
-
游戏需要登录票据时的调用逻辑:
调用
WGGetLoginRecord()
接口,当返回值flag = 5001时表明MSDK内部正在校验票据有效性,可过几秒钟再次尝试调用获取,流程如下:
- MSDK内部票据校验、刷新逻辑:
常见问题
- 游戏前后台切换用检查票据吗?
游戏在前后台切换时无需校验票据有效性。如果游戏中后台时间过长再切前台时,MSDK会自动校验票据有效性。
- Apple 登录常见问题
1.返回-3003;检查 App ID,Team ID,Key ID,Key 文件中的内容在飞鹰系统中配置是否正确。检查路径:游戏管理 -> 我的游戏 -> SDK参数 -> 搜索:编辑iOS信息 -> MSDKV3苹果渠道配置(联调环境/正式环境)。
2.返回-3008; 检查使用的BundleID与飞鹰系统配置的是否匹配。
3.返回-3011;检查MSDK 客户端和服务端的环境是否匹配,MSDK环境需要一致。
4.Apple 证书如何添加 Sign in With Apple 能力?Apple 证书相关能力,需要联系证书的提供者添加相应能力并更新证书。一般是联系 KeyStore-helper 证书助手或者蓝盾助手。使用带有 Sign in With Apple 的能力的证书打包后,不要进行重签名操作。