开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:579

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 618|回复: 8

[Unity教程] 如何通过Unity iOS应用程序在Twitter上分享图片和链接

[复制链接]  [移动端链接]
排名
7936
昨日变化
3

260

主题

298

帖子

1511

积分

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

UID
159865
好友
9
蛮牛币
3908
威望
0
注册时间
2016-8-1
在线时间
623 小时
最后登录
2017-10-15

蛮牛译员

发表于 2017-9-20 13:51:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 manew_JR 于 2017-9-20 13:53 编辑

如何通过Unity iOS应用程序在Twitter上分享图片和链接
8435.jpg


游戏引擎和游戏开发方面,Unity这一技术看起来是不可多得的,因为它不仅是最受欢迎和强大的游戏引擎,它具有用于开发iOS和游戏的优秀视觉编辑器,同时也具有很多功能,功能和社区的问题处理以及良好的定价选项。 毫无疑问,Unity被认为是最好的构建iOS和Android游戏和应用程序的引擎。


今天在本教程中,我正在分享一个与iOS应用程序相关的主题,帮助您轻松地从应用程序分享图片或链接到twitter。 而分享图像不是一项重大任务,而是包含iOS,用户必须首先上传图像或先在设备路径上写入图像,然后从该路径读取图像,因为iOS中不存在资源文件夹。 所以借助下面的代码,您可以轻松地将图像读取和写入设备路径。


让我们看看如何实现:
首先在Twitter上创建一个应用程序,并保存应用程序的消费者密钥,秘密密钥,媒体URL和Tweet URL。
那么为了在Twitter上分享,用户必须在Twitter上登录。 所以让我们使用下面提到的代码登录用户。


现在,我们创建三个UI按钮。
1.Twitter登录按钮//点击TwitterLogin
2.提交Pin Button //点击SubmitPin()
3.Twitter分享按钮//在点击中调用Twitter()。
并创建一个InputField来输入您在调用TwittterLogin()函数后收到的PIN码。

1. InputFieldPin

启动Twitter登录按钮。 然后成功禁用登录按钮并启用输入框并提交按钮。 然后在成功登录后,启用“共享”按钮并禁用所有其他按钮


现在创建两个脚本:
TwitterHandller和
Twitter



#TwitterHandller.cs
[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System;
using System.IO;
using System.Net;
using System.Xml;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Linq;
using System.Security.Cryptography;
using UnityEngine;
using SimpleJSON;
using System.Runtime.InteropServices;
public class TwitterHandller: MonoBehaviour
{
     Twitter.RequestTokenResponse m_RequestTokenResponse;
 
    Twitter.AccessTokenResponse m_AccessTokenResponse;
    public string CONSUMER_KEY;//Put oun consumer key here
 
     public string CONSUMER_SECRET;//Put own consumer secret here
    // Use this for initialization
    
    void Start()
    {
            LoadUserTwitterInfo();
     }
  void LoadUserTwitterInfo()
    {
           m_AccessTokenResponse = new Twitter.AccessTokenResponse();                    
           m_AccessTokenResponse.UserId =          PlayerPrefs.GetString(PLAYER_PREFS_TWITTER_USER_ID);
 
           m_AccessTokenResponse.ScreenName =  PlayerPrefs.GetStrin(PLAYER_PREFS_TWITTER_USER_SCREEN_NAME);
 
           m_AccessTokenResponse.Token = PlayerPrefs.GetString(PLAYER_PREFS_TWITTER_USER_TOKEN);
          
           m_AccessTokenResponse.TokenSecret = PlayerPrefs.GetString(PLAYER_PREFS_TWITTER_USER_TOKEN_SECRET);
            //Debug.Log ("ID"+m_AccessTokenResponse.UserId );
        
           // Debug.Log ("Name"+m_AccessTokenResponse.ScreenName );
    
          // Debug.Log ("Token"+m_AccessTokenResponse.Token );
    
          // Debug.Log ("Token Secret"+m_AccessTokenResponse.TokenSecret );
 
           if (!string.IsNullOrEmpty(m_AccessTokenResponse.Token) &&
          !string.IsNullOrEmpty                (m_AccessTokenResponse.ScreenName) &&
         !string.IsNullOrEmpty(m_AccessTokenResponse.Token) &&
         !string.IsNullOrEmpty(m_AccessTokenResponse.TokenSecret))
          {
                string log = "LoadTwitterUserInfo - succeeded";
 
                 log += "\n    UserId : " + m_AccessTokenResponse.UserId;
 
                log += "\n    ScreenName : " + m_AccessTokenResponse.ScreenName;
    
                 log += "\n    Token : " + m_AccessTokenResponse.Token;
      
                 log += "\n    TokenSecret : " + m_AccessTokenResponse.TokenSecret;
    
                 print(log);
             }
 
      }
public void TwitterLogin()
{ 
    //Calling GetRequestToken function of Twitter API use your own consumer key and consumer secret.
     StartCoroutine(Twitter.API.GetRequestToken(CONSUMER_KEY, CONSUMER_SECRET,
                                                           new  Twitter.RequestTokenCallback(this.OnRequestTokenCallback)));
}
public void  SubmitPin()
{
   StartCoroutine(Twitter.API.GetAccessToken(CONSUMER_KEY, CONSUMER_SECRET, m_RequestTokenResponse.Token, m_PIN,
                           new Twitter.AccessTokenCallback(this.OnAccessTokenCallback)));
}
public void TwitterShare()
{
//put url of the image that you want to share
         string url="https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/8e/d7/e9         /8ed7e940-9fda-d1ca-995e-d4e2086a438c/pr_source.jpg/150x150bb.jpg";
        string savePath = Path.Combine(Application.persistentDataPath, "data");
//downloading image from url and saving to path
        downloadImage(url, savePath);
//loading image from the path in byte array
        byte[] imageBytes = loadImage(savePath);
//Calling PostTweet  function of  Twitter   API
StartCoroutine(Twitter.API.PostTweet(imageBytes,m_Tweet,CONSUMER_KEY,CONSUMER_SECRET,     m_AccessTokenResponse,  new Twitter.PostTweetCallback(this.OnPostTweet)));
}
}


#Twitter.cs
[C#] 纯文本查看 复制代码
using System;
using System.IO;
using System.Net;
using System.Xml;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Linq;
using System.Security.Cryptography;
using UnityEngine;
using SimpleJSON;
using System.IO;
using System.Runtime.InteropServices;
namespace Twitter
{
    
   
    public class RequestTokenResponse
    {
        public string Token { get; set; }
        public string TokenSecret { get; set; }
    }
    public class AccessTokenResponse
    {
        public string Token { get; set; }
        public string TokenSecret { get; set; }
        public string UserId { get; set; }
        public string ScreenName { get; set; }
    }
    public delegate void RequestTokenCallback(bool success, RequestTokenResponse response);
    public delegate void AccessTokenCallback(bool success, AccessTokenResponse response);
    public delegate void PostTweetCallback(bool success);
    public delegate void GetTimelineCallback(bool success);
 
    public class API
    {
        #region OAuth Token Methods
        // 1. Get Request-Token From Twitter
        // 2. Get PIN from User
        // 3. Get Access-Token from Twitter
        // 4. Use Accss-Token for APIs requriring OAuth
        // Accss-Token will be always valid until the user revokes the access to your application.
        // Twitter APIs for OAuth process
        private static readonly string RequestTokenURL = "https://api.twitter.com/oauth/request_token";
        private static readonly string AuthorizationURL = "https://api.twitter.com/oauth/authenticate?oauth_token={0}";
        private static readonly string AccessTokenURL = "https://api.twitter.com/oauth/access_token";
        public static IEnumerator GetRequestToken(string consumerKey, string consumerSecret, RequestTokenCallback callback)
        {
            WWW web = WWWRequestToken(consumerKey, consumerSecret);
            yield return web;
            if (!string.IsNullOrEmpty(web.error))
            {
                Debug.Log(string.Format("GetRequestToken - failed. error : {0}", web.error));
                callback(false, null);
            }
            else
            {
                RequestTokenResponse response = new RequestTokenResponse
                {
                    Token = Regex.Match(web.text, @"oauth_token=([^&]+)").Groups[1].Value,
                    TokenSecret = Regex.Match(web.text, @"oauth_token_secret=([^&]+)").Groups[1].Value,
                };
                if (!string.IsNullOrEmpty(response.Token) &&
                    !string.IsNullOrEmpty(response.TokenSecret))
                {
                    callback(true, response);
                }
                else
                {
                    Debug.Log(string.Format("GetRequestToken - failed. response : {0}", web.text));
                    callback(false, null);
                }
            }
        }
        public static void OpenAuthorizationPage(string requestToken)
        {
            Application.OpenURL(string.Format(AuthorizationURL, requestToken));
        }
        public static IEnumerator GetAccessToken(string consumerKey, string consumerSecret, string requestToken, string pin, AccessTokenCallback callback)
        {
            Debug.Log ("GetAccessToken");
            WWW web = WWWAccessToken(consumerKey, consumerSecret, requestToken, pin);
            yield return web;
            if (!string.IsNullOrEmpty(web.error))
            {
                Debug.Log(string.Format("GetAccessToken - failed. error : {0}", web.error));
                callback(false, null);
            }
            else
            {
                AccessTokenResponse response = new AccessTokenResponse
                {
                    Token = Regex.Match(web.text, @"oauth_token=([^&]+)").Groups[1].Value,
                    TokenSecret = Regex.Match(web.text, @"oauth_token_secret=([^&]+)").Groups[1].Value,
                    UserId = Regex.Match(web.text, @"user_id=([^&]+)").Groups[1].Value,
                    ScreenName = Regex.Match(web.text, @"screen_name=([^&]+)").Groups[1].Value
                };
                if (!string.IsNullOrEmpty(response.Token) &&
                    !string.IsNullOrEmpty(response.TokenSecret) &&
                    !string.IsNullOrEmpty(response.UserId) &&
                    !string.IsNullOrEmpty(response.ScreenName))
                {
                    callback(true, response);
                }
                else
                {
                    Debug.Log(string.Format("GetAccessToken - failed. response : {0}", web.text));
                    callback(false, null);
                }
            }
        }
        private static WWW WWWRequestToken(string consumerKey, string consumerSecret)
        {
            // Add data to the form to post.
            WWWForm form = new WWWForm();
            form.AddField("oauth_callback", "oob");
            // HTTP header
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            AddDefaultOAuthParams(parameters, consumerKey, consumerSecret);
            parameters.Add("oauth_callback", "oob");
            Dictionary<string, string> headers = new Dictionary<string, string>();
            headers["Authorization"] = GetFinalOAuthHeader("POST", RequestTokenURL, parameters);
            return new WWW(RequestTokenURL, form.data, headers);
        }
        private static WWW WWWAccessToken(string consumerKey, string consumerSecret, string requestToken, string pin)
        {
            // Need to fill body since Unity doesn't like an empty request body.
            byte[] dummmy = new byte[1];
            dummmy[0] = 0;
            // HTTP header
            Dictionary<string, string> headers = new Dictionary<string, string>();
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            AddDefaultOAuthParams(parameters, consumerKey, consumerSecret);
            parameters.Add("oauth_token", requestToken);
            parameters.Add("oauth_verifier", pin);
            headers["Authorization"] = GetFinalOAuthHeader("POST", AccessTokenURL, parameters);
            return new WWW(AccessTokenURL, dummmy, headers);
        }
        private static string GetHeaderWithAccessToken(string httpRequestType, string apiURL, string consumerKey, string consumerSecret, AccessTokenResponse response, Dictionary<string, string> parameters)
        {
            AddDefaultOAuthParams(parameters, consumerKey, consumerSecret);
            parameters.Add("oauth_token", response.Token);
            parameters.Add("oauth_token_secret", response.TokenSecret);
            return GetFinalOAuthHeader(httpRequestType, apiURL, parameters);
        }
        #endregion
#region Twitter API Methods
       
        private const string PostTweetURL = "https://api.twitter.com/1.1/statuses/update.json";
  private const string GetTimelineURL = "https://api.twitter.com/1.1/statuses/home_timeline.json";
 private const string UploadMediaURL = "https://upload.twitter.com/1.1/media/upload.json";
public static IEnumerator PostTweet(byte[] imageBytes, string text, string consumerKey, string consumerSecret, AccessTokenResponse response, PostTweetCallback callback)
        {
            Dictionary<string, string> mediaParameters = new Dictionary<string, string>();
            string encoded64ImageData = Convert.ToBase64String(imageBytes);
            mediaParameters.Add("media_data", encoded64ImageData);
            // Add data to the form to post.
            WWWForm mediaForm = new WWWForm();
            mediaForm.AddField("media_data", encoded64ImageData);
            // HTTP header
            Dictionary<string, string> mediaHeaders = new Dictionary<string, string>();
            string auth = GetHeaderWithAccessToken("POST", UploadMediaURL, consumerKey, consumerSecret, response, mediaParameters);
            mediaHeaders.Add("Authorization", auth);
            mediaHeaders.Add("Content-Transfer-Encoding", "base64");
            WWW mw = new WWW(UploadMediaURL, mediaForm.data, mediaHeaders);
            yield return mw;
            string mID = Regex.Match(mw.text, @"(\Dmedia_id\D\W)(\d*)").Groups[2].Value;
            Debug.Log("response from media request : " + mw.text);
            Debug.Log("mID = " + mID);
            if (!string.IsNullOrEmpty(mw.error))
            {
                Debug.Log(string.Format("PostTweet - failed. {0}\n{1}", mw.error, mw.text));
                callback(false);
            }
            else
            {
                string error = Regex.Match(mw.text, @"<error>([^&]+)</error>").Groups[1].Value;
                if (!string.IsNullOrEmpty(error))
                {
                    Debug.Log(string.Format("PostTweet - failed. {0}", error));
                    callback(false);
                }
                else
                {
                    callback(true);
                }
            }
            string url="https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/8e/d7/e9/8ed7e940-9fda-d1ca-995e-d4e2086a438c/pr_source.jpg/150x150bb.jpg";
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("status", url);
            parameters.Add("media_ids", mID);
            //parameters.Add("url", url);
            // Add data to the form to post.
            WWWForm form = new WWWForm();
            form.AddField("status", url);
            form.AddField("media_ids", mID);
            //form.AddField("url", url);
            // HTTP header
            var headers = new Dictionary<string, string>();
            headers["Authorization"] = GetHeaderWithAccessToken("POST", PostTweetURL, consumerKey, consumerSecret, response, parameters);
            WWW web = new WWW(PostTweetURL, form.data, headers);
            yield return web;
            if (!string.IsNullOrEmpty(web.error))
            {
                Debug.Log(string.Format("PostTweet - failed. {0}\n{1}", web.error, web.text));
                callback(false);
            }
            else
            {
                string error = Regex.Match(web.text, @"<error>([^&]+)</error>").Groups[1].Value;
                if (!string.IsNullOrEmpty(error))
                {
                    Debug.Log(string.Format("PostTweet - failed. {0}", error));
                    callback(false);
                }
                else
                {
                    callback(true);
                }
            }
        }
 #endregion
 #region OAuth Help Methods
  private static readonly string[] OAuthParametersToIncludeInHeader = new[]
                                                          {
                                                              "oauth_version",
                                                              "oauth_nonce",
                                                              "oauth_timestamp",
                                                              "oauth_signature_method",
                                                              "oauth_consumer_key",
                                                              "oauth_token",
                                                              "oauth_verifier"
                                                              // Leave signature omitted from the list, it is added manually
                                                              // "oauth_signature",
                                                          };
        private static readonly string[] SecretParameters = new[]
                                                                {
                                                                    "oauth_consumer_secret",
                                                                    "oauth_token_secret",
                                                                    "oauth_signature"
                                                                };
        private static void AddDefaultOAuthParams(Dictionary<string, string> parameters, string consumerKey, string consumerSecret)
        {
            parameters.Add("oauth_version", "1.0");
            parameters.Add("oauth_nonce", GenerateNonce());
            parameters.Add("oauth_timestamp", GenerateTimeStamp());
            parameters.Add("oauth_signature_method", "HMAC-SHA1");
            parameters.Add("oauth_consumer_key", consumerKey);
            parameters.Add("oauth_consumer_secret", consumerSecret);
        }
        private static string GetFinalOAuthHeader(string HTTPRequestType, string URL, Dictionary<string, string> parameters)
        {
            // Add the signature to the oauth parameters
            string signature = GenerateSignature(HTTPRequestType, URL, parameters);
            parameters.Add("oauth_signature", signature);
            StringBuilder authHeaderBuilder = new StringBuilder();
            authHeaderBuilder.AppendFormat("OAuth realm=\"{0}\"", "Twitter API");
            var sortedParameters = from p in parameters
                                   where OAuthParametersToIncludeInHeader.Contains(p.Key)
                                   orderby p.Key, UrlEncode(p.Value)
                                   select p;
            foreach (var item in sortedParameters)
            {
                authHeaderBuilder.AppendFormat(",{0}=\"{1}\"", UrlEncode(item.Key), UrlEncode(item.Value));
            }
            authHeaderBuilder.AppendFormat(",oauth_signature=\"{0}\"", UrlEncode(parameters["oauth_signature"]));
            return authHeaderBuilder.ToString();
        }
        private static string GenerateSignature(string httpMethod, string url, Dictionary<string, string> parameters)
        {
            var nonSecretParameters = (from p in parameters
                                       where !SecretParameters.Contains(p.Key)
                                       select p);
            // Create the base string. This is the string that will be hashed for the signature.
            string signatureBaseString = string.Format(CultureInfo.InvariantCulture,
                                                       "{0}&{1}&{2}",
                                                       httpMethod,
                                                       UrlEncode(NormalizeUrl(new Uri(url))),
                                                       UrlEncode(nonSecretParameters));
            // Create our hash key (you might say this is a password)
            string key = string.Format(CultureInfo.InvariantCulture,
                                       "{0}&{1}",
                                       UrlEncode(parameters["oauth_consumer_secret"]),
                                       parameters.ContainsKey("oauth_token_secret") ? UrlEncode(parameters["oauth_token_secret"]) : string.Empty);
            // Generate the hash
            HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.ASCII.GetBytes(key));
            byte[] signatureBytes = hmacsha1.ComputeHash(Encoding.ASCII.GetBytes(signatureBaseString));
            return Convert.ToBase64String(signatureBytes);
        }
        private static string GenerateTimeStamp()
        {
            // Default implementation of UNIX time of the current UTC time
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds, CultureInfo.CurrentCulture).ToString(CultureInfo.CurrentCulture);
        }
        private static string GenerateNonce()
        {
            // Just a simple implementation of a random number between 123400 and 9999999
            return new System.Random().Next(123400, int.MaxValue).ToString("X", CultureInfo.InvariantCulture);
        }
        private static string NormalizeUrl(Uri url)
        {
            string normalizedUrl = string.Format(CultureInfo.InvariantCulture, "{0}://{1}", url.Scheme, url.Host);
            if (!((url.Scheme == "http" && url.Port == 80) || (url.Scheme == "https" && url.Port == 443)))
            {
                normalizedUrl += ":" + url.Port;
            }
            normalizedUrl += url.AbsolutePath;
            return normalizedUrl;
        }
        private static string UrlEncode(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return string.Empty;
            }
            value = Uri.EscapeDataString(value);
            // UrlEncode escapes with lowercase characters (e.g. %2f) but oAuth needs %2F
            value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper());
            // these characters are not escaped by UrlEncode() but needed to be escaped
            value = value
                .Replace("(", "%28")
                .Replace(")", "%29")
                .Replace("$", "%24")
                .Replace("!", "%21")
                .Replace("*", "%2A")
                .Replace("'", "%27");
            // these characters are escaped by UrlEncode() but will fail if unescaped!
            value = value.Replace("%7E", "~");
            return value;
        }
        private static string UrlEncode(IEnumerable<KeyValuePair<string, string>> parameters)
        {
            StringBuilder parameterString = new StringBuilder();
            var paramsSorted = from p in parameters
                               orderby p.Key, p.Value
                               select p;
            foreach (var item in paramsSorted)
            {
                if (parameterString.Length > 0)
                {
                    parameterString.Append("&");
                }
                parameterString.Append(
                    string.Format(
                        CultureInfo.InvariantCulture,
                        "{0}={1}",
                        UrlEncode(item.Key),
                        UrlEncode(item.Value)));
            }
            return UrlEncode(parameterString.ToString());
        }
        #endregion
    }
}




现在我们已经准备好了我们的脚本。 我们只需在按钮点击中调用“TwitterHandller”脚本和“TwitterHandller”脚本的“Twitter”()函数的TwitterLogin()函数。 成功分享后,您可以发布成功的调试。






原文标题:How-to-Share-Image--Link-on-Twitter-through-Unity-iOS-App

回复

使用道具 举报

5熟悉之中
925/1000
排名
3952
昨日变化
4

0

主题

467

帖子

925

积分

Rank: 5Rank: 5

UID
156480
好友
0
蛮牛币
1498
威望
0
注册时间
2016-7-12
在线时间
172 小时
最后登录
2017-10-19
发表于 2017-9-21 09:33:13 | 显示全部楼层
6666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
578/1000
排名
4884
昨日变化
40

0

主题

217

帖子

578

积分

Rank: 5Rank: 5

UID
122160
好友
0
蛮牛币
1133
威望
0
注册时间
2015-9-10
在线时间
139 小时
最后登录
2017-10-20
发表于 2017-9-21 09:35:31 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
848/1000
排名
3274
昨日变化
19

1

主题

193

帖子

848

积分

Rank: 5Rank: 5

UID
151630
好友
2
蛮牛币
805
威望
0
注册时间
2016-6-12
在线时间
306 小时
最后登录
2017-10-20
发表于 2017-9-21 11:08:07 | 显示全部楼层
推特国内没法登陆。。。而且为啥不用shareSDK呢?

回复 支持 反对

使用道具 举报

7日久生情
1928/5000
排名
6375
昨日变化
67

4

主题

1579

帖子

1928

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
2
蛮牛币
2531
威望
0
注册时间
2017-3-1
在线时间
189 小时
最后登录
2017-10-20
发表于 2017-9-21 14:14:21 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1907/5000
排名
710
昨日变化

1

主题

246

帖子

1907

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
27816
好友
3
蛮牛币
5864
威望
0
注册时间
2014-6-3
在线时间
600 小时
最后登录
2017-10-20
发表于 2017-9-21 17:17:04 | 显示全部楼层
赞赞赞赞赞赞赞赞赞赞赞赞赞

回复 支持 反对

使用道具 举报

7日久生情
1864/5000
排名
17339
昨日变化
16

2

主题

1566

帖子

1864

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2514
威望
0
注册时间
2016-11-22
在线时间
272 小时
最后登录
2017-10-20
发表于 2017-9-21 17:37:34 | 显示全部楼层
666666666666666

回复 支持 反对

使用道具 举报

3偶尔光临
152/300
排名
12190
昨日变化
8

0

主题

42

帖子

152

积分

Rank: 3Rank: 3Rank: 3

UID
221055
好友
2
蛮牛币
560
威望
0
注册时间
2017-5-7
在线时间
58 小时
最后登录
2017-10-18
发表于 2017-9-25 21:09:44 | 显示全部楼层
小白,看来会没看明白,大佬方便讲解一下吗

回复 支持 反对

使用道具 举报

3偶尔光临
179/300
排名
9474
昨日变化
136

0

主题

28

帖子

179

积分

Rank: 3Rank: 3Rank: 3

UID
109907
好友
0
蛮牛币
152
威望
0
注册时间
2015-6-23
在线时间
67 小时
最后登录
2017-10-20
发表于 3 天前 | 显示全部楼层
谢谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表