unity3d 判断url是否正常 android and ios

先说明一下unity可以用www的判断一个url 是否可用,但有很大的问题,其一是判断结果不准确,其二是会引起线程阻塞,卡死,总之一句话就是一个坑。坑。坑所有,我们选择了用java 和oc 来进行判断 废话不多上代码

调用

//1: 判断的URL,2超时时间,3回调
        InetAddress.Instance.CheckInetAddressReachableAsync("http://blog.csdn.net/qqo_aa/", 3000, (address, isReachable, errorMsgInetAddress) =>
        {
            //这是干神马
        });

C#

    public void CheckInetAddressReachableAsync(string address, int timeoutInMS, Action<string, bool, string> callback)
    {
#if (UNITY_ANDROID && !UNITY_EDITOR) || ANDROID_CODE_VIEW
        try
        {
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaClass unityPluginLoader = new AndroidJavaClass("java类全名");
            unityPluginLoader.CallStatic("CheckInetAddressReachableAsync", currentActivity, address, timeoutInMS, sdkCallback.GetHostName(), sdkCallback.GetMethodName());
        }
        catch (Exception e)
        {
        }
#elif (UNITY_IOS && !UNITY_EDITOR) || IOS_CODE_VIEW
        _IOS_CheckInetAddressReachableAsync(address, timeoutInMS, sdkCallback.GetHostName(), sdkCallback.GetMethodName());
#endif
    }

android

    public static void CheckInetAddressReachableAsync(Context context, String address, int timeout,
            String gameObjectName, String methodName) {
        if (address == null || address.isEmpty()) {
            return;
        }
        if (gameObjectName == null || gameObjectName.isEmpty()) {
            return;
        }
        if (methodName == null || methodName.isEmpty()) {
            return;
        }
        InetAddressChecker checker = new InetAddressChecker(context, address, timeout);
        checker.SetUnityGameObjectName(gameObjectName);
        checker.SetUnityGameObjectMethodName(methodName);
        checker.check();
    }




package com.moba.unityplugin;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import com.unity3d.player.UnityPlayer;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;


public class InetAddressChecker
{
    private static final String TAG = "InetAddressChecker";

    private Context mContext = null;
    private InetAddress mInetAddress = null;
    private String mAddress = "";
    private int mTimeout = 3000;
    private Thread mThread = null;

    private String mGameObjectName = "";
    private String mGameObjectMethodName = "";

    public InetAddressChecker(Context context, String address, int timeout) {
        mContext = context;
        mAddress = address;
        mTimeout = timeout;
    }

    public void SetUnityGameObjectName(String gameObjectName) {
        mGameObjectName = gameObjectName;
    }

    public void SetUnityGameObjectMethodName(String methodName) {
        mGameObjectMethodName = methodName;
    }

    public void check() {
        if (mAddress == null || mAddress.isEmpty()) {
            return;
        }
        if (mThread != null) {
            return;
        }
        mThread = new Thread(){
            @Override
            public void run() {
                try {
                    mInetAddress = InetAddress.getByName(mAddress.replace("http://", "").replace("https://", "").replace("/", ""));
                    String hostName = mInetAddress.getHostName() + "(" + mInetAddress.getHostAddress() + ")";
                    boolean isReachable = mInetAddress.isReachable(mTimeout / 2);
                    if (!isReachable) {
                        // check in other ways
                        isReachable = isOnline();
                    }
                    if (isReachable) {

                    } else {

                    }
                    OnCheckResult(true, "", isReachable);
                } catch (Exception e) {

                    OnCheckResult(false, e.toString(), false);
                }
                mThread = null;
            }
        };
        mThread.start();
    }

    boolean isOnline() {
        try {
            ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnected()) {
                try {
                    URL url = new URL(mAddress);
                    HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                    urlc.setConnectTimeout(mTimeout / 2);
                    urlc.connect();
                    int responseCode = urlc.getResponseCode();

                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        urlc.disconnect();
                        return true;
                    }
                    urlc.disconnect();
                } catch (MalformedURLException e0) {

                } catch (IOException e1) {

                }
            }
        } catch (Exception e) {
        }
        return false;
    }

    void OnCheckResult(boolean success, String errorMsg, boolean isReachable) {
        Map<String, String> parameters = new HashMap<String, String>();
        if (mInetAddress != null) {
            try {
                parameters.put("hostAddress", mInetAddress.getHostAddress());
                parameters.put("hostName", mInetAddress.getHostName());
            } catch (Exception e) {

            }
        }
        try {
            parameters.put("result", success ? "true" : "false");
            parameters.put("errorMsg", errorMsg);
            parameters.put("isReachable", isReachable ? "true" : "false");
        } catch (Exception e) {

        }
        String msg = "";
        try {
            JSONObject msgJson = JSONObject.fromObject(parameters);
            msg = msgJson.toString();
        } catch (Exception e) {
            msg = "";

        }
        if (mGameObjectName != null && !mGameObjectName.isEmpty()) {
            if (mGameObjectMethodName != null && !mGameObjectMethodName.isEmpty()) {
                UnityPlayer.UnitySendMessage(mGameObjectName, mGameObjectMethodName, msg);
            }
        }
    }
}

IOS

  void _IOS_CheckInetAddressReachableAsync(const char *hostName, int timeoutInMS, const char *gameObjectName, const char *gameObjectMethodName)
    {
        NSString *strGameObjectName = [NSString stringWithUTF8String:gameObjectName];
        NSString *strGameObjectMethodName = [NSString stringWithUTF8String:gameObjectMethodName];
        NSString *strHostName = [NSString stringWithUTF8String:hostName];
        NSURL *url = [NSURL URLWithString:strHostName];
        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:(timeoutInMS / 1000.0)];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                                   bool result = true;
                                   NSString *errorMsg = @"";
                                   bool isReachable = false;
                                   if (connectionError != nil) {
                                       if (connectionError.localizedDescription != nil) {
                                           errorMsg = connectionError.localizedDescription;
                                       } else if (connectionError.localizedFailureReason != nil) {
                                           errorMsg = connectionError.localizedFailureReason;
                                       } else {
                                           errorMsg = @"Unhkown Error";
                                       }
                                   } else {
                                       long statusCode = ((NSHTTPURLResponse *)response).statusCode;
                                       if (statusCode == 200) {
                                           isReachable = true;
                                       } else {
                                           errorMsg = [NSString stringWithFormat:@"StatusCode: %ld", statusCode];
                                       }
                                   }
                                   NSMutableDictionary *parameters = [[[NSMutableDictionary alloc] initWithCapacity:1] autorelease];
                                   [parameters setObject:strHostName forKey:@"hostAddress"];
                                   [parameters setObject:strHostName forKey:@"hostName"];
                                   [parameters setObject:result ? @"true" : @"false" forKey:@"result"];
                                   [parameters setObject:errorMsg forKey:@"errorMsg"];
                                   [parameters setObject:isReachable ? @"true" : @"false" forKey:@"isReachable"];
                                   NSString* strParameters = [PluginHelper convertToJSONData:parameters];
                                   UnitySendMessage("你懂的");
                               }];
    }

猜你喜欢

转载自blog.csdn.net/qqo_aa/article/details/78524882