测试使用ShareSDK的一些经常使用功能。包括:android
测试使用SMSSDK插件,包括:git
学习资料:github
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(1); } }
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; } }
接着上面的工程,在用户详情页中写一个脚本,在已登陆的状态下获取微博帐号的详情。数组
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(0, 0, 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(1); } }
打开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, 20, 0); } 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显示。该接口谨慎使用。app
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 = { "5", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "20", "25", "26", "27", "28", "29", "30", "34", "35", "36", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "50", "51", "52", "53", "54" }; content.SetHidePlatforms(platforms); ssdk.ShowPlatformList(null, content, 100, 100); } // 分享结果的回调 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:指定了分享界面的显示的可选平台,但仍是显示了全部的平台。即设置指定的分享平台无效。ide
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(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("登陆被取消!"); } } // 用短信登陆,有两种方式 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(2); } } // 短信操做,失败 public void onError(int action, object resp) { Utility.MakeToast("短信验证失败!"); } }