ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตจาก Unity

ฉันมีโปรเจ็กต์ Unity ที่ฉันสร้างสำหรับแพลตฟอร์ม Android และ iOS ฉันต้องการตรวจสอบการเชื่อมต่ออินเทอร์เน็ตบนอุปกรณ์เดสก์ท็อป, Android และ iOS ฉันได้อ่านวิธีแก้ปัญหาที่แตกต่างกันสามวิธี:

  1. ส่ง Ping บางอย่าง (เช่น Google) - ฉันไม่ชอบการตัดสินใจแบบนี้เลย และฉันได้อ่านเกี่ยวกับข้อผิดพลาดบน Android แล้ว

  2. Application.internetReachability - ตามเอกสารของ Unity ฟังก์ชันนี้จะกำหนดว่าฉันมีความเป็นไปได้ที่จะเชื่อมต่ออินเทอร์เน็ตเท่านั้น (ไม่รับประกันการเชื่อมต่อจริง)

  3. Network.TestConnection() - หากฉันไม่มีการเชื่อมต่ออินเทอร์เน็ต การสมัครของฉันก็ล้มเหลว นี่จึงไม่ถูกต้องเช่นกัน

ฉันจะทราบได้อย่างไรว่าฉันมีการเชื่อมต่ออินเทอร์เน็ตจากภายใน Unity หรือไม่


person Anna Kuleva    schedule 07.12.2015    source แหล่งที่มา
comment
เหตุใด Network.TestConnection() จะทำให้ใบสมัครของคุณล้มเหลว ดูเหมือนว่าการจัดการข้อผิดพลาดเล็กน้อยจะจับได้ง่าย   -  person Ron Beyer    schedule 07.12.2015
comment
โปรดเชื่อมโยงไปยังข้อผิดพลาดดังกล่าวด้วยวิธีส่ง Ping หรือไม่   -  person SimpleVar    schedule 07.12.2015
comment
@RonBeyer ถ้าฉันใช้ Network.TestConnection() และไม่มีการเชื่อมต่ออินเทอร์เน็ต แอปพลิเคชันของฉันล้มเหลวโดยมีข้อยกเว้นต่อไปนี้: 'ไม่สามารถแก้ไขที่อยู่ผู้ทดสอบการเชื่อมต่อ คุณต้องเชื่อมต่อกับอินเทอร์เน็ตก่อนที่จะดำเนินการนี้ หรือตั้งค่าที่อยู่เป็นสิ่งที่สามารถเข้าถึงได้ คุณ.' ฉันคัดลอกรับมือจาก docs.unity3d.com/ScriptReference/Network.TestConnection.html   -  person Anna Kuleva    schedule 07.12.2015
comment
@AnnaKuleva หาก Network.TestConnection() ส่งข้อยกเว้นเฉพาะเมื่อไม่มีอินเทอร์เน็ต ให้ล้อมไว้ใน try-catch ข้อผิดพลาดหมายถึงไม่มีอินเทอร์เน็ต และไม่มีข้อผิดพลาดหมายความว่าคุณสามารถดูผลการทดสอบได้   -  person SimpleVar    schedule 07.12.2015
comment
@RonBeyer มีหลายหัวข้อที่ผู้คนพยายามจับข้อยกเว้นนี้) ฉันยังไม่เห็นคำตอบที่พร้อม ถ้าให้ลิงค์มาตอบจะบอกว่าขอบคุณครับ   -  person Anna Kuleva    schedule 07.12.2015
comment
@SamB ฉันต้องการโซลูชันเดียวสำหรับสองแพลตฟอร์มที่แตกต่างกัน (ถ้าเป็นไปได้) ฉันรู้แล้วว่าจะทำยังไงกับแพลตฟอร์ม iOS   -  person Anna Kuleva    schedule 07.12.2015
comment
นี่ไม่ใช่คำถามซ้ำกับคำถามที่เชื่อมโยงอย่างแน่นอน คำถามนี้ถามเกี่ยวกับวิธีตรวจสอบการเชื่อมต่อโดยใช้ C# จากภายใน Unity3D บนพีซี, Android และ iOS สำเนาที่เสนอกำลังถามวิธีตรวจสอบการเชื่อมต่อโดยใช้ Objective-C จาก iOS SDK โดยใช้ Cocoa Touch นี่เป็นสองภาษาการเขียนโปรแกรมและสแต็คเทคโนโลยีที่แยกจากกันโดยสิ้นเชิง   -  person Maximillian Laumeister    schedule 08.12.2015


คำตอบ (5)


ฉันไม่เชื่อว่า Network.TestConnection() เป็นเครื่องมือที่เหมาะสมสำหรับงานนี้ ตามเอกสารประกอบ สำหรับฉันดูเหมือนว่ามันมีไว้สำหรับการทดสอบว่า NAT เป็น ทำงานได้และลูกค้าของคุณสามารถเข้าถึงได้แบบสาธารณะโดย IP แต่สิ่งที่คุณต้องการตรวจสอบคือคุณมีการเชื่อมต่ออินเทอร์เน็ตทั่วไปหรือไม่

นี่คือโซลูชันที่ฉันพบใน Unity Answers โดยผู้ใช้ pixel_fiend ซึ่งเพียงทดสอบเว็บไซต์เพื่อดูว่าผู้ใช้มีการเชื่อมต่อหรือไม่ ข้อดีอย่างหนึ่งของโค้ดนี้คือใช้ IEnumerator สำหรับการทำงานแบบอะซิงโครนัส ดังนั้นการทดสอบการเชื่อมต่อจะไม่รองรับส่วนที่เหลือของแอปพลิเคชันของคุณ:

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
     }));
 }

คุณสามารถเปลี่ยนเว็บไซต์เป็นสิ่งที่คุณต้องการ หรือแม้แต่แก้ไขโค้ดเพื่อให้กลับมาประสบความสำเร็จหากสามารถเข้าถึงไซต์ใดไซต์หนึ่งจากจำนวนหนึ่งได้ AFAIK ไม่มีวิธีตรวจสอบการเชื่อมต่ออินเทอร์เน็ตที่แท้จริงโดยไม่ต้องพยายามเชื่อมต่อกับไซต์ใดไซต์หนึ่งบนอินเทอร์เน็ต ดังนั้น "การส่ง Ping" ไปยังเว็บไซต์หนึ่งหรือหลายแห่งในลักษณะนี้น่าจะเป็นทางออกที่ดีที่สุดในการพิจารณาการเชื่อมต่อ

person Maximillian Laumeister    schedule 07.12.2015
comment
จะเรียก Action‹bool› action ได้อย่างไร? ใช้อะไร? - person Haha TTpro; 25.04.2016
comment
@HahaTTpro ใช้ StartCoroutine(checkInternetConnection((isConnected)=>{/* handle connection status here */})); - person Maximillian Laumeister; 25.04.2016
comment
ขอบคุณสำหรับคำตอบ @Maximillian อย่างไรก็ตามมันไม่ใช่สิ่งที่ฉันต้องการ ฉันหมายถึงว่าเนมสเปซของ Action‹bool› คืออะไร มันคือ System.Action‹bool› - person Haha TTpro; 26.04.2016
comment
@HahaTTpro ใช่ถูกต้อง มันคือ System.Action ข้อมูลเพิ่มเติม: answers.unity3d com/questions/335953/what-is-systemaction.html - person Maximillian Laumeister; 26.04.2016

ฉันรู้ว่ามันเก่า แต่อาจช่วยคุณได้

public bool CheckInternetConnection(){
    return !(Application.internetReachability == NetworkReachability.NotReachable)
}
person kamiyar    schedule 02.06.2018
comment
มันทำงานบนอุปกรณ์มือถือที่มี Android และ iOS หรือไม่? - person Skylin R; 16.10.2019
comment
ใช่ ฉันทดสอบแล้ว ใช้งานได้กับทุกอุปกรณ์และแพลตฟอร์ม - person kamiyar; 17.10.2019
comment
คุณอ่านคำถามแล้วหรือยัง? มันบอกตรงนี้ว่าไม่เพียงพอ เอกสารระบุว่านี่เป็นเพียงการแนะนำว่ามีเครือข่ายที่ใช้งานได้ ไม่ใช่ว่าเครือข่ายนั้นมีการเชื่อมต่อ ตัวอย่างเช่น การเชื่อมต่อ wifi กับเราเตอร์ แต่เราเตอร์ไม่มีการเชื่อมต่อภายนอก มีแม้กระทั่งคำตอบ downvote ที่ซ้ำกัน - person user99999991; 28.07.2020
comment
Application.internetReachability ไม่ใช่สำหรับการเชื่อมต่อจริง - 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);
    }
}

เนื่องจาก WWW เลิกใช้แล้ว จึงสามารถใช้ UnityWebRequest แทนได้

person Arkar Min Tun    schedule 26.05.2020

ฉันได้สร้างไลบรารีของ Android ที่สามารถใช้เป็นปลั๊กอินของ Unity เพื่อจุดประสงค์นี้ได้ หากใครสนใจสามารถดูได้ที่ https://github.com/rixment/awu-plugin

สำหรับเวอร์ชัน iOS น่าเสียดายที่ฉันไม่มีความรู้ในด้านนี้เพียงพอ คงจะดีไม่น้อยหากมีใครสามารถขยาย repo ให้รวมเวอร์ชัน iOS ไว้ด้วย

person Eric    schedule 17.03.2020

คุณสามารถตรวจสอบการเชื่อมต่อเครือข่ายโดยใช้รหัสนี้

if(Application.internetReachability == NetworkReachability.NotReachable){
       Debug.Log("Error. Check internet connection!");
}
person Codemaker    schedule 05.04.2020
comment
ดูการตรวจสอบ conn และประเภทของมัน -› docs.unity3d.com/ScriptReference/ อย่างไรก็ตาม ในเรื่องที่เกี่ยวกับความสามารถในการเข้าถึงอินเทอร์เน็ต: อย่าใช้คุณสมบัตินี้เพื่อกำหนดการเชื่อมต่อที่แท้จริง เช่น. อุปกรณ์สามารถเชื่อมต่อกับฮอตสปอตได้ แต่ไม่มีเส้นทางจริงไปยังเครือข่าย docs.unity3d.com/ScriptReference/ - person Sergio Solorzano; 27.05.2020