Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.7k kez görüntülendi
ios development kategorisinde tarafından

Merhabalar,

Kucuk bir webview uygulamasi hazirliyorum uygulamada "reachability" kutuphanesi ile internet baglantisi var mi diye kontrol ediyorum. Buraya kadar herhangi bir problemim yok ancak; kullanici mobil internet yada wifi baglantisini acinca uygulamayi yenileyemiyorum ya da internet baglantisi aktif oldugunda uygulama yeniden baglantiya gecmeyi denemiyor. Bu senaryolara uygun nasil bir cozum bulmaliyim? Internet baglantisi aktif hale geldiginde nasil uygulama bundan haberdar olacak yada kendini yenileyecek? bilgisi ya da cozum fikri olan arkadaslar yardimci olursa cok sevinirim.

3 Cevaplar

0 oy
tarafından

Daha önce denemedim, ilgili kütüphaneyi çok defa görsemde tam olarak kullanmadım ama aklıma şöyle bir yol geliyor.

Bağlantı koptuğunda NSTimer ile her saniye çalışan bir interval oluşturusun zaten asenkron çalışacağı için çok sorun olmayacaktır diye düşünüyorum. Bu interval bağlantı koptıuktan sonraki her saniye bağantı geldimi diye kontrol eder, geldiğini anladığında interval i temizleyip durudur. Daha sonrada hangi işlemi yapmasını istiyorsan onu yapar.

Tabi bu test etmediğim bir öneri sadece, daha iyi fikri olan arkadaşları bekleriz.

İyi çalışmalar.

0 oy
tarafından

ben mi soruyu tam anlayamadım yoksa istedğiniz bu mu bilemiyorum ama,
reachability zaten network status değişikliklerine göre notification tetikleyebiliyor.

import UIKit

class ViewController: UIViewController {

    var internetReachability:Reachability?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.internetReachability = Reachability.reachabilityForInternetConnection()
        self.internetReachability!.startNotifier()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.reachabilityChanged(_:)), name: kReachabilityChangedNotification, object: nil)
    }

    func reachabilityChanged(note:NSNotification) {
        switch self.internetReachability!.currentReachabilityStatus().rawValue {
        case 0:
            print("NotReachable")
        case 1:
            print("ReachableViaWiFi")
        case 2:
            print("ReachableViaWWAN")
        default:
            break
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
tarafından
Sorum en yalın haliyle "internet baglantisi olmadiginda uyari verdik. ardindan kullanici wifi yada 3g baglantisini acti ve internete baglandi. Sonrasinda uygulama internetin aktif oldugu anlayip yeniden islem yapmaya baslayacak? "  yukaridaki kod blogu benim kullandigim reachability sinifinda hatalar verdi. benim kulladigim reachability sinifi asagidaki kadar sorun reachability'de de olabilirmi acaba?

import Foundation
import SystemConfiguration

public class Reachability {
    
    class func isConnectedToNetwork() -> Bool {
        
        var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
        
        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
        }
        
        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }
        
        let isReachable = flags == .Reachable
        let needsConnection = flags == .ConnectionRequired
        
        return isReachable && !needsConnection
        
    }
}
tarafından
+1
bu şekilde bağlantı durumunu sadece on demand kontrol edebilirsiniz. değişiklik olduğunda bir aksiyonun tetiklenmesini istiyorsanız ya kReachabilityChangedNotification key'ini observe etmeli, ya da KVO kullanmalısınız.
0 oy
tarafından

Merhaba,
Yasin üstadım sorunun çözümünü özetlemiş. Sizin yapmanız gereken, AppDelegate içerisinde ReachabilityChangedNotification'i tetiklemek. Şurada bir örnek var. Fikir verir kurulum ile ilgili:

https://github.com/Viniciuscarvalho/recrutamento-ios/blob/931d00638df82d9a62f875d7a1ff639edcd1bc44/recrutamento-ios/AppDelegate.swift

Not: Yasin üstadım öncelikle merhaba. Uzun süre yoktun buralarda. Mail de yazdım cevap gelmeyince merak ettim. İnşaAllah bir yaramazlık yoktur.

tarafından
hocam merhaba tesekkur ederim oncelikle vakit ayirip yazdiginzi icin.
verdiginiz likteki kod blogunu ve Yasin bey'in anlattigi yolu izledim ancak sonuca ulasamadim. Temelde yapmak istedigim sey asagidaki totorialda var ama bu yontem dahi calismiyor. Sonuca bir turlu ulasamadim maalesef.
https://www.youtube.com/watch?v=kjyGuTWHmlg
tarafından
Estağfurullah hoca değil henüz acemiyiz :)
Projenizde kurduğunuz yapıyı tam olarak bilmemekle birlikte. Aklıma şu geliyor ilk etapta:
Gerçek cihazda mı test ediyorsunuz? Yoksa simulatörde mi?
Bir de projenizde nasıl bir kurulum yapıyorsanız, en basit olarak yeni bir proje açın ve sadece bu kurulumunuzu içeren haliyle yükleyin. Daha iyi yorum yapabiliriz böylece.
tarafından
Projeyi cihazda ve simulatorde test ediyorum. linteki tutorial'i birebir uyguladim. reachability kutuphanesi videonun yayinlanma tarihinden bu zaman degisikliklere ugramis. guncel kutuphane uzerinden cozume ulasmam gerekiyor.  Şoyle bir reachability ile sorgulamayi yapiyorum;
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()
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
            return false
        }
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        return (isReachable && !needsConnection)
    }
}

ve Viewcontroller'da asagidaki gibi baglanti yoksa uari verebiliyorum ama internet aktif olduktan sonra herhangi bir yenileme yapamiyorum;

        if Reachability.isConnectedToNetwork() == true {
            
            print("Internet connection OK")
            
        } else { //internet yoksa uyari verilir.
            
            print("İnternet Bağlantı Hatası")
            let alert = UIAlertView(title: "İnternet Bağlantısı Yok!", message: "Lütfen cihazınızın internet bağlantısını kontrol edin.", delegate: nil, cancelButtonTitle: "Tamam")
            alert.show()
            
        }
tarafından
Ben bunu kullanıyorum mesela. Gayet güzel çalışıyor.  Bunu deneyin bir de.
https://github.com/liufan321/NetReachability
...