Unity3D SDK集成文档
<p>[TOC]</p>
<h2>变更历史</h2>
<table>
<thead>
<tr>
<th>编写日期</th>
<th>编写人员</th>
<th>版本</th>
<th>修改内容</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019.05.18</td>
<td>jack.deng</td>
<td>1.0.0</td>
<td>创建、首次编写</td>
<td>无</td>
</tr>
<tr>
<td>2019.06.14</td>
<td>fluty.xie</td>
<td>1.0.1</td>
<td>增加Android Q平台配置,分享配置</td>
<td>无</td>
</tr>
<tr>
<td>2019.06.28</td>
<td>jack.deng</td>
<td>1.3.3</td>
<td>统一接入方式后,更新iOS的部分。</td>
<td>无</td>
</tr>
<tr>
<td>2019.08.15</td>
<td>jack.deng</td>
<td>1.3.5</td>
<td>新增用户反馈问卷调查模块的描述</td>
<td>无</td>
</tr>
<tr>
<td>2019.09.26</td>
<td>buck.yu</td>
<td>1.3.9</td>
<td>新增Android自动打包说明补充</td>
<td>无</td>
</tr>
<tr>
<td>2019.09.26</td>
<td>jack.deng</td>
<td>1.4.1</td>
<td>1.有自动脚本之后,自动配置的部分有脚本实现,不需要用户操作,删除掉。2.新增Android热更新的说明</td>
<td>无</td>
</tr>
<tr>
<td>2019.11.07</td>
<td>buck.yu</td>
<td>1.4.1.2</td>
<td>添加用户隐私协议ui接口,添加获取自定义配置接口</td>
<td>无</td>
</tr>
<tr>
<td>2019.11.25</td>
<td>buck.yu</td>
<td>1.4.2</td>
<td>广告追踪接口,政策需求全局回调新增</td>
<td>无</td>
</tr>
<tr>
<td>2019.12.11</td>
<td>buck.yu</td>
<td>1.5.0</td>
<td>同步微信用户信息,lbs功能获取附近的人</td>
<td>无</td>
</tr>
<tr>
<td>2019.12.25</td>
<td>buck.yu</td>
<td>1.5.1</td>
<td>1、增加用户信息更新全局事件通知;2、增加渠道实名认证接口;3、支持客户端传入支付回调地址</td>
<td>无</td>
</tr>
<tr>
<td>2020.01.08</td>
<td>buck.yu</td>
<td>1.6.0</td>
<td>1、集成jpus; 2、lbs/获取当前位置</td>
<td>无</td>
</tr>
<tr>
<td>2020.01.18</td>
<td>buck.yu</td>
<td>1.7.0</td>
<td>1、更新微信 手q sdk 2、新增兑换码功能</td>
<td>无</td>
</tr>
<tr>
<td>2020.03.1</td>
<td>buck.yu</td>
<td>1.8.0</td>
<td>1、修复社区崩溃 2、增加直播接口 3、增加获取联系人</td>
<td>无</td>
</tr>
<tr>
<td>2020.01.18</td>
<td>buck.yu</td>
<td>1.9.0</td>
<td>1、新增微博分享 2、新增lbs授权接口</td>
<td>无</td>
</tr>
<tr>
<td>2020.03.30</td>
<td>buck.yu</td>
<td>1.9.3</td>
<td>集成OpenInstall支持</td>
<td>无</td>
</tr>
</tbody>
</table>
<h2>重要信息</h2>
<ul>
<li>
<p>在接入SDK之前,需要在我们后台申请账号并且创建应用参数,具体可以参考 <a href="https://www.showdoc.cc/mssdk?page_id=2692703335764519">技术中台服务接入指南</a> 文档。</p>
</li>
<li>
<p>在接入过程中遇到任何问题或者有不清楚的地方,请 <a href="https://www.showdoc.cc/mssdk?page_id=2615409307929897">联系我们</a>.</p>
</li>
<li>开发者接入SDK完成后,可以按照我们提供的测试用例进行自测。测试用例如下:
<img src="https://github.com/veryitman/MSSDKResource/blob/mark-feature/sdk_test_case.png?raw=true" alt="" /></li>
</ul>
<p>该文档写了如何集成乐逗公版的方法,如果要出乐逗外的渠道包可以参考 <a href="https://www.showdoc.cc/mssdk?page_id=3651814975352989">Unity 渠道接入</a> 文档;</p>
<h2>1. Unity SDK 简介</h2>
<p>针对Unity游戏开发者,接入原生SDK(iOS/Android)虽然能够正常使用SDK的所有功能,考虑到很多工作室都使用Unity引擎做游戏开发,因此,中台在原生SDK的基础上,开发了Unity版本的SDK,使用Unity的游戏开发者只需要关心自己的业务逻辑,进一步降低开发成本。</p>
<h3>1.1 Unity SDK 特点</h3>
<p>Unity SDK在原生SDK基础上实现了以下功能:</p>
<ul>
<li>
<p><strong>接口业务层封装</strong>
原生SDK为了灵活性需要,采用了通用参数的设计方案,即传入参数为字典类型,字典的含义通过文档说明。输出的结果为id/Object这种通用类型。使用时虽然比较灵活,但是并不清晰,业务方通常需要查询相应的文档,才能知道需要传入什么参数以及接口会返回什么类型。Unity接口在此基础上,做了业务级封装,使用时,业务根据具体业务需求,明确调用特定接口,传入业务相关参数,返回时,也明确返回C#的对象。对象结构和内容在业务层清晰可见,无需翻阅文档。</p>
</li>
<li>
<p><strong>封装Unity和Native的通信过程</strong>
接入Native SDK,需要实现Native端和C#端的双向通信。这种通信过程,不是游戏业务相关的内容,属于平台相关的内容。不应该让游戏开发者关心。因此,Unity SDK封装了相关的通信技术细节,只需要在业务层调用C#业务相关的接口,就可以实现相应的功能。不必维护和实现这些底层的通信机制。</p>
</li>
<li><strong>自动配置平台相关的一些信息</strong>
对于平台接入,通常需要配置平台相关的一些内容,诸如iOS的添加Framework,添加编译参数之类的工作。这些工作也是和接入SDK相关的工作,并不属于业务方,Unity SDK结合Unity本身的机制,帮助开发者自动完成相应的内容,简化了接入相关的工作。</li>
</ul>
<p>因此对于普通的Unity游戏开发者,极力推荐使用Unity SDK。</p>
<h3>1.2 特别注意</h3>
<p><strong>特别注意:如果开发者的应用有服务器(如强登录的APP)资源可以考虑在服务端接入我们的相关接口,这样可以保证登录和支付的安全。具体接入文档可以查看 <a href="https://www.showdoc.cc/mssdk?page_id=2640157465255050">MSSDK 服务端接入文档</a></strong></p>
<p><strong>该集成文档讲解了接入乐逗公版的方法,渠道接入和集成可以参考<a href="https://www.showdoc.cc/mssdk?page_id=3651814975352989">渠道接入</a>文档。</strong></p>
<h2>2. 集成 Unity SDK</h2>
<h3>2.1 获取 Unity SDK 包</h3>
<p>请 <a href="https://www.showdoc.cc/mssdk?page_id=2615409307929897">联系我们</a> 获取SDK</p>
<h4>Unity SDK 包结构</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/31b68d3ed7dfa73dc9abf966df5d0617?showdoc=.jpg" alt="" /></p>
<p><strong>Doc文件夹</strong>
此文件夹包含了SDK的相关文档。其中API文件夹为API文档。双击index.html,可以查看API说明。</p>
<p><strong>MSLDSDK.unitypackage</strong></p>
<p>MSLD SDK Unity包。包中包含iOS和android的Native SDK以及一些配置。</p>
<p><strong>MSLDSDKSample.unitypackage</strong></p>
<p>Sample。展示如何调用MSLD SDK接口实现相关功能。可以导入此包,参考调用方式。</p>
<h3>2.2 导入 MSLDSDK.unitypackage 到Unity工程</h3>
<p>双击 <code>MSLDSDK.unitypackage</code>,即可打开导入界面。点击“import”。导入所有文件。</p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/ad17be8715533b4728753e50d4e8ef34?showdoc=.jpg" alt="" /></p>
<h3>2.3 SDK集成</h3>
<h4>2.3.1 申请SDK配置</h4>
<ul>
<li>进入<a href="http://biz.cloud.idreamsky.com">微服务业务控制台</a>,创建应用。根据应用情况配置好相应的内容。</li>
<li>下载SDK配置文件msConfig.json到本地。
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/36b54eae086135c849e8f7417f832947?showdoc=.jpg" alt="" /></li>
</ul>
<h4>2.3.2 配置SDK</h4>
<h5>iOS平台</h5>
<p>将下载的配置文件 msConfig.json 放入Unity工程目录下的 Assets/Plugins/iDreamsky/msld/iOS 目录下.</p>
<h5>Android平台</h5>
<p>将下载的配置文件 msConfig.json 放入Unity工程目录下的 Assets/Plugins/iDreamsky/msld/Android 目录下.
填写正确的分享,支付参数等,在1.3.9以后,自动导出工程时,需要读取配置</p>
<h4>2.3.3 公共逻辑集成</h4>
<h5>2.3.3.1 初始化SDK</h5>
<p>在游戏启动时,调用 MSLDSDK.Init(APICallBack callback)方法。callback为初始化的异步返回结果。</p>
<p>```C#
using iDreamsky.MSLD;
......</p>
<p>void Start()
{
MSLDSDK.InitSDK(InitSDKCallBack);
......
}</p>
<p>void InitSDKCallBack(MSLDErrorCode code, string msg)
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("初始化成功!");
}
else
{
MSLDInfoWindow.Info("初始化失败! code = " + code + " msg = " + msg);
}
}</p>
<pre><code>
##### 2.3.3.2 设置全局回调监听
SDK在某些事情发生的时候,会告知游戏,游戏根据自己的业务做相依的逻辑处理。
在初始化完成后,设置全局回调监听。
SDK V1.4.2加入未成年,游客政策限制,全局回调中新增4个回调类型(查看示例)
```C#
using iDreamsky.MSLD;
......
void Start()
{
......
MSLDSDK.SetEventCallBack(OnSDKEventCallBack);
}
// 全局事件回调
void OnSDKEventCallBack(MSLDSDK.Event eventID, object eventObj)
{
MSLDInfoWindow.Info("收到SDK全局事件回调:" + eventID);
switch (eventID)
{
case MSLDSDK.Event.SwitchAccount:
// SDK内部发生账号切换时,会收到此回调
break;
case MSLDSDK.Event.LogOut:
// SDK内部发生账号登出时,会收到此回调
break;
case MSLDSDK.Event.RedeliveryOrder:
// SDK内部发生补单时,会收到此回调。eventObj为支付结果结构。
break;
case MSLDSDK.Event.PolicyMinorsPaymentLimit:
//V1.4.2 添加,("未成年充值限制,当前不允许充值");
break;
case MSLDSDK.Event.PolicyMinorsPlayTimeLimit:
//V1.4.2 添加,("未成年人游戏时间已到上限");
break;
case MSLDSDK.Event.PolicyVisitorPaymentLimit:
//V1.4.2 添加,("游客账号不允许充值");
break;
case MSLDSDK.Event.PolicyVisitorPlayTimeLimit:
//V1.4.2 添加,("游客账号游戏时间已到上限");
break;
case MSLDSDK.Event.AccountInfoUpdated:
//V1.5.1 添加,用户信息有更新时,会及时触发
MSLDInfoWindow.Info("用户信息更新:" + eventObj ==null?"null":((MSLDAccountNew)eventObj).desc());
break;
case MSLDSDK.Event.OpenInstallWakeupWithParam:
//1.9.3 添加,从OpenInstall链接拉起游戏时,会及时触发或得透传参数
MSLDInfoWindow.Info("openInstall拉起数据:" + eventObj == null ? "null" : ((MSLDOpenInstallData)eventObj).desc());
break;
default:
//"未知回调:id =" + eventID);
break;
}
}</code></pre>
<h2>3. 功能集成</h2>
<p>游戏根据自己的业务情况,接入相应的功能。目前SDK提供账号系统,支付系统等功能。
<strong>在集成功能之前,请确定完成了2.3.3节公共逻辑的集成部分。</strong></p>
<h3><strong> 接入注意事项 </strong></h3>
<ul>
<li>渠道登陆接口,部分渠道关闭登陆面板并不会有回调到游戏。</li>
<li>渠道登出接口,部分渠道并没有登出功能,使用前需要判断是否支持。</li>
</ul>
<h3>3.1 集成账号系统</h3>
<p>账号系统相关的功能,在 MSLDAccountManager 类中。使用时请导入相应的命名空间 </p>
<p>```C#
using iDeramsky.MSLD.Account;</p>
<pre><code>
#### 3.1.1 登录面板
##### 3.1.1.1 普通登录面板
调用MSLDAccountManager.ShowLoginPannel(APICallBack<MSLDAccount> callback),可呼出登录面板。
```C#
using iDreamsky.MSLD;
using iDreamsky.MSLD.Account;
......
MSLDAccountManager.ShowLoginPannel((MSLDErrorCode code, string msg, MSLDAccount account) => {
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("普通登录成功! account:" + account.desc());
}
else if (code == MSLDErrorCode.UIUserClose)
{
MSLDInfoWindow.Info("用户取消普通登录! code = " + code + " msg = " + msg);
}
else
{
MSLDInfoWindow.Info("普通登录失败! code:" + code + " msg:" + msg);
}
});</code></pre>
<h5>3.1.1.2 一键登录</h5>
<p>SDK内置了一键登录的功能。若配置了一键登录功能且能够正常获取手机号,将在呼出登录面板的流程中优先显示一键登录页面。</p>
<p>详细查看文档 <a href="https://www.showdoc.cc/mssdk?page_id=3742980023778348">Unity版极光集成</a> </p>
<h4>3.1.2 游客登录</h4>
<p>调用MSLDAccountManager.GuestLogin(APICallBack<MSLDAccount> callback),可调用起游客登录流程。</p>
<p>```C#
MSLDAccountManager.GuestLogin((MSLDErrorCode code, string msg, MSLDAccount account) => {
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("游客登录成功! account:" + account.desc());
}
else if (code == MSLDErrorCode.UIUserClose)
{
MSLDInfoWindow.Info("用户取消游客登录! code = " + code + " msg = " + msg);
}
else
{
MSLDInfoWindow.Info("游客登录失败! code = " + code + " msg = " + msg);
}
});</p>
<pre><code>
#### 3.1.3 自动登录
调用MSLDAccountManager.AutoLogin(APICallBack callback),可调用起游自动登录流程。
自动登录使用上次登录的信息进行登录。如果用户没有上次登录或者登录信息失效,则自动登录会失败。此时应该让用户用别的方式登录。
```C#
using iDreamsky.MSLD;
using iDreamsky.MSLD.Account;
......
MSLDAccountManager.AutoLogin(OnAutoLoginCallBack);
......
/*
* 自动登录回调
*/
void OnAutoLoginCallBack(MSLDErrorCode code, string msg, MSLDAccount account)
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("自动登录成功! account:" + account.desc());
}
else if (code == MSLDErrorCode.UIUserClose)
{
MSLDInfoWindow.Info("用户取消自动登录! code = " + code + " msg = " + msg);
}
else
{
MSLDInfoWindow.Info("登录失败! code = " + code + " msg = " + msg);
}
}</code></pre>
<h4>3.1.4 用户中心</h4>
<p>调用MSLDAccountManager.ShowUserCenterPannel(APICallBack callback),可展示用户中心面板。</p>
<p>```C#
using iDreamsky.MSLD;
using iDreamsky.MSLD.Account;
......</p>
<p>MSLDAccountManager.ShowUserCenterPannel(OnShowUserCenterPannelCallBack);
......</p>
<p>/*</p>
<ul>
<li>用户中心面板回调<br />
*/
void OnShowUserCenterPannelCallBack(MSLDErrorCode code, string msg, object data)
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("用户中心成功!");
}
else if (code == MSLDErrorCode.UIUserClose)
{
MSLDInfoWindow.Info("用户关闭用户中心! code = " + code + " msg = " + msg);
}
else
{
MSLDInfoWindow.Info("调用用户中心失败! code = " + code + " msg = " + msg);
}
}
<pre><code></code></pre></li>
</ul>
<h4>3.1.5 实名认证</h4>
<p>调用MSLDAccountManager.AuthenticationPanel(APICallBack callback),可展示实名认证面板。</p>
<p>```C#</p>
<p>using iDreamsky.MSLD;
using iDreamsky.MSLD.Account;
......</p>
<p>MSLDAccountManager.AuthenticationPanel(OnAuthenticationPanelCallBack);
......</p>
<p>/*</p>
<ul>
<li>实名认证面板回调<br />
*/
void OnAuthenticationPanelCallBack(MSLDErrorCode code, string msg, object data)
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("实名认证成功!");
}
else if (code == MSLDErrorCode.UIUserClose)
{
MSLDInfoWindow.Info("用户取消实名认证! code = " + code + " msg = " + msg);
}
else
{
MSLDInfoWindow.Info("实名认证失败! code = " + code + " msg = " + msg);
}
}
<pre><code></code></pre></li>
</ul>
<h4>3.1.6 获取用户信息</h4>
<p>调用 MSLDAccountManager.GetLoginedUserInfo()可获得用户信息。
当用户未登录时,返回null,否则返回当前登录的用户信息。</p>
<p>```C#
MSLDAccount account = MSLDAccountManager.GetLoginedUserInfo();
if (account != null)
{
MSLDInfoWindow.Info("账号信息: " + account.desc());
}
else
{
MSLDInfoWindow.Info("没有账号信息 ");
}</p>
<pre><code>
#### 3.1.7 协议隐私条款
##### 3.1.7.1 用户协议
- 无ui版本
返回用户协议内容(富文本)
调用示例:
```C#
MSLDAccountManager.AgreementDirect((MSLDErrorCode code, string msg, MSLDWebContent data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("获取用户协议成功! webContent:" + data.desc());
}
else
{
MSLDInfoWindow.Info("获取用户协议失败! code = " + code + " msg = " + msg);
}
});</code></pre>
<ul>
<li>有ui版本
当用户关闭协议时会有回调</li>
</ul>
<p>示例:</p>
<p>```C#
MSLDAccountManager.Agreement((MSLDErrorCode code, string msg, string data) =>
{
if(code ==MSLDErrorCode.UIUserBack){
MSLDInfoWindow.Info("用户返回");
}
});</p>
<pre><code>
##### 3.1.7.1 隐私条款
- 无ui版本
返回隐私条款内容(富文本)
示例
```C#
MSLDAccountManager.PrivacyDirect((MSLDErrorCode code, string msg, MSLDWebContent data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("获取隐私协议成功! webContent:" + data.desc());
}
else
{
MSLDInfoWindow.Info("获取隐私协议失败! code = " + code + " msg = " + msg);
}
});</code></pre>
<ul>
<li>有ui版本</li>
</ul>
<p>当用户关闭隐私条款时会有回调</p>
<p>示例</p>
<p>```C#
MSLDAccountManager.Privacy((MSLDErrorCode code, string msg, string data) =>
{
if(code ==MSLDErrorCode.UIUserBack){
MSLDInfoWindow.Info("用户返回");
}
});</p>
<pre><code>
#### 3.1.8 自定义本地配置
> 该功能从 `MSSDK1.4.1.2` 版本开始支持, 只针对Android平台有效,通过打包系统可以修改和替换该文件。
> 开发者可以根据这个配置文件来决定游戏调用MSSDK的功能,如出渠道包还是公版包。
- 背景
为了满足游戏方处理不同渠道下的特殊功能需求,在分包处理时,根据不同的渠道将对应值写入游戏包。
- 情况举例
A渠道需要使用渠道的登录,B渠道需要使用SDK的游客登录,这时就可以使用配置文件 ** customConfig.json **(在Unity工程中),可写入键值对 "logintype":1, 用1表示渠道登录,2表示游客登录,
键值对的key和value都可以自定义,游戏使用时,会以json字符串的方式返回,具体每个键值对的意义需要同步给到业务BP,在打包后台做对应配置修改。
- 使用
在文件customConfig.json (Assets/Plugins/iDreamsky/msld/Android/customConfig.json )中添加自定义值,例如 {"xxx":121213"abc":"cccc"}
读取文件(只在Android下有效,其他平台会返回空字符)
```C#
string rStr = MSLDSDK.GetCustomConfig();</code></pre>
<h4>3.1.9 同步微信用户信息(昵称,头像)</h4>
<blockquote>
<p><code>MSSDK 1.5.0</code> 开始提供
必须配置微信参数(wx_app_id和wx_app_secret)到msconfig(android/iOS)中,才能正常使用
需要登陆之后才能调用。</p>
</blockquote>
<p>简要描述:</p>
<p>获取微信昵称和头像,微信授权成功并同步完信息后会返回新的MSLDAccount对象</p>
<p>调用示例:</p>
<p>```c#
using iDreamsky.MSLD.Account;</p>
<p>MSLDAccountManager.SyncWechatInfo((MSLDErrorCode code, string msg, MSLDAccount data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("同步微信信息成功:" + data.desc());
}
else
{
MSLDInfoWindow.Info("同步微信信息失败! code = " + code + " msg = " + msg);
}
});</p>
<pre><code>
### 3.2 集成支付系统
调用 public static void PurchaseProduct(MSLDProduct product, MSLDCPInfo cpInfo, MSLDPayMethod payMethod, APICallBack<MSLDPayResult> callback),可以发起购买商品的请求。
**product**
参数product代表商品相关的信息。商品ID,商品类型,商品名称,价格,货币等信息,通过此对象传入购买流程。
需要到[业务控制台](http://biz.cloud.idreamsky.com)配置相应的道具,获取商品ID.

对于iOS来说,需要到[苹果开发者后台](https://developer.apple.com/)配置道具,配置的道具ID就是这个商品ID。
对于product对象中的其他字段,可以通过接口 QueryProduct(string productID, APICallBack<MSLDProduct> callback),从苹果后来拉取。
对于Android,product中的各种信息,由CP方自己处理,诸如从本地配置文件中读取。
**cpInfo**
参数cpInfo代表和CP方相关的各种信息。玩家ID,CP订单号,CP数据,备注,订单标题,透传字段等,通过此对象传入购买流程。
**payMethod**
payMethod为购买方式,iOS支持苹果支付。Android支持拉起支付面板,直调微信,直调支付宝的支付方式。接入者根据自己的场景选择。
**支付结果**
对于iOS,支付结果正常从callback返回。当遇到掉单情况,补单成功时,SDK全局回调会收到 MSLDSDK.Event.RedeliveryOrder 事件。并带回支付结果。
对于Android,所有的支付结果均从全局回调MSLDSDK.Event.RedeliveryOrder事件中返回。
请务必要处理MSLDSDK.Event.RedeliveryOrder这个补单事件。
#### 3.2.1 购买商品
```C#
......
using iDreamsky.MSLD.Payment;
using iDreamsky.MSLD;
......
public MSLDProduct product;
public MSLDCPInfo cpInfo;
......
// 从MSSDK1.5.1版本开始支持客户端传入支付回调地址,支付回调地址,此值如果为空的话,则使微服务控制台配置的回调地址
product = new MSLDProduct("0", "test01", "测试商品1", "1.23", "人民币","支付回调地址,传空使用服务器配置地址");
cpInfo = new MSLDCPInfo("pid1234", "mchNO123456", "cpDataxxxxx", "remarkXXXXX", "subjectXXXXX", "attachXXX");
......
//调用此接口发起购买请求。其中product代表商品相关的信息,请参考 MSLDProduct类的说明。cpInfo代表CP方的一些信息。包括CP的订单号,用户ID,透传字段等信息。
MSLDPaymentManager.PurchaseProduct(this.product, this.cpInfo, payMethod, (MSLDErrorCode code, string msg, MSLDPayResult order) => {
if (MSLDErrorCode.Success == code)
{
MSLDInfoWindow.Info("购买成功 msg = " + msg + "order: " + order.desc());
MSLDInfoWindow.Info("增加相应道具...");
}
else
{
MSLDInfoWindow.Info("购买失败! code = " + code + " msg = " + msg);
}
});</code></pre>
<h4>3.2.2 实现补单代理方法(客户端发放商品必接)</h4>
<p>请在收到SDK的全局回调函数中,处理补单事件。</p>
<p>```C#
using iDreamsky.MSLD.Payment;
using iDreamsky.MSLD;</p>
<p>// 全局事件回调
void OnSDKEventCallBack(MSLDSDK.Event eventID, object eventObj)
{
MSLDInfoWindow.Info("收到SDK全局事件回调:" + eventID);
switch (eventID)
{
case MSLDSDK.Event.SwitchAccount:
// SDK内部发生账号切换时,会收到此回调
......
break;
case MSLDSDK.Event.LogOut:
// SDK内部发生账号登出时,会收到此回调
......
break;
case MSLDSDK.Event.RedeliveryOrder:
{
// SDK内部发生补单时,会收到此回调。eventObj为支付结果结构。
MSLDInfoWindow.Info("[补单]支付信息:" + eventObj.ToString());</p>
<pre><code> MSLDPayResult mSLDPayResult = (MSLDPayResult)eventObj;
// 接入方在收到补单结果后,需要补发道具
......
MSLDInfoWindow.Info("[补单]增加相应道具...");
// 在发完相应道具成功之后,需要上报消费结果
MSLDInfoWindow.Info("[补单]上报消费结果");
MSLDPaymentManager.ReportOrderConsumed(mSLDPayResult.orderNo, (MSLDErrorCode codeROC, string msgROC) => {
MSLDInfoWindow.Info("[补单]上报消费结果完成! code:" + codeROC + " msg:" + msgROC);
});
}
break;
}</code></pre>
<p>}</p>
<pre><code>
#### 3.2.3 恢复购买(iOS)
此功能iOS平台特有。
调用 RestoreTransactions(APICallBack<string[]> callback) 函数即可。此接口将返回所有购买的product id 列表。
```C#
using iDreamsky.MSLD.Payment;
using iDreamsky.MSLD;
MSLDPaymentManager.RestoreTransactions((MSLDErrorCode code, string msg, string[] restoreIDs) => {
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("恢复购买成功!" + restoreIDs + "恢复数量:" + restoreIDs.Length);
foreach (string restore in restoreIDs)
{
MSLDInfoWindow.Info("--- productID:" + restore);
}
}
else
{
MSLDInfoWindow.Info("恢复购买失败!");
}
});</code></pre>
<h4>3.2.4 查询商品信息(iOS)</h4>
<p>此功能iOS平台特有。可以根据ID查询商品相关信息。对于Android的商品信息,由接入方自己存储。一般可能在本地有一个商品配置列表。</p>
<p>```C#
using iDreamsky.MSLD.Payment;
using iDreamsky.MSLD;</p>
<p>......</p>
<p>string queryProductId = "test_01";
MSLDPaymentManager.QueryProduct(queryProductId, (MSLDErrorCode code, string msg, MSLDProduct product) => {
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("查询道具成功! " + product.desc());
}
else
{
MSLDInfoWindow.Info("查询道具失败! code = " + code + " msg = " + msg);
}
});</p>
<pre><code>
### 3.3 分享
#### 3.3.1 分享平台应用信息获取
目前支持的分享SNS包括QQ和微信,开发者需要在相应的平台上创建应用并设置相关的信息。
在[微信开放平台](https://open.weixin.qq.com/)创建应用并获取微信AppId,具体联系渠道商务同事。
在[腾讯开放平台](https://open.tencent.com/)创建应用并获取QQ的AppId,具体联系渠道商务同事。
在[新浪微博开放平台](https://open.weibo.com/)创建应用并获取微博 App Key,Sectet,redirectURI。具体联系渠道商务同事。
#### 3.3.2 平台工程设置
在Android平台和iOS平台的MSSDK配置文件msConfig.json中填入对应参数。
微信:"wx_app_id","wx_app_secret","wx_universal_link"
QQ:"qq_app_id","qq_universal_link"
微博:"ms_weibo_Key","ms_weibo_Secret","ms_weibo_redirectURI"

#### 3.3.3 分享接口调用
调用 public static void Share(MSLDShareContent content, MSLDShareScence scence, APICallBack callBack)接口,即可完成分享功能。
分享目前支持分享图片,分享链接,分享小程序三种内容。 支持分享到QQ,Qzone,微信朋友圈,微信会话,微博(1.9.0支持)五种场景。
**content** 参数请不要使用 MSLDShareContent类的对象,使用其子类对象,目前支持的子类有 MSLDShareContentImage(图片),MSLDShareContentWebpage(链接),MSLDShareContentMiniProgram(小程序)三种。
请根据业务选择相应的内容对象,并填入相应的值,然后把对象传入分享接口。
**scence** 为分享场景。如果分享小程序只支持分享到微信,可以忽略此参数。
**callBack** 为分享结果。
```C#
using iDreamsky.MSLD.Share;
using iDreamsky.MSLD;
......
public void OnClickShare()
{
MSLDShareContent shareContent = null;
MSLDShareContentType scType = contentTypeList[shareContentDropdown.value];
switch (scType) {
case MSLDShareContentType.Image:
shareContent = FindObjectOfType<share_panel_content_image>().shareContentImage;
break;
case MSLDShareContentType.Web:
shareContent = FindObjectOfType<share_panel_content_webpage>().shareContentWebpage;
break;
case MSLDShareContentType.MiniProgram:
shareContent = FindObjectOfType<share_panel_content_miniprogram>().shareContentMiniProgram;
break;
}
MSLDShareScence scence = scenceTypeList[shareScenceDropdown.value];
MSLDInfoWindow.Info("Share content[" + shareContent.Desc() + "]" + " scence[" + scence + "]");
MSLDShareManager.Share(shareContent, scence, shareCallBack);
}
void shareCallBack(MSLDErrorCode code, string msg) {
if (code == iDreamsky.MSLD.MSLDErrorCode.Success)
{
Debug.Log("分享成功");
}
else
{
Debug.Log("分享失败");
}
}</code></pre>
<h3>3.4 问卷调查</h3>
<p>目前问卷星支持如下功能:</p>
<ul>
<li>1、支持指定问卷星地址,需要在控制台配置问卷星地址;</li>
<li>2、支持自定义场景传入不同的问卷星地址,不需要再控制台配置,只需要客户端传入问卷星地址即可;</li>
<li>3、支持客户端回调问卷星的填写结果回调;</li>
<li>4、支持服务端回调问卷星的填写结果回调,需要在控制台配置开发者的服务端回调地址;</li>
</ul>
<p>详细文档可以看 <a href="https://www.showdoc.cc/mssdk?page_id=3370316907650536">Unity版问卷星集成</a> 文档。</p>
<h3>3.5 热更新(Android)</h3>
<p>目前支持Android 端的热更新。</p>
<h4>3.5.1 获取热变参数</h4>
<p>热更新采用封装乐变的技术方案。需要商务在乐变后台申请相应的参数:MainChId和LEBIAN_SECID。</p>
<h4>3.5.2 配置热更</h4>
<p>在Android平台和iOS平台的MSSDK配置文件msConfig.json中填入乐变的参数。
注意key分别为 “lb_MainChId”和“lb_LEBIAN_SECID”,如下截图示例:</p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/718cc99627952b00cc40d793d8aa7e16?showdoc=.jpg" alt="" /></p>
<p>配置完成后,重新导出Android工程,即可集成热更新功能。</p>
<h4>3.6 广告追踪</h4>
<p>MSSDK-Unity 在V1.4.2 集成了广告跟踪相关的功能。
广告跟踪要求接入方在相应的业务逻辑部分,调用相应的接口。</p>
<h5>3.6.1 登录成功后,请调用ReportADLogin 上报登录信息</h5>
<p>``` C#
ADTrackManager.ReportADLogin("test123",null);</p>
<pre><code>
##### 3.6.2 购买成功后,请调用 ReportADPurchase上报购买相关信息
``` C#
ADTrackManager.ReportADPurchase("test123", 99.00f, null);</code></pre>
<h5>3.6.3 点击广告成功后,请调用 ReportADClick 上报相关信息</h5>
<p>``` C#
ADTrackManager.ReportADClick(ADPlatforms.Adcolony, ADTypes.Banner,null);</p>
<pre><code>
##### 3.6.4 调用 ReportADCustom 上报自定义信息
``` C#
Hashtable ht = new Hashtable();
ht["k"] = "v";
string key = "key";
ADTrackManager.ReportADCustom(key,iDreamsky.Common.MSLDJSON.jsonEncode(ht), null);</code></pre>
<h4>3.7 buggly集成</h4>
<p>把在buggly开发者后台申请的app id,填入到 msConfig.json(android & ios) 中后,MSSDK将自动启动buggly。
在msConfig.json文件中相应的key为 bugly_app_id。</p>
<h4>3.8 LBS 集成</h4>
<p>包含功能:</p>
<ul>
<li>1、获取附近的人</li>
<li>2、获取当前位置信息</li>
</ul>
<p>详细文档可以看 <a href="https://www.showdoc.cc/mssdk?page_id=3742789464476580">Unity版LBS集成</a> 文档。</p>
<h4>3.9 极光集成(push 集成)</h4>
<p>包含功能:</p>
<ul>
<li>1、极光一键登录</li>
<li>2、极光push</li>
</ul>
<p>详细文档可以看 <a href="https://www.showdoc.cc/mssdk?page_id=3742980023778348">Unity版极光集成</a> 文档。</p>
<h4>3.10 兑换码功能</h4>
<h5>3.10.1 有ui兑换</h5>
<p>调用示例</p>
<p>``` C#</p>
<p>using iDreamsky.MSLD;</p>
<p>MSLDRedeemManager.ShowRedeem((MSLDErrorCode code, string msg, string data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("兑换成功:" + msg + ",produceID =" + data);
}
else
{
MSLDInfoWindow.Info("兑换失败:code =" + code + ", msg = " + msg);
}
});</p>
<pre><code>
##### 3.10.2 无ui兑换
调用示例
``` C#
using iDreamsky.MSLD;
string getCode = "xxxx";
MSLDRedeemManager.RedeemDirect( getCode, (MSLDErrorCode code, string msg, string data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("兑换成功:" + msg + ",produceID =" + data);
}
else
{
MSLDInfoWindow.Info("兑换失败:code =" + code + ", msg = " + msg);
}
});</code></pre>
<h4>3.11 社区接入</h4>
<p>包含功能:</p>
<ul>
<li>1、社区初始化</li>
<li>2、展示社区</li>
<li>3、获取消息数量</li>
</ul>
<p>详细文档可以看 <a href="https://www.showdoc.cc/mssdk?page_id=3812293863039627">Unity-社区集成</a> 文档。</p>
<h4>3.12 直播功能</h4>
<h5>3.12.1 是否开启直播</h5>
<p>```C#
using iDreamsky.MSLD;</p>
<p>MSLDLiveStreamingManager.IsLiveEnable((MSLDErrorCode code, string msg, bool data) =>
{
if (code == MSLDErrorCode.Success && data)
{
MSLDInfoWindow.Info("直播已经开启");
}
else
{
MSLDInfoWindow.Info("直播未开启,code=" + code + ", data =" + data);
}
});</p>
<pre><code>
##### 3.12.2 展示直播
```C#
using iDreamsky.MSLD;
MSLDLiveStreamingManager.ShowLiveStreamWeb((MSLDErrorCode code, string msg, string data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("开始直播");
}
else
{
MSLDInfoWindow.Info("直播出错,code =" + code + ",msg =" + msg + ", data=" + data);
}
});
</code></pre>
<h4>3.13 获取联系人</h4>
<h5>3.13.1 请求获取联系人授权</h5>
<p>```C#
using iDreamsky.MSLD;</p>
<p>Enum_ContacetPermission type = Enum_ContacetPermission.No;// 强制授权
MSLDContactManager.RequestReadContactPermisssion((MSLDErrorCode code, string msg, bool data) =>
{
if (code == MSLDErrorCode.Success && data)
{
MSLDInfoWindow.Info("获取联系人权限成功");
}
else
{
MSLDInfoWindow.Info("获取联系人权限失败,code=" + code + ", data =" + data);
}
}, type);</p>
<pre><code>
##### 3.13.2 请求联系人列表
```C#
using iDreamsky.MSLD;
MSLDContactManager.RequestContactList((MSLDErrorCode code, string msg, MSLDContacts data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("获取联系人列表:data = " + data.desc());
}
else
{
MSLDInfoWindow.Info("获取联系列表失败,code=" + code + ",msg =" + msg );
}
});
</code></pre>
<h4>3.14 OpenInstall支持</h4>
<h5>3.14.1 OpenInstall应用信息配置</h5>
<p>在<a href="https://developer.openinstall.io">OpenInstall后台</a>创建应用并获取游戏appKey。</p>
<ul>
<li>对于iOS, 需要在 msConfig.json 添加项目("openinstall_appkey": "appKey")</li>
<li>对于Android,需要在分包后台配置OpenInstall的appKey参数</li>
<li>在全局回调中通过 Event.OpenInstallWakeupWithParam 获取拉起游戏的透传参数</li>
</ul>
<h5>3.14.2 主动获取落地页参数</h5>
<p>```C#</p>
<p>using iDreamsky.MSLD;</p>
<p>MSLDOpenInstallManager.GetInstall((MSLDErrorCode code, string msg, MSLDOpenInstallData data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("主动获取落地页参数成功:data = " + data.desc());
}
else
{
MSLDInfoWindow.Info("主动获取落地页参数失败,code=" + code);
}
});</p>
<pre><code>
##### 3.14.3 效果统计
```C#
using iDreamsky.MSLD;
string point = "xxxx";//效果点
long value = 1;//效果值
MSLDOpenInstallManager.ReportEffectPoint(point, value, (MSLDErrorCode code, string msg, string data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("效果统计上报成功");
}
else
{
MSLDInfoWindow.Info("效果统计上报失败,code=" + code);
}
});
</code></pre>
<h5>3.14.4 注册统计</h5>
<p>```C#</p>
<p>using iDreamsky.MSLD;</p>
<p>MSLDOpenInstallManager.ReportRegister((MSLDErrorCode code, string msg, string data) =>
{
if (code == MSLDErrorCode.Success)
{
MSLDInfoWindow.Info("注册统计上报成功");
}
else
{
MSLDInfoWindow.Info("注册统计上报失败,code=" + code);
}
});</p>
<pre><code></code></pre>