1. 程式人生 > >Unity第三方登入及分享

Unity第三方登入及分享

       最近因為公司的專案需要新增一些實用性的功能,需要新增第三方登入及分享,採用的是Mob的SDK,可以先到其官網下載對應的SDK 點選這裡,為了方便後期進行資料統計和分析,所以可以先新增一個應用,新增成功後,就可以獲取到對應的AppKey和App Secret,這兩個東西稍後需要用到。
準備工作
開啟Unity,建立一個空專案,然後把我們剛剛下載的Share SDK匯入。然後在Project下就會出現Plugins檔案,然後選擇一個物體,點選AddComponent新增Share SDK指令碼,然後將Mob官網上申請的應用的App Key及AppSecret替換組建上原有的資料。然後搭建一個簡單的UI,用來實現登入及分享功能。因為要釋出到移動端測試,所以我做了一個假的控制檯用來輸出資訊,
1、首先先說最簡單的QQ分享及第三方登入
進行QQ第三方登入時,需要先到

QQ互聯官網上申請一個自己的應用,如果只是為了測試功能,也可以不申請,直接使用Mob預設的Appid及AppSecret。接下來就是寫程式碼了,很簡單。新建一個用來測試的指令碼,我這裡叫Login,先在Start中獲取到對應的按鈕引用,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或者錯誤的地方,還望大神指出,在此寫謝過了!