Ketika saya mencoba memeriksa koneksi internet di iPhone saya, saya mendapatkan banyak kesalahan. Adakah yang bisa membantu saya untuk memperbaikinya?
Kode:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection) ? true : false
}
}
Kesalahan dengan kode:
Jika tidak dapat dibaca, kesalahan 1 mengatakan:
'Int' tidak dapat dikonversi menjadi 'SCNetworkReachabilityFlags'
Kesalahan 2 & 3:
Tidak dapat menemukan kelebihan untuk 'init' yang menerima argumen yang disediakan
ios
swift
xcode
reachability
b3rge
sumber
sumber
Jawaban:
Untuk mengatasi masalah 4G yang disebutkan dalam komentar saya telah menggunakan implementasi reachability @AshleyMills sebagai referensi dan ditulis ulang Reachability for Swift 3.1:
diperbarui: Xcode 10.1 • Swift 4 atau lebih baru
File Reachability.swift
Pemakaian
Inisialisasi dalam AppDelegate.swift Anda, didFinishLaunchingWithOptions, dan tangani kesalahan yang mungkin terjadi:
Dan contoh view controller:
Proyek Sampel
sumber
if SCNetworkReachabilityGetFlags(…)
as xCode mengembalikan Bool di dalamnya versi terbaru.Untuk Swift 3, Swift 4 (bekerja dengan seluler dan Wi-Fi):
Pemakaian:
sumber
Buat file Swift baru dalam proyek Anda, beri nama
Reachability.swift
. Potong & rekatkan kode berikut ke dalamnya untuk membuat kelas Anda.Anda dapat memeriksa koneksi internet di mana saja di proyek Anda menggunakan kode ini:
Jika pengguna tidak terhubung ke internet, Anda mungkin ingin menunjukkan kepada mereka dialog peringatan untuk memberi tahu mereka.
Penjelasan:
Kami membuat kelas publik yang dapat digunakan kembali dan metode yang dapat digunakan di mana saja dalam proyek untuk memeriksa konektivitas internet. Kami perlu menambahkan kerangka kerja Foundation dan Konfigurasi Sistem.
Di Reachability kelas publik, metode ini
isConnectedToNetwork() -> Bool { }
akan mengembalikan nilai bool tentang konektivitas internet. Kami menggunakan loop jika untuk melakukan tindakan yang diperlukan pada kasus. Saya harap ini cukup. Bersulang!sumber
Jika seseorang sudah menggunakan Alamofire maka -
Pemakaian:
sumber
Saya telah memeriksa penerapan kelas Reachability Ashley Mill tanpa Cocoa Pods / Dependancy Manager. Idenya adalah untuk membuat ketergantungan Reachability gratis di proyek.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . Unduh, tambahkan kelas Reachability ke proyek.
Catatan: Saat menambahkan, pastikan 'salin item jika perlu' dicentang.
2) Buat kelas AppManager.swift. Kelas ini akan menjadi kelas Model Publik di mana metode & data publik akan ditambahkan dan dapat digunakan dalam VC apa pun.
3) Buat Kelas Delegasi. Saya menggunakan metode delegasi untuk memberi tahu status konektivitas.
4) Buat kelas Induk UIViewController (Metode pewarisan). Kelas induk memiliki metode yang dapat diakses semua VC anak.
5) Mulai Pemantauan Konektivitas Internet waktu nyata di AppDelegate.
6) Saya telah menambahkan AppReference Nama File Swift untuk menyimpan nilai enum konstan.
7) Pada ViewController (mis. Anda ingin memanggil API hanya jika jaringan tersedia)
Sampel dapat diunduh @ https://github.com/alvinreuben/Reachability-Sample
Ditingkatkan ke Swift 3.1- https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
sumber
Apple telah memperkenalkan Kerangka Jaringan di iOS12.
sumber
pathUpdateHandler
akan memperkenalkan referensi yang kuat denganself
, tambahkan[weak self]
untuk menyelesaikannya :)Gunakan ini untuk Swift-5 +
Pemakaian:
Atau Cukup gunakan ini
framework
untuk lebih banyakUtilities
: Tautansumber
Baru tahu ini sendiri.
Xcode: 7.3.1, iOS 9.3.3
Menggunakan ashleymills / Reachability.swift sebagai Reachability.swift di proyek saya, saya membuat fungsi berikut:
Cukup telepon di
hasConnectivity()
mana pun Anda perlu memeriksa koneksi. Ini berfungsi untuk Wifi dan juga Seluler.Menambahkan Reachability.shift ashleymills sehingga orang tidak perlu berpindah antar situs:
sumber
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
kelet reachability: Reachability = try Reachability()!
Meskipun tidak langsung menjawab pertanyaan Anda, saya ingin menyebutkan Apple baru-baru ini berbicara:
https://developer.apple.com/videos/play/wwdc2018/714/
Sekitar pukul 09.55 dia berbicara tentang melakukan hal ini yang Anda tanyakan:
Namun, ini memiliki beberapa jebakan:
Poin-poin berikut adalah beberapa praktik terbaik menurut Apple:
waitsForConnectivity
ke true ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Ini adalah cara yang disarankan Apple untuk memeriksa konektivitas, sebagaimana disebutkan dalam video di 33:25.Menurut ceramah, seharusnya tidak ada alasan untuk melakukan pra-cek di mana pun Anda mendapat koneksi internet atau tidak, karena itu mungkin tidak akurat pada saat Anda mengirim permintaan Anda ke server .
sumber
Saya telah membuat solusi sendiri menggunakan NSTimer dan Alamofire:
NSTimer digunakan sebagai batas waktu, dan digunakan karena hasil yang tidak dapat diandalkan menggunakan batas waktu Alamofire. Permintaan harus dibuat untuk URL yang Anda percaya dapat diandalkan, seperti server Anda sendiri atau server yang menjadi tuan rumah layanan yang Anda andalkan.
Ketika penghitung waktu berakhir, permintaan dibatalkan dan hasilnya dikembalikan menggunakan pengendali penyelesaian.
Pemakaian:
sumber
requestTimeout()
akan dipanggil setelah batas waktu yang ditentukan tercapaiJika Anda menggunakan Alamofire, Anda dapat melakukan sesuatu seperti ini:
sumber
Cepat 5
Dalam metode apa pun gunakan kondisi di bawah ini
sumber
disini solusi saya untuk swift 2.3 dengan lib ( Reachability.swift )
Pergilah ke Anda
Podfile
dan tambahkan:Kemudian ke Anda
terminal
:Kemudian buat file baru
ReachabilityManager
dan tambahkan kode di bawah ini:Bagaimana cara menggunakannya:
buka Anda
AppDelegate.swift
dan tambahkan kode di bawah ini:Kemudian ketika Anda ingin memeriksa apakah perangkat terhubung ke internet lakukan:
sumber
Walaupun mungkin tidak secara langsung menentukan apakah ponsel terhubung ke jaringan, solusi paling sederhana (, terbersih?) Adalah 'ping' Google, atau server lain, (yang tidak mungkin kecuali telepon terhubung ke jaringan ):
Jika Anda khawatir server mungkin turun atau memblokir IP Anda, Anda selalu dapat melakukan ping ke beberapa server dengan cara yang sama dan mengembalikan apakah salah satu dari mereka dapat dijangkau. Atau suruh seseorang membuat server khusus untuk tujuan ini.
sumber
Dengan bantuan kode di bawah ini Anda dapat memeriksa Koneksi internet untuk jaringan seluler maupun wifi. bahasa - Swift 3.0
sumber
Untuk swift 3, saya tidak bisa menggunakan jangkauan hanya dari solusi RAJAMOHAN-S karena mengembalikan "benar" jika ada WiFi tetapi tidak ada Internet. Jadi, saya menerapkan validasi kedua melalui kelas URLSession dan penangan penyelesaian.
Ini seluruh kelas.
Dan Anda menyebutnya seperti ini, misalnya:
sumber
Ini versi saya. Pada dasarnya itu tidak membawa sesuatu yang baru. Saya mengikatnya ke UIDevice.
sumber
Sekarang panggil saja
sumber