Saya tahu pertanyaan ini akan tampak seperti penipuan banyak orang lain, namun, saya tidak merasa kasus sederhana dijelaskan dengan baik di sini. Berasal dari latar belakang Android dan BlackBerry, membuat permintaan HTTPUrlConnection
gagal secara instan jika tidak ada koneksi. Ini sepertinya perilaku yang benar-benar waras, dan saya terkejut menemukan NSURLConnection
di iOS tidak meniru itu.
Saya mengerti bahwa Apple (dan lainnya yang telah memperpanjangnya) menyediakan Reachability
kelas untuk membantu menentukan keadaan jaringan. Saya senang untuk pertama kali melihat ini dan sepenuhnya diharapkan untuk melihat sesuatu seperti bool isNetworkAvailable()
, tetapi saya terkejut menemukan sistem yang rumit yang membutuhkan pendaftaran notifikasi dan panggilan balik, dan banyak detail yang tampaknya tidak perlu. Pasti ada cara yang lebih baik.
Aplikasi saya sudah dengan anggun menangani kegagalan koneksi, termasuk tidak ada konektivitas. Pengguna diberitahu tentang kegagalan, dan aplikasi bergerak.
Jadi persyaratan saya sederhana: Satu, fungsi sinkron yang bisa saya panggil sebelum semua permintaan HTTP untuk menentukan apakah saya benar-benar harus mengirim permintaan atau tidak. Idealnya tidak memerlukan pengaturan dan hanya mengembalikan boolean.
Apakah ini benar-benar tidak mungkin di iOS?
sumber
Jawaban:
Saya melakukan sedikit riset lebih lanjut dan saya memperbarui jawaban saya dengan solusi yang lebih terkini. Saya tidak yakin apakah Anda sudah melihatnya tetapi ada contoh kode yang disediakan oleh Apple.
Unduh kode sampel di sini
Sertakan file Reachability.h dan Reachability.m dalam proyek Anda. Lihatlah ReachabilityAppDelegate.m untuk melihat contoh tentang cara menentukan jangkauan host, jangkauan dengan WiFi, oleh WWAN, dll. Untuk pemeriksaan jangkauan jaringan yang sangat sederhana, Anda dapat melakukan sesuatu seperti ini
@ BenjaminPiette's: Jangan lupa menambahkan SystemConfiguration.framework ke proyek Anda.
sumber
Melihat utas ini adalah hasil google teratas untuk jenis pertanyaan ini, saya pikir saya akan memberikan solusi yang bekerja untuk saya. Saya sudah menggunakan AFNetworking , tetapi pencarian tidak mengungkapkan bagaimana menyelesaikan tugas ini dengan AFNetworking hingga pertengahan proyek saya.
Yang Anda inginkan adalah Manajer AFNetworkingReachability .
Anda juga dapat menggunakan yang berikut ini untuk menguji jangkauan secara sinkron (setelah pemantauan dimulai):
sumber
AFNetworkReachabilityManager
dalam cahaya!AFNetworkReachabilityManager.reachable
TIDAK melakukan segala jenis pemeriksaan sinkron. Ini mengembalikan logika ataureachableViaWWAN
danreachableViaWifi
.Maaf sudah terlambat menjawab, tapi saya harap jawaban ini dapat membantu seseorang di masa depan.
Berikut ini adalah cuplikan kode C kecil asli yang dapat memeriksa konektivitas internet tanpa kelas tambahan.
Tambahkan tajuk berikut:
Kode:
Cepat 3
sumber
Saat ini saya menggunakan metode sinkron sederhana ini yang tidak memerlukan file tambahan dalam proyek atau delegasi Anda.
Impor:
Buat metode ini:
Kemudian, jika Anda memasukkan ini ke
MyNetworkClass
:Jika Anda menguji dalam simulator, nyalakan dan matikan wifi Mac Anda, karena tampaknya simulator akan mengabaikan pengaturan ponsel.
Memperbarui:
Pada akhirnya saya menggunakan utas / asinkron panggilan balik untuk menghindari pemblokiran utas utama; dan secara teratur menguji ulang sehingga saya bisa menggunakan hasil cache - meskipun Anda harus menghindari menjaga koneksi data tetap terbuka.
Seperti yang dijelaskan oleh @thunk, ada URL yang lebih baik untuk digunakan, yang digunakan oleh Apple sendiri. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
sumber
www.apple.com
adalah situs web besar ... pilihan yang lebih baik adalahwww.google.com
www.appleiphonecell.com
seharusnya tersedia hanya untuk tujuan ini dan tampaknya tidak diblokir di Cina.Itu mungkin dan sangat sederhana jika Anda melihatnya ketika menyelesaikan implementasi, yang sekali lagi - sangat sederhana, karena satu-satunya item yang Anda butuhkan adalah dua variabel boolean: jangkauan internet dan jangkauan host (Anda sering membutuhkan lebih dari satu di antaranya) ). Setelah Anda merakit kelas pembantu Anda yang dapat menentukan status koneksi, Anda benar-benar tidak peduli lagi dengan implementasi yang diperlukan untuk mengetahui prosedur ini.
Contoh:
Dan file .m:
sumber
Seseorang telah memecahkan ini dengan cara yang sederhana dan dapat digunakan kembali sebelumnya.
DDGReachability
.EDIT: Atau
tonymillion/Reachability
.sumber
Saya mengekstrak kode dan memasukkan ke dalam satu metode tunggal, berharap itu akan membantu orang lain.
...
sumber
Saya menulis versi cepat dari jawaban yang diterima di sini , jika seseorang merasa bermanfaat, kode ini ditulis dengan cepat 2,
Anda dapat mengunduh file yang diperlukan dari SampleCode
Tambahkan
Reachability.h
danReachability.m
ajukan ke proyek Anda,Sekarang orang perlu membuat
Bridging-Header.h
file jika tidak ada untuk proyek Anda,Di dalam
Bridging-Header.h
file Anda tambahkan baris ini:Sekarang untuk memeriksa Koneksi Internet
sumber
Saya pikir ini bisa membantu ..
sumber
Anda juga dapat mencoba yang ini jika Anda sudah mengkonfigurasi AFNetworking di proyek Anda.
sumber
Berikut adalah solusi yang bagus untuk memeriksa konektivitas menggunakan Swift, tanpa menggunakan Reachability. Saya menemukannya di blog ini .
Buat file Swift baru di proyek Anda yang disebut
Network.swift
(misalnya). Rekatkan kode ini di dalam file itu:Anda kemudian dapat memeriksa konektivitas di mana saja di proyek Anda dengan menggunakan:
sumber
EDIT: Ini tidak akan berfungsi untuk URL jaringan (lihat komentar)
Pada iOS 5, ada metode instance NSURL baru:
Arahkan ke situs web yang Anda pedulikan atau arahkan ke apple.com; Saya pikir ini adalah panggilan satu saluran baru untuk melihat apakah internet berfungsi pada perangkat Anda.
sumber
Saya juga tidak senang dengan opsi pemeriksaan Internet yang tersedia (Mengapa ini bukan API asli?!?!)
Masalah saya sendiri adalah dengan hilangnya paket 100% - ketika perangkat terhubung ke router, tetapi router tidak terhubung ke Internet. Reachability dan lainnya akan bertahan lama. Saya membuat kelas utilitas tunggal untuk mengatasinya dengan menambahkan batas waktu asynch. Ini berfungsi dengan baik di aplikasi saya. Semoga ini bisa membantu. Inilah tautan di github:
https://github.com/fareast555/TFInternetChecker
sumber
Memeriksa ketersediaan koneksi Internet di (iOS) Xcode 8.2, Swift 3.0
sumber
Penggantian untuk Reachability Apple ditulis ulang dalam Swift dengan penutup , terinspirasi oleh tonymillion: https://github.com/ashleymills/Reachability.swift
Letakkan file
Reachability.swift
ke proyek Anda. Atau, gunakan CocoaPods atau Carthage - Lihat bagian Instalasi README proyek.Dapatkan pemberitahuan tentang konektivitas jaringan:
dan untuk menghentikan notifikasi
sumber
Alamofire
Jika Anda sudah menggunakan Alamofire untuk semua RESTful Api, inilah yang dapat Anda manfaatkan dari itu.
Anda dapat menambahkan kelas berikut ke aplikasi Anda, dan menelepon
MNNetworkUtils.main.isConnected()
untuk mendapatkan boolean pada apakah itu terhubung atau tidak.Ini adalah kelas tunggal. Setiap kali, ketika pengguna menghubungkan atau memutuskan jaringan, itu akan menimpa
self.reachable
benar / salah dengan benar, karena kita mulai mendengarkanNetworkReachabilityManager
inisialisasi on singleton.Juga untuk memantau jangkauan, Anda perlu menyediakan host, saat ini saya menggunakan
google.com
ragu untuk mengubah ke host lain atau salah satu dari Anda jika diperlukan.sumber