iOS에서 인터넷 연결을 감지하는 가장 쉬운 방법은 무엇입니까?


147

나는이 질문이 다른 많은 사람들의 속임수 인 것처럼 보이지만 간단한 사례가 여기에 잘 설명되어 있다고 생각하지 않습니다. HTTPUrlConnection사용 가능한 연결이없는 경우 Android 및 BlackBerry 배경에서 가져와 요청을 즉시 실패하게합니다. 이것은 완전히 제정신의 행동처럼 보이고, NSURLConnectioniOS에서 그것을 모방하지 않았다는 사실에 놀랐 습니다.

Apple (및 Apple을 확장 한 다른 사람들) Reachability은 네트워크 상태를 결정하는 데 도움이 되는 수업을 제공한다는 것을 이해합니다 . 나는 이것을 처음으로보고 기뻤고와 같은 것을 완전히 기대 bool isNetworkAvailable()했지만 놀랍게도 알림 등록 및 콜백이 필요한 복잡한 시스템과 불필요한 것으로 보이는 세부 정보가 필요했습니다. 더 좋은 방법이 있어야합니다.

내 앱은 이미 연결되지 않은 것을 포함하여 연결 실패를 정상적으로 처리합니다. 사용자에게 실패 알림이 표시되고 앱이 계속 진행됩니다.

따라서 내 요구 사항은 간단합니다. 단일 동기 함수 모든 HTTP 요청 전에 호출하여 실제로 요청을 보내는 것을 방해해야하는지 여부를 결정할 수 있습니다. 이상적으로는 설정이 필요 없으며 부울 만 반환합니다.

iOS에서는 이것이 실제로 불가능합니까?



모든 HTTP 요청 전에 동기식 네트워크 도달 가능성 메소드를 호출해서는 안됩니다. 도달 가능성이 비동기 적으로 네트워크 조건에 변화가 있음을 알리지 않고 HTTP 요청을 보내지 않도록 선택할 수 없다면, 그 일을하는 것은 미친 일입니다. 이것이 또한 타임 아웃이 존재하는 전체 이유이기도합니다 (그런 다음 해당 시나리오를 정상적으로 처리해야합니다). 비동기 방식에 대한 위의 링크를 참조
iwasrobbed

답변:


251

좀 더 연구를하고 더 최신 솔루션으로 답변을 업데이트하고 있습니다. 이미 살펴 보았는지 확실하지 않지만 Apple에서 제공하는 멋진 샘플 코드가 있습니다.

여기 에서 샘플 코드를 다운로드 하십시오

프로젝트에 Reachability.h 및 Reachability.m 파일을 포함하십시오. ReachabilityAppDelegate.m에서 호스트 도달 가능성, WiFi를 통한 도달 가능성, WWAN 등을 확인하는 방법에 대한 예를 살펴보십시오. 네트워크 연결 가능성을 간단히 확인하려면 다음과 같은 작업을 수행 할 수 있습니다.

Reachability *networkReachability = [Reachability reachabilityForInternetConnection];   
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];    
if (networkStatus == NotReachable) {        
    NSLog(@"There IS NO internet connection");        
} else {        
     NSLog(@"There IS internet connection");        
}

@ BenjaminPiette 's : 프로젝트에 SystemConfiguration.framework를 추가하는 것을 잊지 마십시오.


46
SystemConfiguration.framework를 프로젝트에 추가하는 것을 잊지 마십시오.
Benjamin Piette

1
@chandru 작동합니다. 이것은 네트워크 연결을 감지하는 가장 쉽고 효과적인 방법입니다. 간단하고 쉬운!
S1U

3
이것에 조심하십시오. 적어도 시뮬레이터에서 네트워크가 복원되면 안정적으로 작동하지 않는 것으로 나타났습니다. Wi-Fi를 끈 상태에서 시작했는데 사용 가능한 네트워크가 없다고 올바르게보고합니다. 그러나 Wi-Fi를 다시 켜면 실제 네트워크 쿼리가 제대로 작동하더라도 SCNetworkReachabilityGetFlags는 계속 0을 반환합니다.
Joe Strout

2
나는 아래의 답변 ( stackoverflow.com/a/26593728/557362 )이 더 적은 작업 (다른 파일을 다운로드하지 않음)이 필요 하다고 생각 하지만 그것은 단지 내 의견입니다.
GilesDMiddleton

3
이것은 특정 호스트에 대한 연결이 라우팅 가능한지 여부 만 알려줍니다 . 그렇다고 실제로 연결할 수있는 것은 아닙니다. 예 : iPhone의 wifi를 카메라의 wifi에 연결합니다. Wi-Fi는 기본 게이트웨이와 연결되어 있으며 모든 호스트가 연결 가능한 것으로보고합니다. 그러나 실제로는 아닙니다. 카메라는 막 다른 연결입니다.
xaphod

45

이 스레드 가이 유형의 질문에 대한 최고의 Google 결과이므로, 나에게 맞는 솔루션을 제공 할 것이라고 생각했습니다. 이미 AFNetworking을 사용 하고 있었지만 검색 과정에서 프로젝트 중반까지 AFNetworking으로이 작업을 수행하는 방법이 밝혀지지 않았습니다.

당신이 원하는 것은 AFNetworkingReachabilityManager 입니다.

// -- Start monitoring network reachability (globally available) -- //
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));


    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            // -- Reachable -- //
            NSLog(@"Reachable");
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            // -- Not reachable -- //
            NSLog(@"Not Reachable");
            break;
    }

}];

다음을 사용하여 도달 가능성을 동 기적으로 테스트 할 수도 있습니다 (한 번 모니터링이 시작된 경우).

-(BOOL) isInternetReachable
{
    return [AFNetworkReachabilityManager sharedManager].reachable;
}

3
나는 AFNetworkReachabilityManager빛 을 가져 오는 것에 대해 공감했다 !
Selvin

이것이 명백하지 않은 사람들을 위해 : AFNetworking은 타사 라이브러리입니다.
arlomedia

1
네트워크 연결성은 요청이 실패한 이유를 이해하는 데 사용할 수있는 진단 도구입니다. 요청 여부를 결정하는 데 사용해서는 안됩니다. -이것이 바로 문서입니다.
Nosov Pavel

AFNetworkReachabilityManager.reachable모든 종류의 동기 검사를 수행하지 않습니다. 그것은 논리적 또는의 반환 reachableViaWWANreachableViaWifi.
jdolan

40

너무 늦게 답변 해 주셔서 죄송하지만이 답변이 향후 누군가에게 도움이 되었기를 바랍니다.

다음은 추가 클래스없이 인터넷 연결을 확인할 수있는 작은 네이티브 C 코드 스 니펫입니다.

다음 헤더를 추가하십시오.

#include<unistd.h>
#include<netdb.h>

암호:

-(BOOL)isNetworkAvailable
{
    char *hostname;
    struct hostent *hostinfo;
    hostname = "google.com";
    hostinfo = gethostbyname (hostname);
    if (hostinfo == NULL){
        NSLog(@"-> no connection!\n");
        return NO;
    }
    else{
        NSLog(@"-> connection established!\n");
        return YES;
    }
}

스위프트 3

func isConnectedToInternet() -> Bool {
    let hostname = "google.com"
    //let hostinfo = gethostbyname(hostname)
    let hostinfo = gethostbyname2(hostname, AF_INET6)//AF_INET6
    if hostinfo != nil {
        return true // internet available
      }
     return false // no internet
    }

3
Apple Reachability보다 훨씬 잘 작동합니다. 그러나 문서에 따르면 gethostbyname은 더 이상 사용되지 않으며 getaddrinfo를 사용해야합니다. struct addrinfo * res = NULL; int s = getaddrinfo ( "apple.com", NULL, NULL 및 & res); bool network_ok = (s == 0 && res! = NULL); freeaddrinfo (res);
Tertium

1
인터넷 사용 가능 여부를 확인하기 위해 google.com을 사용하는 것이 일반적이지만 일부 국가에서는 인터넷 사용이 차단되어 있습니다. 더 나은 선택은 yahoo.com 또는 microsoft.com과 같이보다 "정부 친화적 인"회사의 도메인입니다.
laurent

8
@Laurent : 가장 좋은 방법은 데이터를 요청할 서버 주소를 사용하는 것입니다. 여기 google.com은 예일뿐입니다.
dispatchMain

7
이것은 단지 DNS 조회를하고 있습니까? 그렇다면 캐시 된 DNS 결과로 인해 네트워크를 사용할 수 있다고 잘못 믿게 될 수 있습니까?
Stephen Moore

2
@amar 이것을 루프에서 실행하면 무선 데이터가 소비되므로 원하지 않습니다.
의미 문제

31

현재 프로젝트 또는 대리자에 추가 파일이 필요없는이 간단한 동기 방법을 사용하고 있습니다.

수입:

#import <SystemConfiguration/SCNetworkReachability.h>

이 메소드를 작성하십시오.

+(bool)isNetworkAvailable
{
    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityRef address;
    address = SCNetworkReachabilityCreateWithName(NULL, "www.apple.com" );
    Boolean success = SCNetworkReachabilityGetFlags(address, &flags);
    CFRelease(address);

    bool canReach = success
                    && !(flags & kSCNetworkReachabilityFlagsConnectionRequired)
                    && (flags & kSCNetworkReachabilityFlagsReachable);

    return canReach;
}

그런 다음에 이것을 넣으면 MyNetworkClass:

if( [MyNetworkClass isNetworkAvailable] )
{
   // do something networky.
}

시뮬레이터에서 테스트하는 경우 Mac의 Wi-Fi를 켜거나 끄면 시뮬레이터가 전화 설정을 무시합니다.

최신 정보:

  1. 결국 메인 스레드를 차단하지 않기 위해 스레드 / 비동기 콜백을 사용했습니다. 정기적으로 다시 테스트하여 캐시 된 결과를 사용할 수 있습니다. 데이터 연결을 불필요하게 열어 두지 않아야합니다.

  2. @thunk가 설명했듯이 Apple이 사용하는 더 나은 URL을 사용할 수 있습니다. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network


1
감사합니다.이 스레드의 다른 대부분과 동일합니다. 프로젝트에 SystemConfiguration.framework를 추가하는 것을 잊지 마십시오.
eselk

1
내 Xcode 프로젝트에서 SystemConfiguration.framework를 추가 할 필요가 없었습니다. SpriteKit, UIKit, StoreKit, Foundation 및 CoreGraphics는 있지만 SystemConfiguration은 없습니다. 암시 적 포함이 있습니까?
GilesDMiddleton

3
이것은 나를 위해 일했지만 인터넷에 연결되지 않은 Wi-Fi 네트워크에 연결할 때 실행하면 약 30 초 동안 UI가 잠겼습니다. 이 상황에서는 비동기 방식이 필요합니다.
arlomedia

2
www.apple.com큰 웹 사이트입니다 ... 더 좋은 옵션이 될 것입니다www.google.com
파힘 Parkar

2
훌륭한 답변! 한 가지 제안 : 테스트 URL www.appleiphonecell.com은이 목적으로 만 사용할 수 있으며 중국에서는 차단되지 않는 것으로 보입니다.
썽크

11

구현이 끝났을 때 살펴보면 정말 간단합니다. 다시 한 번, 매우 간단합니다. 필요한 유일한 항목은 두 가지 부울 변수뿐입니다. 인터넷 연결성과 호스트 연결성 ). 연결 상태를 결정할 수있는 도우미 클래스를 구성한 후에는 이러한 절차를 알기 위해 필요한 구현을 다시 신경 쓰지 않아도됩니다.

예:

#import <Foundation/Foundation.h>

@class Reachability;

@interface ConnectionManager : NSObject {
    Reachability *internetReachable;
    Reachability *hostReachable;
}

@property BOOL internetActive;
@property BOOL hostActive;

- (void) checkNetworkStatus:(NSNotification *)notice;

@end

그리고 .m 파일 :

#import "ConnectionManager.h"
#import "Reachability.h"

@implementation ConnectionManager
@synthesize internetActive, hostActive;

-(id)init {
    self = [super init];
    if(self) {

    }
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

    hostReachable = [[Reachability reachabilityWithHostName:@"www.apple.com"] retain];
    [hostReachable startNotifier];

    return self;
}

- (void) checkNetworkStatus:(NSNotification *)notice {
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)

    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            self.internetActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            self.internetActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            self.internetActive = YES;

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)

    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            self.hostActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            self.hostActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            self.hostActive = YES;

            break;

        }
    }

}

// If lower than SDK 5 : Otherwise, remove the observer as pleased.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

@end


4

코드를 추출하여 하나의 단일 방법에 넣었습니다. 다른 방법이 도움이되기를 바랍니다.

#import <SystemConfiguration/SystemConfiguration.h>

#import <netinet/in.h>
#import <netinet6/in6.h>

...

- (BOOL)isInternetReachable
{    
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    if(reachability == NULL)
        return false;

    if (!(SCNetworkReachabilityGetFlags(reachability, &flags)))
        return false;

    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        // if target host is not reachable
        return false;


    BOOL isReachable = false;


    if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
    {
        // if target host is reachable and no connection is required
        //  then we'll assume (for now) that your on Wi-Fi
        isReachable = true;
    }


    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
    {
        // ... and the connection is on-demand (or on-traffic) if the
        //     calling application is using the CFSocketStream or higher APIs

        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
        {
            // ... and no [user] intervention is needed
            isReachable = true;
        }
    }

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
    {
        // ... but WWAN connections are OK if the calling application
        //     is using the CFNetwork (CFSocketStream?) APIs.
        isReachable = true;
    }


    return isReachable;


}

[A]이 코드는 어디에서 추출 했습니까? 소스에 대한 링크를 게시 할 수 있습니까? [B] 추출 작업에 대단히 감사합니다! 내가 필요한 것만 나는이 집안일을 직접 수행하려고했다.
바질

따라서 이것이 원격 서버를 확인하지 않는 유일한 대답 인 것 같습니다.
재스퍼

MacOS에서이를 테스트하는 다른 사용자의 경우 kSCNetworkReachabilityFlagsIsWWAN은 macOS가 아닌 OS_IPHONE 용입니다.
GeoffCoope

4

나는 여기에 받아 들여진 대답의 빠른 버전을 쓰고 있습니다. , 넣다가이 유용한 사람을 발견하면, 코드가 빠른 2 작성,

SampleCode 에서 필요한 파일을 다운로드 할 수 있습니다

프로젝트에 추가 Reachability.hReachability.m제출

이제 Bridging-Header.h프로젝트에 파일이 없으면 파일 을 만들어야 합니다.

Bridging-Header.h파일 안에 다음 줄을 추가하십시오.

#import "Reachability.h"

이제 인터넷 연결을 확인하려면

static func isInternetAvailable() -> Bool {
    let networkReachability : Reachability = Reachability.reachabilityForInternetConnection()
    let networkStatus : NetworkStatus = networkReachability.currentReachabilityStatus()

    if networkStatus == NotReachable {
        print("No Internet")
        return false
    } else {
        print("Internet Available")
        return true
    }

}

3

도움이 될 것 같아요 ..

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

if([AFNetworkReachabilityManager sharedManager].isReachable)
{
    NSLog(@"Network reachable");
}
else
{   
   NSLog(@"Network not reachable");
}

네트워크 인터페이스가 변경되지 않고 인터넷 연결이 끊어지면 작동하지 않습니다.
Pratik Somaiya

2

프로젝트에서 이미 AFNetworking을 구성한 경우이 방법을 시도 할 수도 있습니다.

-(void)viewDidLoad{  // -- add connectivity notification --//
[[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(ReachabilityDidChangeNotification:) name:AFNetworkingReachabilityDidChangeNotification object:nil];}
-(void)ReachabilityDidChangeNotification:(NSNotification *)notify
{
// -- NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));  -- //
NSDictionary *userInfo =[notif userInfo];
AFNetworkReachabilityStatus status= [[userInfo valueForKey:AFNetworkingReachabilityNotificationStatusItem] intValue];
switch (status)
{
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
        // -- Reachable -- //
// -- Do your stuff when internet connection is available -- //
        [self getLatestStuff];
        NSLog(@"Reachable");
        break;
    case AFNetworkReachabilityStatusNotReachable:
    default:
        // -- Not reachable -- //
        // -- Do your stuff for internet connection not available -- //
NSLog(@"Not Reachable");
        break;
}
}

1

다음은 도달 가능성을 사용하지 않고 Swift를 사용하여 연결을 확인하는 좋은 솔루션입니다. 이 블로그 에서 찾았습니다 .

Network.swift예를 들어 프로젝트에 새 Swift 파일을 만듭니다 . 이 코드를 해당 파일에 붙여 넣으십시오.

import Foundation

public class Network {

    class func isConnectedToNetwork()->Bool{

        var Status:Bool = false
        let url = NSURL(string: "http://google.com/")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "HEAD"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0

        var response: NSURLResponse?

        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

        if let httpResponse = response as? NSHTTPURLResponse {
            if httpResponse.statusCode == 200 {
                Status = true
            }
        }

        return Status
    }
}

그런 다음 다음을 사용하여 프로젝트 어디에서나 연결을 확인할 수 있습니다.

if Network.isConnectedToNetwork() == true {
    println("Internet connection OK")
} else {
    println("Internet connection FAILED")
}

0

편집 : 네트워크 URL에는 작동하지 않습니다 (댓글 참조)

iOS 5부터 새로운 NSURL 인스턴스 메소드가 있습니다.

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

관심있는 웹 사이트 나 apple.com을 가리 킵니다. 인터넷이 기기에서 작동하는지 확인하는 것이 새로운 단선 전화라고 생각합니다.


실제로 내 테스트에서는 항상 false를 반환합니다. 문서에 이것은 4.x의 경우이지만 5 이상에서는 작동해야한다고 말합니다. YMMV
SG1

찾고있는 상황에서는 작동하지 않는 것 같습니다. 참조 stackoverflow.com/questions/9266154/...
미가 Hainline

7
인터넷 URL이 아닌 파일 URL에 사용됩니다.
Victor Bogdan

0

또한 사용 가능한 인터넷 확인 옵션에 만족하지 못했습니다 (왜 이것이 기본 API가 아니십니까?!?!)

내 자신의 문제는 장치가 라우터에 연결되어 있지만 라우터가 인터넷에 연결되어 있지 않은 경우 100 % 패킷 손실과 관련이 있습니다. 도달 가능성과 다른 사람들은 나이가 들게됩니다. 비동기 타임 아웃을 추가하여 유틸리티 단일 클래스를 처리했습니다. 내 앱에서 잘 작동합니다. 도움이 되길 바랍니다. github의 링크는 다음과 같습니다.

https://github.com/fareast555/TFInternetChecker


0

(iOS) Xcode 8.2, Swift 3.0에서 인터넷 연결 사용 가능 여부 확인

네트워크 가용성을 확인하는 간단한 방법입니다. 나는 그것을 Swift 2.0과 여기에서 최종 코드로 번역했습니다. 기존 Apple Reachability 클래스 및 기타 타사 라이브러리는 너무 복잡하여 Swift로 번역하기가 어려웠습니다.

이것은 3G 및 WiFi 연결 모두에서 작동합니다.

"SystemConfiguration.framework"를 프로젝트 빌더에 추가하는 것을 잊지 마십시오.

//Create new swift class file Reachability in your project.

import SystemConfiguration

public class Reachability {
class func isConnectedToNetwork() -> Bool {
    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)
    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
        }
    }
    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)
   }
}

// Check network connectivity from anywhere in project by using this code.

if Reachability.isConnectedToNetwork() == true {
     print("Internet connection OK")
} else {
 print("Internet connection FAILED")
}

Xcode 버전 7.2 (7C68)에서이 코드에는 컴파일러 오류가 있습니다
Daniel

@Daniel, 포인팅 문제 덕분에 안전하지 않은 포인터로 인해 스위프트 2 / Xcode가 구문을 업데이트하므로 따라야합니다. 동일한 코드를 업데이트했습니다. ty;)
ViJay Avhad 2016 년

Wi-Fi에 연결되어 있지만 인터넷에 연결할 수없는 경우 (Google 페이지 열기) 여전히 연결할 수있는 경우 true를 반환합니다. 잘못 됐어
Arildo Junior

0

tonymillion에서 영감을 얻은 Apple Reachability for Swift를 클로저로 다시 작성 : https://github.com/ashleymills/Reachability.swift

  1. 파일 Reachability.swift을 프로젝트에 놓으십시오 . 또는 CocoaPods 또는 Carthage를 사용 하십시오- 프로젝트 README 의 설치 섹션을 참조하십시오 .

  2. 네트워크 연결에 대한 알림 받기 :

    //declare this property where it won't go out of scope relative to your listener
    let reachability = Reachability()!
    
    reachability.whenReachable = { reachability in
        if reachability.isReachableViaWiFi {
            print("Reachable via WiFi")
        } else {
            print("Reachable via Cellular")
        }
    }
    
    reachability.whenUnreachable = { _ in
        print("Not reachable")
    }
    
    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }

    알림 중지

    reachability.stopNotifier()

0

알라모 파이어

모든 RESTful API에 Alamofire 를 이미 사용하고 있다면 여기에서 혜택을 누릴 수 있습니다.

앱에 다음 클래스를 추가 MNNetworkUtils.main.isConnected()하고 연결되어 있는지 여부에 대한 부울을 얻기 위해 호출 할 수 있습니다.

#import Alamofire

class MNNetworkUtils {
  static let main = MNNetworkUtils()
  init() {
    manager = NetworkReachabilityManager(host: "google.com")
    listenForReachability()
  }

  private let manager: NetworkReachabilityManager?
  private var reachable: Bool = false
  private func listenForReachability() {
    self.manager?.listener = { [unowned self] status in
      switch status {
      case .notReachable:
        self.reachable = false
      case .reachable(_), .unknown:
        self.reachable = true
      }
    }
    self.manager?.startListening()
  }

  func isConnected() -> Bool {
    return reachable
  }
}

이것은 싱글 톤 클래스입니다. 사용자가 네트워크를 연결하거나 연결을 끊을 때마다 on singleton 초기화를 self.reachable수신하기 때문에 네트워크 가 true / false로 올바르게 재정의 됩니다 NetworkReachabilityManager.

또한 연결 가능성을 모니터링하려면 호스트를 제공해야합니다. 현재는 필요 google.com에 따라 다른 호스트 나 다른 호스트로 자유롭게 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.