2016-05-11 1 views
0

Есть ли способ в Swift, что AFNetworking достижимости будет постоянно проверять подключение к Интернету каждый второй, до сих пор это то, что у меня есть, и это только проверить только один раз:AFNetworking достижимости менеджер в Swift

override func viewDidLoad() { 
AFNetworkReachabilityManager.sharedManager().startMonitoring() 
     AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock{(status: AFNetworkReachabilityStatus?) in 
      switch status!.hashValue { 
      case AFNetworkReachabilityStatus.NotReachable.hashValue: 

       print("no internet") 
      case AFNetworkReachabilityStatus.ReachableViaWiFi.hashValue,AFNetworkReachabilityStatus.ReachableViaWWAN.hashValue: 

       print("with internet") 

      default: 
       print("unknown") 
      } 
     } 
} 

Как постоянно проверять интернет-соединение?

+0

Проверьте подключение к Интернету, когда вы вызываете API, другие пожелания, которые вам не нужны. –

+0

Вы можете добавить наблюдателя. –

+0

@RichardG - я добавил наблюдателя, но я не включил его, но все же он проверяет только один раз. –

ответ

1

Вы не должны проверять возможность повторного использования на каждую минуту или периодически. Это не хорошая практика, это снижает производительность приложения.

Вы можете получать уведомления об изменении характеристик. поэтому, когда rechabilty изменение, которое вы можете выполнить задачу

Вы можете сделать что-то вроде этого,

Вы должны создать Reachability объект, прежде чем вы можете получать уведомления от него. Кроме того, обязательно вызовите метод startNotifier() на созданном вами объекте Reachability. Это будет примером того, как сделать это внутри ваше приложение делегата:

class AppDelegate: UIResponder, UIApplicationDelegate 
{ 
private var reachability:Reachability!; 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool 
{ 
    NSNotificationCenter.defaultCenter().addObserver(self, selector:"checkForReachability:", name: kReachabilityChangedNotification, object: nil); 

    self.reachability = Reachability.reachabilityForInternetConnection(); 
    self.reachability.startNotifier(); 
} 

func checkForReachability(notification:NSNotification) 
{ 
    // Remove the next two lines of code. You cannot instantiate the object 
    // you want to receive notifications from inside of the notification 
    // handler that is meant for the notifications it emits. 

    //var networkReachability = Reachability.reachabilityForInternetConnection() 
    //networkReachability.startNotifier() 

    let networkReachability = notification.object as Reachability; 
    var remoteHostStatus = networkReachability.currentReachabilityStatus() 

    if (remoteHostStatus.value == NotReachable.value) 
    { 
     println("Not Reachable") 
    } 
    else if (remoteHostStatus.value == ReachableViaWiFi.value) 
    { 
     println("Reachable via Wifi") 
    } 
    else 
    { 
     println("Reachable") 
    } 
} 
} 

Вы можете скачать класс достижимости из Apple Documentation

Надеется, что это поможет :)

0
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

// internetReachable is declared as property. 
internetReachable = [Reachability reachabilityForInternetConnection]; 
[internetReachable startNotifier]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; 

} 

- (void)checkNetworkStatus:(NSNotification *)notice { 
// called when network status is changed 

NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
switch (internetStatus) 
{ 
    case NotReachable: 
    { 
     NSLog(@"The internet is down."); 
     break; 
    } 
    case ReachableViaWiFi: 
    { 
     NSLog(@"The internet is Connected."); 
     break; 
    } 
    case ReachableViaWWAN: 
    { 
     NSLog(@"The internet is working via WWAN!"); 
     break; 
    } 

    } 


//#import "Reachability.m" 

static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) 
{ 
#pragma unused (target, flags) 
NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback"); 
NSCAssert([(__bridge NSObject*) info isKindOfClass: [Reachability class]], @"info was wrong class in ReachabilityCallback"); 

Reachability* noteObject = (__bridge Reachability *)info; 
// Post a notification to notify the client that the network reachability changed. 
[[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject]; 
} 
0

Вы можете использовать - https://github.com/ashleymills/Reachability.swift

//declare this inside of viewWillAppear 
do { 
    reachability = try Reachability.reachabilityForInternetConnection() 
} catch { 
    print("Unable to create Reachability") 
    return 
} 

NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:",name: ReachabilityChangedNotification,object: reachability) 
do{ 
    try reachability?.startNotifier() 
    }catch{ 
     print("could not start reachability notifier") 
    } 

//declare this inside of viewWillDisappear 
reachability!.stopNotifier() 
NSNotificationCenter.defaultCenter().removeObserver(self, 
     name: ReachabilityChangedNotification, 
     object: reachability) 


func reachabilityChanged(note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.isReachable() { 

     print("NETWORK REACHABLE.") 
    } 
    if reachability.isReachableViaWiFi() 
    { 
     print("NETWORK REACHABLE VIA WIFI.") 
    } 
    if reachability.isReachableViaWWAN() 
    { 
     print("NETWORK REACHABLE VIA WWAN.") 
    } 
    else { 
     print("NETWORK NOT REACHABLE.") 

    } 
} 
+0

Вы пробовали это решение? – Hasya

3

AFNetworking Rea chability делает Постоянно проверяйте соединение, я использую его, если некоторые из моих приложений и он хорошо выполняет эту работу. Если ваш код не работает, я считаю, что это может быть потому, что вы вызываете startMonitoring перед установкой обработчика с setReachabilityStatusChangeBlock, чтобы вы могли пропустить начальное событие. Кроме того, не связанный с вашей проблемой, но улучшение, которое вы можете сделать, вам не нужно использовать hashValue в инструкции switch, вы можете напрямую использовать status, и вы получаете преимущество проверки компилятора Swift для завершения операторов case , Вкратце, попробуйте следующую версию вашего кода и посмотрите, работает ли она:

AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock { (status: AFNetworkReachabilityStatus) -> Void in 
     switch status { 
     case .NotReachable: 
      print("Not reachable") 
     case .ReachableViaWiFi, .ReachableViaWWAN: 
      print("Reachable") 
     case .Unknown: 
      print("Unknown") 
     } 

    } 
    AFNetworkReachabilityManager.sharedManager().startMonitoring() 
+0

он все еще на проверке один раз.Я положил его на appDelegate didFinishLaunchingWithOptions –

+0

@SydneyLoteria Это так странно, что он не работает для вас ... Он работает для меня, настраивая его в 'didFinishLaunchingWithOptions', вот небольшой проект, который я только что сделал, чтобы вы могли проверить: https : //github.com/lrmunoz/SwiftCodeSamples/tree/master/ReachabilityTest – Luis

+0

@SydneyLoteria Теперь я нахожусь в том, что вы хотите, чтобы вы его проверяли каждую секунду, а не в каждом изменении состояния (т. е. из соединения -> без соединения) ? Так что вы хотите, если всегда есть возможность подключения, печатать каждую секунду: «с Интернетом», «с Интернетом», ...? Это просто не работает, вы получите уведомление только в случае изменения состояния. И я не думаю, что вам нужно, чтобы он так себя вел, просто сохраните последний оповещенный статус и проверьте его, когда вам это нужно. – Luis

0

Также для моих собственных целей архивирования. Вы можете использовать это, как подсказывает @Lion в его/ее ответе.

Просто позвоните Reachability.registerListener() внутри сделалFinishLaunchingWithOptions в AppDelegate.swift. Он автоматически сообщит вам об изменениях.

// 
// CheckInternet.swift 
// 
// Created by Dincer on 14/11/15. 
// 

import AFNetworking 

public class Reachability { 
    private static let theSharedInstance:Reachability = Reachability(); 
    private var isClientOnline:Bool = true; 
    private var isClientWiFi:Bool = false; 
    private var isClientConnectionUnknown = false; 

    func onOnline() { 
     print("****************************************** Network goes online."); 
    } 

    func onOffline() { 
     print("****************************************** Network goes offline."); 
    } 

    func onWiFi() { 
     print("****************************************** Wifi network on"); 
    } 

    func onGSM() { 
     print("****************************************** GSM network on"); 
    } 

    func onUnknownConnectionStatus() { 
     print("****************************************** Unkown network status"); 
    } 

    func isConnectedToNetwork() -> Bool { 
     return isClientOnline; 
    } 

    func isConnectedToWiFi() -> Bool { 
     return isClientOnline && isClientWiFi; 
    } 

    static func sharedInstance() -> Reachability { 
     return Reachability.theSharedInstance; 
    } 

    static func registerListener() { 
     sharedInstance().registerListener(); 
    } 

    func registerListener() { 
     AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock { (status: AFNetworkReachabilityStatus) -> Void in 
      switch status { 
       case .NotReachable: 
        self.isClientConnectionUnknown = false; 

        if self.isClientOnline { 
         self.isClientOnline = false; 
         self.onOffline(); 
        } 
       case .ReachableViaWiFi: 
        self.isClientConnectionUnknown = false; 

        if !self.isClientOnline { 
         self.isClientOnline = true; 
         self.onOnline(); 
        } 

        if !self.isClientWiFi { 
         self.isClientWiFi = true; 
         self.onWiFi(); 
        } 
       case .ReachableViaWWAN: 
        self.isClientConnectionUnknown = false; 

        if !self.isClientOnline { 
         self.isClientOnline = true; 
         self.onOnline(); 
        } 

        if self.isClientWiFi { 
         self.isClientWiFi = false; 
         self.onGSM(); 
        } 
       case .Unknown: 
        if !self.isClientConnectionUnknown { 
         self.isClientConnectionUnknown = true; 
         self.onUnknownConnectionStatus(); 
        } 
      } 
     } 

     AFNetworkReachabilityManager.sharedManager().startMonitoring(); 
    } 

} 
Смежные вопросы