【Unity】ShareSDK、SMSSDK的基本使用与常见问题
概要
测试使用ShareSDK的一些常用功能。包括:
- 用微博帐号做第三方登录
- 获取用户的帐号详细信息
- 获取好友列表
- 分享功能
测试使用SMSSDK插件,包括:
- 导入插件,解决包冲突
- 短信登录功能:发验证码,收验证码,比对验证码
学习资料:
- 官方文档 http://wiki.mob.com/unity3d%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97/
- 官方Demo https://github.com/MobClub/New-Unity-For-ShareSDK
- 视频教程 http://www.sikiedu.com/course/140
用微博帐号做第三方登录
using cn.sharesdk.unity3d;
using UnityEngine; public class ShareSDKManager : MonoBehaviour {
private static ShareSDKManager _instance;
public static ShareSDKManager Instance {
get {
return _instance;
}
}
[HideInInspector]
public PlatformType userPlatform = PlatformType.Unknown; // 用户登录的平台(是微博登录还是短信登录)
[HideInInspector]
public string userID = "";
[HideInInspector]
public ShareSDK ssdk; void Start () {
_instance = this;
DontDestroyOnLoad(gameObject);
ssdk= gameObject.GetComponent<ShareSDK>();
// ShareSDK.Awake()中已经执行了shareSDKUtils.InitSDK(appKey,appSecret)初始化操作,这里是否写初始化可随意
// 初始化完成后,跳转场景
UnityEngine.SceneManagement.SceneManager.LoadScene();
}
}
using cn.sharesdk.unity3d;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement; public class Login : MonoBehaviour { ShareSDK ssdk;
void Start () {
ssdk= ShareSDKManager.Instance.shareSDK;
ssdk.authHandler = OnAuthResultHandler; // 授权结果的回调函数
} // 用新浪微博登录
public void OnSinaLoginButtonClick()
{
if (ssdk.IsAuthorized(PlatformType.SinaWeibo)) // 检测指定的平台是否已经授权过了
{
// 写入授权信息
Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
SceneManager.LoadScene(2);
}
else // 指定的平台尚未授权,给它授权
{
ssdk.Authorize(PlatformType.SinaWeibo);
}
} /// <summary>
/// 授权结果的回调函数
/// </summary>
/// <param name="reqID"></param>
/// <param name="state">授权状态:成功,失败,取消</param>
/// <param name="type">授权平台类型</param>
/// <param name="data">返回的数据</param>
void OnAuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 授权结果写入文件
Utility.WriteFile(Application.persistentDataPath, "AuthData.txt", data.toJson());
Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
SceneManager.LoadScene(2);
}
else if (state == ResponseState.Fail)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录失败!");
}
else if (state == ResponseState.Cancel)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录被取消!");
}
}
}
using System.IO; /// <summary>
/// 读写文件的工具类。
/// 用于查看ShareSDK授权时返回的data中有哪些数据。
/// </summary>
public static class Utility
{
public static void WriteFile(string path, string name, string info)
{
StreamWriter writer;
FileInfo fi = new FileInfo(path + "/" + name);
writer = fi.CreateText();
writer.WriteLine(info);
writer.Close();
writer.Dispose();
} public static string ReadFile(string path, string name)
{
StreamReader reader;
FileInfo fi = new FileInfo(path + "/" + name);
reader = fi.OpenText();
string info = reader.ReadToEnd();
reader.Close();
reader.Dispose();
return info;
}
}
坑点:
- 如果点击按钮没反应,到微博开放平台测试信息—添加测试帐号,关联到自己的微博,因为开发者身份认证未通过审核时不能拿到数据。
- 如果点击按钮后页面回退,是Unity中ShareSDK脚本的微博App Key和App Secret没填对。(有默认的Debug帐号的数据,注意检查)。
- 报错“你所访问的站点在微博认证失败 错误号21322 重定向地址不匹配”。是因为在Unity脚本中没有填写回调url,要跟微博开放平台中输入的回调页地址一致才行!
- 报错 21323 : 请求不合法。该方法登录如果碰到这个问题,过一段时间后再试试就没问题了,非常诡异,也许是新浪服务端那边的问题???怀疑是请求过于频繁导致。没搞懂这个错误。
获取用户的帐号详细信息
接着上面的工程,在用户详情页中写一个脚本,在已登录的状态下获取微博账号的详情。
using cn.sharesdk.unity3d;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement; public class Info : MonoBehaviour
{
public Image userIcon;
public Text userName;
public Text userID;
ShareSDK ssdk; void Start ()
{
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.showUserHandler = OnGetUserInfoResultHandler; // 在前一个场景中已把授权返回的数据写入到了本地
Hashtable authInfo = Utility.ReadFile(Application.persistentDataPath, "AuthInfo.dat").hashtableFromJson();
StartCoroutine(LoadUserIcon(authInfo["userIcon"].ToString()));
userName.text = authInfo["userName"].ToString();
userID.text = "ID:" + authInfo["userID"].ToString();
} // 协程下载用户头像Icon
IEnumerator LoadUserIcon(string url)
{
WWW www = new WWW(url);
yield return www; // 等待下载完才执行下面的代码
if (www.isDone && www.error == null)
{
Texture2D texture2D = www.texture;
userIcon.sprite = Sprite.Create(texture2D, new Rect(, , texture2D.width, texture2D.height), Vector2.zero);
}
} // 进入游戏主场景
public void OnEnterButtonClick()
{
} // 查看用户详细信息
public void OnDetailButtonClick()
{
ssdk.GetUserInfo(PlatformType.SinaWeibo);
} // 获取用户详情的回调
void OnGetUserInfoResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 将用户详情写入文件中,之后随意使用。
Utility.WriteFile(Application.persistentDataPath, "UserInfo.dat", data.toJson());
// 如获取用户位置
Utility.MakeToast("所在地:" + Utility.Unicode2String(data["location"].ToString()));
}
else if (state == ResponseState.Fail)
{
Utility.MakeToast("获取用户详情失败!");
}
else if (state == ResponseState.Cancel)
{
Utility.MakeToast("获取用户详情被取消!");
}
} // 注销,退出登录
public void OnSignOutButtonClick()
{
// 取消指定平台的授权
ssdk.CancelAuthorize(PlatformType.SinaWeibo);
// 回调登录场景
SceneManager.LoadScene();
}
}
打开UserInfo.dat查看能获取到哪些帐号详情。
获取好友列表
using cn.sharesdk.unity3d;
using System.Collections;
using UnityEngine;
using UnityEngine.UI; public class Play : MonoBehaviour
{
public Text resultText;
ShareSDK ssdk; void Start ()
{
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.getFriendsHandler = OnGetFriendsResultHandler;
} // 点击获取好友列表
public void OnFriendsButtonClick()
{
// 分页获取当前登录用户平台的好友列表,每页容量,第几页(从0开始)
// 但此接口已被弃用,目前只能准确获得好友总数,且一次请求只能返回2个好友(第三参数填0返回第1和2位好友),后两个参数已失效
// 如果想靠该接口分页获取所有好友,需要自行多次获取,自行分页
ssdk.GetFriendList(PlatformType.SinaWeibo, , );
} void OnGetFriendsResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 将好友列表写入文件中,之后随意使用。
Utility.WriteFile(Application.persistentDataPath, "FriendsList.dat", data.toJson());
}
else if (state == ResponseState.Fail)
{
Utility.MakeToast("获取好友列表失败!");
}
else if (state == ResponseState.Cancel)
{
Utility.MakeToast("获取好友列表被取消!");
}
}
}
查看FriendsList.dat,每个好友的信息有很多数据,同样中文是Unicode需要转成String显示。该接口谨慎使用。
分享功能
void Start ()
{
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.shareHandler = OnShareResultHandler;
} // 点击分享:截图,配文字,分享
public void OnShareButtonClick()
{
// 屏幕截图,默认存放路径Application.persistentDataPath,多次调用会同名替换图片。
ScreenCapture.CaptureScreenshot("Screenshot.png");
// 分享的内容
ShareContent content = new ShareContent(); // ★通用分享内容的设置
// 设置分享的文字(正文)
content.SetText("测试ShareSDK分享功能"); // 设置分享的图片
// SetImagePath:用于本地图片,参数为图片路径
// SetImageUrl:用于网络图片,参数为图片网址
// SetImageArray:用于多图分享,参数为图片网址string数组。仅支持网络图片,仅支持Android。
content.SetImagePath(Application.persistentDataPath + "/Screenshot.png"); // 其他可设置的额外参数
content.SetTitle("ShareSDKDemo"); // 标题
content.SetTitleUrl("http://www.guxin.me"); // 标题的Url
content.SetSite("guxin.me"); // 分享来源的站点
content.SetTitle("http://www.guxin.me"); // 站点的Url
content.SetUrl("http://www.guxin.me"); // 分享的网站
content.SetUrlDescription("个人学习ShareSDK的Demo");
// ...
// 设定分享内容的主要类型,放在最后一步
content.SetShareType(ContentType.Image); // ★其他平台特异性分享内容的设置
ShareContent sinaWeiboContent = new ShareContent();
sinaWeiboContent.SetText(resultText.text + "\n via 新浪微博");
// 在指定平台上,使用第二个参数中的内容覆盖主内容里的值
content.SetShareContentCustomize(PlatformType.SinaWeibo, sinaWeiboContent); // ★显示分享框
// PlatformType[] platforms = { PlatformType.SinaWeibo, PlatformType.QQ, PlatformType.WeChat };
// ssdk.ShowPlatformList(platforms, content, 100, 100);
// 指定显示平台的方法已弃用,第一个参数穿null即可。
// string[] platforms = { "5" }; // 查看PlatformType枚举值,如豆瓣是“5”
// string[] platforms = { ((int)PlatformType.DouBan).ToString() };
// 可以设置哪些平台不显示。
string[] platforms = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
content.SetHidePlatforms(platforms); ssdk.ShowPlatformList(null, content, , );
} // 分享结果的回调
void OnShareResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
// 注意:并非所有平台都会报告正确的状态,如短信、邮件平台,只要界面跳转成功了都算成功(不管玩家接下来是否真的有点发送)。
if (state == ResponseState.Success)
{
Utility.MakeToast("分享成功!");
// 游戏中分享成功可能会获得一些道具,在这里处理。注意不能正确报告的平台,防止玩家未分享也能获得道具。
// ......
}
else if (state == ResponseState.Fail)
{
Utility.MakeToast("分享失败!");
}
else if (state == ResponseState.Cancel)
{
Utility.MakeToast("分享被取消!");
}
}
Bug:指定了分享界面的显示的可选平台,但还是显示了所有的平台。即设置指定的分享平台无效。
导入SMSSDK报错,包冲突问题
F:\workspace\Unity Learning\ShareSDKDemo\Temp\StagingArea\AndroidManifest-main.xml:28:13-74 Error:
Attribute activity#com.mob.tools.MobUIShell@configChanges value=(keyboardHidden|orientation|screenSize) from AndroidManifest.xml:28:13-74
is also present at AndroidManifest.xml:15:13-97 value=(keyboardHidden|orientation|screenSize|locale|layoutDirection).
Suggestion: add 'tools:replace="android:configChanges"' to <activity> element at AndroidManifest-main.xml:26:9-44:20 to override.
F:\workspace\Unity Learning\ShareSDKDemo\Temp\StagingArea\AndroidManifest-main.xml:29:13-72 Error:
Attribute activity#com.mob.tools.MobUIShell@theme value=(@android:style/Theme.Translucent.NoTitleBar) from AndroidManifest.xml:29:13-72
is also present at AndroidManifest.xml:16:13-60 value=(@android:style/Theme.NoTitleBar).
Suggestion: add 'tools:replace="android:theme"' to <activity> element at AndroidManifest-main.xml:26:9-44:20 to override. UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
短信登录
// SMSSDK初始化
smssdk = gameObject.GetComponent<SMSSDK>();
smssdk.init("moba6b6c6d6", "b89d2427a3bc7ad1aea1e1e8c1d36bf3", true); // 用默认的Debug帐号的App Key和App Secret测试。上线时改用在mob后台给的值。
主逻辑脚本继承SMSSDKHandler接口,实现onComplete()和onError()这两个回调函数,smssdk.setHandler()注册。注意枚举ActionType.SubmitUserInfo和ActionType.GetFriends已很久未维护,不推荐使用。
最终整合了微博登录与短信登录的脚本如下。
using cn.sharesdk.unity3d;
using cn.SMSSDK.Unity;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement; public class Login : MonoBehaviour, SMSSDKHandler
{
ShareSDK ssdk;
SMSSDK smssdk; void Start () {
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.authHandler = OnAuthResultHandler; // 授权结果的回调函数 smssdk = ShareSDKManager.Instance.smssdk;
smssdk.setHandler(this); // 短信操作的回调
} // 用新浪微博登录
public void OnSinaLoginButtonClick()
{
if (ssdk.IsAuthorized(PlatformType.SinaWeibo)) // 检测指定的平台是否已经授权过了
{
// 写入授权信息
Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
SceneManager.LoadScene();
}
else // 指定的平台尚未授权,给它授权
{
ssdk.Authorize(PlatformType.SinaWeibo);
}
} /// <summary>
/// 授权结果的回调函数
/// </summary>
/// <param name="reqID"></param>
/// <param name="state">授权状态:成功,失败,取消</param>
/// <param name="type">授权平台类型</param>
/// <param name="data">返回的数据</param>
void OnAuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 授权结果写入文件
Utility.WriteFile(Application.persistentDataPath, "AuthData.txt", data.toJson());
Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
SceneManager.LoadScene();
}
else if (state == ResponseState.Fail)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录失败!");
}
else if (state == ResponseState.Cancel)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录被取消!");
}
} // 用短信登录,有两种方式
public void OnSmsButtonClick()
{
// 方式一:非UI方式,需要搭配Unity里自己制作的UI
/*
* 通过getCode()获得验证码,参数是:验证码类型(短信/语音),手机号,国际区域号(大陆为86,非国内电话的区号),模板号
* smssdk.getCode(CodeType, phone, zone, tempCode);
* 通过commitCode()方式提交验证码,参数:手机号,国际区域号(大陆为86,非国内电话的区号),验证码
* smssdk.commitCode(phone, zone, code);
*/ // 方式二:UI方式,直接使用SMSSDK自带的UI(Android下的界面)
smssdk.showRegisterPage(CodeType.TextCode, null); //tempcode是模板编号,如还未申请传null即可。申请新模板要等审核通过。
} // 短信操作,完成
public void onComplete(int action, object resp)
{
ActionType act = (ActionType)action;
//Debug.Log(act);
if (act == ActionType.CommitCode)
{
ShareSDKManager.Instance.userPlatform = PlatformType.SMS;
ShareSDKManager.Instance.userID = ((string)resp).hashtableFromJson()["phone"].ToString();
Utility.MakeToast("手机用户:" + ShareSDKManager.Instance.userID + "\n登录成功!");
SceneManager.LoadScene();
}
} // 短信操作,失败
public void onError(int action, object resp)
{
Utility.MakeToast("短信验证失败!");
}
}
自用Demo:https://gitee.com/guxin233/Unity_ShareSDK_Demo
【Unity】ShareSDK、SMSSDK的基本使用与常见问题的更多相关文章
- Unity利用SMSSDK实现短信验证码(附代码)
最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...
- ShareSDK For Unity集成
Mob ShareSDK Android - V2.7.10 iOS - V3.5.0 Mob下载:https://github.com/MobClub/New-Unity-For-ShareSDK ...
- [ShareSDK for Android]新浪微博常见问题
一.新浪sso授权报错sso package or sign error 1. 新浪微博开放平台应用没有审核通过,不能用sso登陆,否则报错.关闭sso登陆Platform platform = Sh ...
- 【Unity】Protobuf的使用与常见问题
Protobuf的使用流程 protobuf参考教程:https://www.jianshu.com/p/b135676dbe8d 手写.proto文件后,用CMD命令行运行protoc.exe编译器 ...
- 解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题
现在mob的SDK版本升级到3.0,跟之前的版本不兼容,尤其是在 同时使用shareSDK和SMSSDK的时候会发生冲突,报NoSuchMethodException的错误. 只需要将所有的jar包和 ...
- Unity插件-ShareSDK使用指南
Unity插件ShareSDK使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Summariz ...
- 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。
近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"? 解决方式:手 ...
- Unity接入ShareSDK实现QQ登录和QQ分享、微信分享
原文链接:Unity接入ShareSDK实现QQ登录和QQ分享.微信分享 由于微信登录需要企业审核,我这里就不说明了,有需要的可以去官网看一下文档,和QQ登录比多了一个打包的步骤. 第一步:到官网申请 ...
- 【Unity】打包安卓APK常见问题
问题:unity error invalid command android 原因:Android版本较新,Unity版本太旧(如4.X),Unity打包APK时调用Android工具使用的命令已被安 ...
随机推荐
- springboot mail+Thymeleaf模板
compile 'org.springframework.boot:spring-boot-starter-thymeleaf' compile 'io.ratpack:ratpack-thymele ...
- @Resource注解的官方解释
一.@Resource注解的官方解释@Resource annotation, which is semantically defined to identify a specific target ...
- sicp 习题
1.11 求f(n)=f(n-1)+2*f(n-2)+3*f(n-3) #lang racket (define (fff n) (define (fff-iter a b c n) (if (= n ...
- BZOJ.4793.[CERC2016]Hangar Hurdles(Kruskal重构树 BFS)
题目链接 \(Description\) 有一个\(n\times n\)的正方形网格,上面有若干障碍点.\(q\)次询问,每次询问把一个正方形箱子从\((x1,y1)\)推到\((x2,y2)\) ...
- BZOJ.4289.PA2012 Tax(思路 Dijkstra)
题目链接 \(Description\) 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价 ...
- python面向对象编程练习
练习题 1.面向对象三大特性,各有什么用处,说说你的理解. 面向对象的三大特性: 1.继承:解决代码的复用性问题 2.封装:对数据属性严格控制,隔离复杂度 3.多态性:增加程序的灵活性与可扩展性 2. ...
- 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)
1,new方法: 类每次实例化时都会创建一个新的对象, class Textcls: # cls 是指类本身, def __new__(cls, *args, **kwargs): # 在 __ini ...
- 二分图带权匹配 KM算法与费用流模型建立
[二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小.而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大 ...
- BZOJ2366 : 多重历史
建立AC自动机,因为不存在某个串是另一个串的后缀,因此匹配到任意位置都只可能匹配一个串. 预处理出每个串出现的所有位置,总的出现次数为$O(m)$. 设$f[i][j]$表示考虑了前$i$个串,最后一 ...
- pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
直接上图(mac环境): 一.设置项目的python版本 File->Default Settings ... 在弹出的界面上(参考下图),左上角的下拉框里,选择python解释器的版本即可(建 ...