Unity第三方登入及分享
最近因為公司的專案需要新增一些實用性的功能,需要新增第三方登入及分享,採用的是Mob的SDK,可以先到其官網下載對應的SDK 點選這裡,為了方便後期進行資料統計和分析,所以可以先新增一個應用,新增成功後,就可以獲取到對應的AppKey和App Secret,這兩個東西稍後需要用到。
準備工作
開啟Unity,建立一個空專案,然後把我們剛剛下載的Share SDK匯入。然後在Project下就會出現Plugins檔案,然後選擇一個物體,點選AddComponent新增Share SDK指令碼,然後將Mob官網上申請的應用的App Key及AppSecret替換組建上原有的資料。然後搭建一個簡單的UI,用來實現登入及分享功能。因為要釋出到移動端測試,所以我做了一個假的控制檯用來輸出資訊,
1、首先先說最簡單的QQ分享及第三方登入
進行QQ第三方登入時,需要先到
/// <summary> /// 退出按鈕 /// </summary> private Button exitBtn; /// <summary> /// QQ按鈕 /// </summary> private Button QQBtn; /// <summary> /// 微信按鈕 /// </summary> private Button weixinBtn; /// <summary> /// 微博按鈕 /// </summary> private Button weiboBtn; /// <summary> /// 分享按鈕 /// </summary> private Button ShareBtn; /// <summary> /// 使用者名稱輸入框 /// </summary> private InputField userName; /// <summary> /// 密碼輸入框 /// </summary> private InputField passWord; /// <summary> /// SDK /// </summary> public ShareSDK ssdk; /// <summary> /// 控制檯 /// </summary> public Text text; /// <summary> /// 獲取到的使用者資訊儲存本地的檔名 /// </summary> private string fileName; /// <summary> /// 獲取到使用者的頭像儲存到本地的檔名 /// </summary> private string iconName; /// <summary> /// 可以分享的平臺 /// </summary> private PlatformType[] platforms; public void Start() { Debug.Log(ssdk); platforms = new PlatformType[] { PlatformType.WeChat,PlatformType.WeChatFavorites,PlatformType.WeChatMoments,PlatformType.WechatPlatform, PlatformType.QQ,PlatformType.QZone,PlatformType.SinaWeibo}; userName = transform.Find("UserName").GetComponentInChildren<InputField>(); passWord = transform.Find("PassWord").GetComponentInChildren<InputField>(); exitBtn = transform.Find("ExitBtn").GetComponent<Button>(); QQBtn = transform.Find("QQBtn").GetComponent<Button>(); weixinBtn = transform.Find("WeiXinBtn").GetComponent<Button>(); weiboBtn = transform.Find("WeiBoBtn").GetComponent<Button>(); ShareBtn = transform.Find("QQShareBtn").GetComponent<Button>(); exitBtn.onClick.AddListener(ExitButtonHandle); QQBtn.onClick.AddListener(QQButtonHandle); weixinBtn.onClick.AddListener(WeiXinButtonHandle); weiboBtn.onClick.AddListener(WeiBoButtonHandle); ShareBtn.onClick.AddListener(ShareButtonHandle); } /// <summary> /// QQ登入 /// </summary> private void QQButtonHandle() { Debug.Log("點選了QQ登入"); fileName = "/qq.json"; iconName = "/qqIcon.jpg"; if (File.Exists(Application.persistentDataPath + fileName)) return; //註冊登入回撥事件 ssdk.authHandler = AuthHandler; //確定向哪個平臺進行第三方驗證 ssdk.Authorize(PlatformType.QQ); } /// <summary> /// 登入回撥 /// </summary> /// <param name="reqID"></param> /// <param name="state"></param> /// <param name="type"></param> /// <param name="data"></param> private void AuthHandler(int reqID, ResponseState state, PlatformType type, Hashtable data) { Debug.Log("回撥函式"); if (state == ResponseState.Success) { JsonData userData = JsonMapper.ToObject(JsonMapper.ToJson(data)); SaveUserInfo(JsonMapper.ToJson(data)); string icon = userData["icon"].ToString(); StartCoroutine(DownUserIcon(icon)); text.text += "\n userid : " + userData["userID"] + "\n username : " + userData["nickname"] + "\n icon : " + userData["icon"]; text.text += "\n授權成功!!!"; userName.text = userData["nickname"].ToString(); } else if (state == ResponseState.Fail) { text.text += "\n授權失敗!!!"; } } /// <summary> /// 分享 /// </summary> private void ShareButtonHandle() { //分享的內容 ShareContent content = new ShareContent(); if (iconName != null) content.SetImagePath(Application.persistentDataPath + iconName); content.SetTitle(" 分享 "); content.SetTitleUrl("https://www.baidu.com/"); content.SetText(" wecome "); content.SetSite("Mob-ShareSDK"); content.SetSiteUrl("https://www.baidu.com/"); content.SetUrl("https://www.baidu.com/"); content.SetComment("test description"); content.SetMusicUrl("http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201807/10300.mp3"); content.SetShareType(ContentType.Webpage); Debug.Log(" ******* 001 "); //註冊分享回撥事件 ssdk.shareHandler = ShareHandler; //傳遞需要分享的平臺及分享內容 ssdk.ShowPlatformList(platforms, content, 100, 100); } /// <summary> /// 分享回撥 /// </summary> /// <param name="reqID"></param> /// <param name="state"></param> /// <param name="type"></param> /// <param name="data"></param> private void ShareHandler(int reqID, ResponseState state, PlatformType type, Hashtable data) { if (state == ResponseState.Success) { Debug.Log(" share is success "); Debug.Log(JsonMapper.ToJson(data)); } else if(state==ResponseState.Fail) { Debug.Log(" share is fail "); } } /// <summary> /// 將使用者的頭像下載 /// </summary> /// <param name="icon"></param> /// <returns></returns> private IEnumerator DownUserIcon(string icon) { Debug.Log("開啟協程進行資源下載"); WWW www = new WWW(icon); yield return www; FileStream stream = File.Create(Application.persistentDataPath + iconName); Texture2D texture = new Texture2D(www.texture.width, www.texture.height); www.LoadImageIntoTexture(texture); byte[] bytes = texture.EncodeToJPG(); stream.Write(bytes, 0, bytes.Length); stream.Close(); stream.Dispose(); } /// <summary> /// 將得到的使用者資訊儲存 /// </summary> /// <param name="jsonFile"></param> private void SaveUserInfo(string jsonFile) { if (File.Exists(Application.persistentDataPath + "/" + fileName)) File.Delete(Application.persistentDataPath + "/" + fileName); File.WriteAllText(Application.persistentDataPath + "/"+fileName, jsonFile); }
實現上訴程式碼後,就可以進行測試了,第三方登入可以成功,且分享內容也沒問題了。
2、微信第三方登入及分享
進行微信第三方登入及分享時,需要先到微信開放平臺申請屬於自己的應用,等待稽核通過後,將獲取到的Appid及App secret填入Share SDK對應的微信平臺的配置資訊處,還需要自己打包一個屬於自己的jar包,利用eclipse開啟前面從Mob官網上下載的sdk包下的Android_Jave_Demo檔案,
在eclipse中開啟後,然後將cn.sharesdk.demo.apshare、cn.sharesdk.demo.wxapi、cn.sharesdk.demo.yxapi這三個包的包名改成自己包名,然後在src單擊右鍵,選擇匯出,命名為DemoCallback.jar。
匯出成功後,將Unity工程目錄下的Plugins/Android/ShareSDK/libs下的Demo Callback替換為剛剛自己匯出的jar。
接下來則是對微信登入及分享進行事件註冊,程式碼和QQ的基本一樣。分享和QQ採用的是同一個方法,就不重複寫了
/// <summary>
/// 微信登入
/// </summary>
private void WeiXinButtonHandle()
{
Debug.Log("點選了微信登入");
fileName = "/wechat.json";
iconName = "/wechatIcon.jpg";
if (File.Exists(Application.persistentDataPath + fileName))
return;
ssdk.authHandler = AuthHandler;
ssdk.Authorize(PlatformType.WeChat);
}
微信分享及登入功能到此就結束了。
3、微博的登入及分享
微博跟微信是一樣的,也需要到微博的開發者平臺先進行註冊及應用的申請,獲取到應用的App ID及AppSecret,然後將其填寫到微博對應的配置資訊位置。微博登入程式碼如下,微博的分享功能也是直接和QQ的一樣的,所以使用了同一個方法。
/// <summary>
/// 微博登入
/// </summary>
private void WeiBoButtonHandle()
{
Debug.Log("點選了微博登入");
fileName = "/sina.json";
iconName = "/sinaIcon.jpg";
if (File.Exists(Application.persistentDataPath + fileName))
return;
ssdk.authHandler = AuthHandler;
ssdk.Authorize(PlatformType.SinaWeibo);
}
至此利用Mob實現Unity第三方登入就結束了,如果需要原始碼的可以到我的Git上獲取。
由於都是自己在摸索,所以難免會很多的不足及錯誤,如文中有BUG或者錯誤的地方,還望大神指出,在此寫謝過了!