Periksa konektivitas internet dari Unity

Saya memiliki proyek Unity yang saya buat untuk platform Android dan iOS. Saya ingin memeriksa konektivitas internet di perangkat Desktop, Android, dan iOS. Saya telah membaca tentang tiga solusi berbeda:

  1. Ping sesuatu (misalnya Google) - Saya sangat tidak menyukai keputusan seperti itu, dan saya sudah membaca tentang kesalahan di Android.

  2. Application.internetReachability - Menurut dokumentasi Unity, fungsi ini hanya akan menentukan bahwa saya memiliki KEMUNGKINAN untuk terhubung ke Internet (tidak menjamin koneksi nyata).

  3. Network.TestConnection() - Jika saya tidak memiliki koneksi internet, aplikasi saya gagal. Jadi ini juga tidak benar.

Bagaimana cara menentukan apakah saya memiliki konektivitas internet dari dalam Unity?


person Anna Kuleva    schedule 07.12.2015    source sumber
comment
Mengapa Network.TestConnection() menyebabkan aplikasi Anda gagal? Sepertinya sedikit penanganan kesalahan akan dengan mudah menangkapnya.   -  person Ron Beyer    schedule 07.12.2015
comment
Harap tautkan ke kesalahan yang disebutkan dengan pendekatan ping?   -  person SimpleVar    schedule 07.12.2015
comment
@RonBeyer, jika saya menggunakan Network.TestConnection(), dan tidak memiliki Koneksi Internet, Aplikasi saya gagal dengan pengecualian berikut: 'Tidak dapat menyelesaikan alamat penguji koneksi, Anda harus terhubung ke internet sebelum melakukan ini atau mengatur alamat ke sesuatu yang dapat diakses oleh Anda.' Saya menyalin alamat dari docs.unity3d.com/ScriptReference/Network.TestConnection.html   -  person Anna Kuleva    schedule 07.12.2015
comment
@AnnaKuleva Jika Network.TestConnection() hanya memunculkan pengecualian saat tidak ada internet, bungkus saja dengan try-catch. Error berarti tidak ada internet, dan tidak ada error berarti Anda dapat melihat hasil tes.   -  person SimpleVar    schedule 07.12.2015
comment
@RonBeyer Ada banyak topik di mana orang-orang mencoba menangkap pengecualian ini) Saya belum melihat jawaban yang siap. Jika Anda memberi saya tautan dengan jawabannya, saya akan mengucapkan terima kasih.   -  person Anna Kuleva    schedule 07.12.2015
comment
@SamB, saya memerlukan satu solusi untuk dua platform berbeda (jika memungkinkan). Bagaimana cara melakukannya untuk platform ios, saya sudah tahu.   -  person Anna Kuleva    schedule 07.12.2015
comment
Ini jelas bukan duplikat dari pertanyaan terkait. Pertanyaan ini menanyakan tentang cara memeriksa konektivitas menggunakan C# dari dalam Unity3D di PC, Android dan iOS. Duplikat yang diusulkan menanyakan cara memeriksa konektivitas menggunakan Objective-C dari iOS SDK, menggunakan Cocoa Touch. Ini adalah dua bahasa pemrograman dan tumpukan teknologi yang benar-benar terpisah.   -  person Maximillian Laumeister    schedule 08.12.2015


Jawaban (5)


Saya sebenarnya tidak percaya bahwa Network.TestConnection() adalah alat yang tepat untuk pekerjaan ini. Menurut dokumentasi, menurut saya ini dimaksudkan untuk menguji apakah NAT adalah berfungsi dan klien Anda dapat dijangkau secara publik berdasarkan IP, tetapi yang ingin Anda periksa adalah apakah Anda memiliki konektivitas internet umum.

Berikut adalah solusi yang saya temukan di Unity Answers oleh pengguna pixel_fiend, yang hanya menguji situs web untuk melihat apakah pengguna memiliki konektivitas. Salah satu manfaat kode ini adalah kode ini menggunakan IEnumerator untuk operasi asinkron, sehingga pengujian konektivitas tidak akan menghambat aplikasi Anda yang lain:

IEnumerator checkInternetConnection(Action<bool> action){
     WWW www = new WWW("http://google.com");
     yield return www;
     if (www.error != null) {
         action (false);
     } else {
         action (true);
     }
 } 
 void Start(){
     StartCoroutine(checkInternetConnection((isConnected)=>{
         // handle connection status here
     }));
 }

Anda dapat mengubah situs web sesuai keinginan Anda, atau bahkan memodifikasi kode untuk mengembalikan kesuksesan jika salah satu dari sejumlah situs dapat dijangkau. AFAIK tidak ada cara untuk memeriksa konektivitas internet yang sebenarnya tanpa mencoba terhubung ke situs tertentu di internet, jadi "ping" ke satu atau lebih situs web seperti ini mungkin merupakan pilihan terbaik Anda dalam menentukan konektivitas.

person Maximillian Laumeister    schedule 07.12.2015
comment
Bagaimana cara memanggil Action‹bool› action ? menggunakan apa? - person Haha TTpro; 25.04.2016
comment
@HahaTTpro Menggunakan StartCoroutine(checkInternetConnection((isConnected)=>{/* handle connection status here */})); - person Maximillian Laumeister; 25.04.2016
comment
Terima kasih atas jawabannya @Maximillian. Namun, itu bukan yang aku inginkan. Maksud saya apa namespace dari Action‹bool›. Ini adalah Sistem.Aksi‹bool›. - person Haha TTpro; 26.04.2016
comment
@HahaTTpro Ya benar, ini System.Action. Info lebih lanjut: answers.unity3d. com/questions/335953/what-is-systemaction.html - person Maximillian Laumeister; 26.04.2016

saya tahu ini sudah lama, tapi mungkin bisa membantu Anda.

public bool CheckInternetConnection(){
    return !(Application.internetReachability == NetworkReachability.NotReachable)
}
person kamiyar    schedule 02.06.2018
comment
Apakah ini berfungsi pada perangkat seluler dengan Android dan iOS? - person Skylin R; 16.10.2019
comment
ya, saya mengujinya, ini berfungsi di semua perangkat dan platform - person kamiyar; 17.10.2019
comment
Apakah Anda membaca pertanyaannya? Dikatakan di sana bahwa ini tidak cukup. Dokumentasi mengatakan ini hanya menunjukkan adanya jaringan yang tersedia, bukan jaringan tersebut memiliki konektivitas. Misalnya koneksi wifi ke router tetapi router tidak memiliki koneksi eksternal. Bahkan ada jawaban duplikat yang downvote. - person user99999991; 28.07.2020
comment
Application.internetReachability bukan untuk koneksi sebenarnya - person Saad Anees; 09.11.2020

void Start()
{
    StartCoroutine(CheckInternetConnection(isConnected =>
    {
        if (isConnected)
        {
            Debug.Log("Internet Available!");
        }
        else
        {
            Debug.Log("Internet Not Available");
        }
    }));
}

IEnumerator CheckInternetConnection(Action<bool> action)
{
    UnityWebRequest request = new UnityWebRequest("http://google.com");
    yield return request.SendWebRequest();
    if (request.error != null) {
        Debug.Log ("Error");
        action (false);
    } else{
        Debug.Log ("Success");
        action (true);
    }
}

Karena WWW sudah tidak digunakan lagi, UnityWebRequest dapat digunakan sebagai gantinya.

person Arkar Min Tun    schedule 26.05.2020

Saya telah membuat perpustakaan Android yang dapat digunakan sebagai plugin Unity untuk tujuan ini. Jika ada yang tertarik, ini tersedia di https://github.com/rixment/awu-plugin

Sedangkan untuk versi iOS sayangnya saya tidak memiliki cukup pengetahuan di bidang ini. Alangkah baiknya jika seseorang dapat memperluas repo untuk menyertakan versi iOS juga.

person Eric    schedule 17.03.2020

Anda dapat memeriksa koneksi jaringan menggunakan kode ini

if(Application.internetReachability == NetworkReachability.NotReachable){
       Debug.Log("Error. Check internet connection!");
}
person Codemaker    schedule 05.04.2020
comment
lihat untuk memeriksa sambungan, dan jenisnya -› docs.unity3d.com/ScriptReference/ Namun sehubungan dengan internetReachability: Jangan gunakan properti ini untuk menentukan konektivitas sebenarnya. Misalnya. perangkat dapat terhubung ke hot spot, tetapi tidak memiliki rute sebenarnya ke jaringan. docs.unity3d.com/ScriptReference/ - person Sergio Solorzano; 27.05.2020