Potrebbe capitare (e capita spesso) di dover fare un controllo sulla connessione dell’utente/giocatore, sopratutto se si sta siluppando un gioco/app per dispositivi mobili.
Quando il gioco fa uso di qualche risorsa on-line, come per esempio i servizi Google/Apple (leaderboad, cloud save ecc…) o in moltissimi altri casi, dovremmo fare un check della linea Internet prima di alcune operazioni.
Nel caso in cui l’utente non sia connesso ad Internet potremmo per esempio far apparire un messaggio tipo “Please check Internet connection” o altro e bloccare alcune funzioni che necessitano una connessione attiva.
Se cercate una risposta in giro per i forum, la soluzione più diffusa è questa:
if(Application.internetReachability == NetworkReachability.NotReachable) { Debug.Log("Error. Check internet connection!"); }
Un semplice controllo. Ma sbagliato.
Questo controllo cerca di distinguere la rete su cui è connesso l’utente. Fa un check della rete WiFi e il Carrier, che potrebbero essere accessibili, ma comunque non in grado di raggiungere Internet per uno svariato numero di motivi. Potrebbe essere possibile connettersi all’hot spot ma l’hotspot stesso non avere accesso a Internet.
Basterebbe leggere la guida ufficiale di Unity per essere consapevoli che questo non è il metodo migliore.
L’unico modo per fare un check della connettività che sia sicuro al 100% è quello di inviare una richiesta ad un servizio, possibilmente molto leggero ed aspettare un’eventuale risposta.
Il metodo che vi consiglio di usare è questo:
public System.Collections.IEnumerator CheckInternetConnection(Action<bool> action)
{
UnityWebRequest www = UnityWebRequest.Get("http://google.com");
yield return www.SendWebRequest();
if (www.error != null)
{
action(false);
}
else
{
action(true);
}
}
Come è intuibile, si farà una chiamata al sito google.com, notoriamente veloce e sempre on-line.
Per fare il controllo, basterà richiamare la Coroutine con questo codice:
StartCoroutine(GooglePlayConnection.instance.CheckInternetConnection((isConnected) =>
{
if (!isConnected)
{
//Ops... non sei connesso ad internet
}
else
{
//Connessione attiva e funzionante!
}
}));
Per esempio nel metodo Start(), possiamo far apparire un messaggio oppure no.
public GameObject noInternetMessage; //Il gameObject che contiene il messaggio
void Start()
{
StartCoroutine(GooglePlayConnection.instance.CheckInternetConnection((isConnected) =>
{
if (!isConnected)
{
noInternetMessage.SetActive(true);
}
else
{
noInternetMessage.SetActive(false);
}
}));
}