ios - 오류 - 하이시에라 클린설치




iOS 또는 macOS에서 활성 인터넷 연결을 확인하는 방법 (20)

Cocoa Touch 라이브러리를 사용하는 iOS 또는 Cocoa 라이브러리를 사용하는 MacOS에 인터넷 연결이 있는지 확인하고 싶습니다.

NSURL 사용하여이 작업을 수행하는 방법을 생각해 냈습니다. 내가 한 방식은 약간 신뢰할 수없는 것 같습니다 (Google도 언젠가는 제 3 자에 의지하고 제 3 자에 의존하는 것이 좋지 않을 수 있기 때문입니다). Google이 응답하지 않은 경우 다른 웹 사이트의 응답을 확인할 수는 있지만 내 응용 프로그램에 낭비와 불필요한 오버 헤드가 보인다.

- (BOOL) connectedToInternet
{
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

내가 한 일이 나쁘다. ( stringWithContentsOfURL 은 iOS 3.0과 macOS 10.4에서 더 이상 사용되지 않는다.) 그렇다면 무엇을 더 잘 수행 할 수 있는가?


  1. 도달 가능성 파일, https://gist.github.com/darkseed/1182373 다운로드 https://gist.github.com/darkseed/1182373

  2. 프레임 워크에 CFNetwork.framework 와 'SystemConfiguration.framework'를 추가하십시오.

  3. #import "Reachability.h"를 수행하십시오.


첫 번째 : 프레임 워크에 CFNetwork.framework 추가

코드 : ViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

Apple은 다양한 유형의 네트워크 가용성을 확인하기 위해 샘플 코드 를 제공합니다. 또는 iPhone 개발자 요리 책에 example 가 있습니다.

참고 : Apple의 도달 가능성 코드 사용에 관한이 답변에 대한 @ KHG의 의견을 참조하십시오.


Apple의 Reachability 코드를 사용하여 어떤 클래스도 포함하지 않아도이를 올바르게 확인할 수있는 함수를 만들었습니다.

프로젝트에 SystemConfiguration.framework를 포함시킵니다.

수입품을 만드십시오 :

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

이제이 함수를 호출하십시오.

/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
 */
+(BOOL)hasConnectivity {
    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);
    if (reachability != NULL) {
        //NetworkStatus retVal = NotReachable;
        SCNetworkReachabilityFlags flags;
        if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
            if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
            {
                // If target host is not reachable
                return NO;
            }

            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
                return YES;
            }


            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
                    return YES;
                }
            }

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

    return NO;
}

그리고 iOS 5 테스트되었습니다.


Reachability 클래스 만 업데이트되었습니다. 이제 다음을 사용할 수 있습니다.

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}


iPhone SDK를 사용하여 인터넷 연결을 확인하는 또 다른 방법이 있습니다.

네트워크 연결을 위해 다음 코드를 구현하십시오.

#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>

/**
     Checking for network availability. It returns
     YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{

    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability =
        SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags)
    {
        printf("Error. Could not recover network reachability flags\n");
        return NO;
    }

    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

    return (isReachable && !needsConnection) ? YES : NO;
}

나는 것을 좋아합니다. 내가하는 일은 다음과 같다.

//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>

- (BOOL)connected;

//Class.m
- (BOOL)connected
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    return networkStatus != NotReachable;
}

그런 다음 연결이 있는지 확인하고 싶을 때마다이 코드를 사용합니다.

if (![self connected]) {
    // Not connected
} else {
    // Connected. Do some Internet stuff
}

이 방법은 작업을 수행하기 위해 변경된 네트워크 상태를 기다리지 않습니다. 요청할 때 상태를 테스트합니다.


다음은 매우 간단한 답변입니다.

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
    NSLog(@"Device is connected to the Internet");
else
    NSLog(@"Device is not connected to the Internet");

URL은 매우 작은 웹 사이트를 가리켜 야합니다. 나는 여기에 구글의 모바일 웹 사이트를 사용하지만 신뢰할 수있는 웹 서버를 가지고 있다면 최대 속도를 위해 한 문자로 된 작은 파일을 업로드 할 것입니다.

장치가 어떻게 든 인터넷에 연결되어 있는지 확인하려면 원하는 모든 것이 있습니다.이 간단한 솔루션을 사용하는 것이 좋습니다. 사용자가 어떻게 연결되어 있는지 알아야 할 경우 Reachability를 사용하는 것이 좋습니다.

조심성 : 이것은 웹 사이트를로드하는 동안 스레드를 잠시 차단합니다. 내 경우에는 이것이 문제가 아니었지만 이것을 고려해야합니다 (Brad에게이 점을 지적하십시오).


여기에 내 애플 리케이션에서 그것을하는 방법입니다 : 200 상태 응답 코드는 아무것도 보장하지 않지만, 그것은 나를 위해 충분히 안정적입니다. 이것은 광산에서 HEAD 응답을 확인하기 때문에 여기에 게시 된 NSData 응답만큼 많은 로딩을 필요로하지 않습니다.

신속한 코드

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "http://www.appleiphonecell.com/")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
    {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        let rsp = response as! NSHTTPURLResponse?

        completionHandler(internet:rsp?.statusCode == 200)
    })
}

func yourMethod()
{
    self.checkInternet(false, completionHandler:
    {(internet:Bool) -> Void in

        if (internet)
        {
            // "Internet" aka Apple's region universal URL reachable
        }
        else
        {
            // No "Internet" aka Apple's region universal URL un-reachable
        }
    })
}

목표 -C 코드

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.appleiphonecell.com/"];
    NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
    headRequest.HTTPMethod = @"HEAD";

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    defaultConfigObject.timeoutIntervalForResource = 10.0;
    defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error && response)
        {
            block([(NSHTTPURLResponse *)response statusCode] == 200);
        }
    }];
    [dataTask resume];
}

- (void)yourMethod
{
    [self checkInternet:^(BOOL internet)
    {
         if (internet)
         {
             // "Internet" aka Apple's region universal URL reachable
         }
         else
         {
             // No "Internet" aka Apple's region universal URL un-reachable
         }
    }];
}

이렇게하려면 매우 간단합니다. 다음 방법을 사용할 수 있습니다. HTTP, HTTPS 등과 같은 호스트 이름 프로토콜이 이름과 함께 전달되도록 허용하지 마십시오.

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
    SCNetworkReachabilityFlags flags;
    if (!SCNetworkReachabilityGetFlags(ref, &flags))
    {
        return NO;
    }
    return flags & kSCNetworkReachabilityFlagsReachable;
}

그것은 빠르고 간단합니다.




Reachability 를 로 사용할 수 있습니다 ( 여기에서 사용 가능 ).

#import "Reachability.h"

- (BOOL)networkConnection {
    return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}

if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.

Reachability 클래스 는 인터넷 연결이 장치에 사용 가능한지 여부를 확인하는 데 사용할 수 있습니다.

그러나 인트라넷 리소스 에 액세스하는 경우 :

도달 가능성 클래스로 인트라넷 서버를 핑 (ping)하면 항상 true가 반환됩니다.

따라서이 시나리오의 빠른 해결책은 서비스의 다른 웹 메소드와 함께 pingme 이라는 웹 메소드를 작성하는 것입니다. pingme 뭔가를 돌려 pingme 합니다.

그래서 공통 함수에 대해 다음과 같은 메소드를 작성했습니다.

-(BOOL)PingServiceServer
{
    NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];

    NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];

    [urlReq setTimeoutInterval:10];

    NSURLResponse *response;

    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
                                                 returningResponse:&response
                                                             error:&error];
    NSLog(@"receivedData:%@",receivedData);

    if (receivedData !=nil)
    {
        return YES;
    }
    else
    {
        NSLog(@"Data is null");
        return NO;
    }
}

위의 방법은 나에게 매우 유용했기 때문에 서버에 데이터를 보내려고 할 때마다이 낮은 시간 초과 URL 요청을 사용하여 인트라넷 리소스의 연결 가능성을 항상 확인합니다.


중요 :이 검사는 항상 비동기 적으로 수행되어야합니다. 아래 답변의 대부분은 동기식이므로 앱을 동결하지 않도록주의하십시오.

빠른

1) CocoaPods 또는 Carthage를 통해 설치 : https://github.com/ashleymills/Reachability.swift

2) 클로저를 통한 테스트 도달 가능성

let reachability = Reachability()!

reachability.whenReachable = { reachability in
    if reachability.connection == .wifi {
        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")
}

목표 -C

1) 프로젝트에 SystemConfiguration 프레임 워크를 추가하되 어디서나 포함시키는 것에 대해 걱정하지 마십시오.

2) Tony Million 버전의 Reachability.hReachability.m 을 프로젝트에 추가합니다 (여기에서 찾을 수 있습니다 : github.com/tonymillion/Reachability ).

3) 인터페이스 섹션 업데이트

#import "Reachability.h"

// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
    Reachability *internetReachableFoo;
}
@end

4) 그런 다음 호출 할 수있는 View Controller의 .m 파일에이 메소드를 구현하십시오

// Checks if we have an internet connection or not
- (void)testInternetConnection
{   
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Yayyy, we have the interwebs!");
        });
    };

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Someone broke the internet :(");
        });
    };

    [internetReachableFoo startNotifier];
}

중요 참고 : Reachability 클래스는 프로젝트에서 가장 많이 사용되는 클래스 중 하나이므로 다른 프로젝트와의 이름 충돌이 발생할 수 있습니다. 이 경우 Reachability.hReachability.m 파일 쌍 중 하나를 다른 이름으로 변경하여 문제를 해결해야합니다.

참고 : 사용 하는 도메인은 중요하지 않습니다. 그것은 단지 모든 도메인에 대한 게이트웨이를 테스트하는 것입니다.


첫 번째 : 프레임 워크에 CFNetwork.framework 추가

코드 : ViewController.m

#import "Reachability.h"

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

매우 간단합니다. 다음 단계를 시도해보십시오.

1 단계 : SystemConfiguration 프레임 워크를 프로젝트에 추가하십시오.

2 단계 : header 파일에 다음 코드를 가져옵니다.

#import <SystemConfiguration/SystemConfiguration.h>

3 단계 : 다음 방법을 사용하십시오.

  • 유형 1 :

    - (BOOL) currentNetworkStatus {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        BOOL connected;
        BOOL isConnected;
        const char *host = "www.apple.com";
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
        SCNetworkReachabilityFlags flags;
        connected = SCNetworkReachabilityGetFlags(reachability, &flags);
        isConnected = NO;
        isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
        return isConnected;
    }
    
  • 유형 2 :

    헤더 가져 오기 : #import "Reachability.h"

    - (BOOL)currentNetworkStatus
    {
        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        NetworkStatus networkStatus = [reachability currentReachabilityStatus];
        return networkStatus != NotReachable;
    }
    

4 단계 : 사용 방법 :

- (void)CheckInternet
{
    BOOL network = [self currentNetworkStatus];
    if (network)
    {
        NSLog(@"Network Available");
    }
    else
    {
        NSLog(@"No Network Available");
    }
}

Reachable.h귀하의 클래스를 가져 ViewController오고 다음 코드를 사용하여 연결 을 확인하십시오 .

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }

- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

    return (URL != NULL ) ? YES : NO;
}

또는 Reachability 클래스를 사용하십시오.

iPhone SDK를 사용하여 인터넷 사용 가능성을 확인하는 방법에는 두 가지가 있습니다.

1. Google 페이지가 열렸는지 확인하십시오.

2. 도달 성 등급

자세한 내용은 Reachability (Apple Developer)을 참조하십시오.


-(void)newtworkType {

 NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}


switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
    case 0:
        NSLog(@"No wifi or cellular");
        break;

    case 1:
        NSLog(@"2G");
        break;

    case 2:
        NSLog(@"3G");
        break;

    case 3:
        NSLog(@"4G");
        break;

    case 4:
        NSLog(@"LTE");
        break;

    case 5:
        NSLog(@"Wifi");
        break;


    default:
        break;
}
}




reachability