Làm cách nào để kiểm tra kết nối Internet đang hoạt động trên iOS hoặc macOS?


1326

Tôi muốn kiểm tra xem tôi có kết nối Internet trên iOS bằng cách sử dụng Cocoa Touch thư viện hoặc trên hệ điều hành MacOS bằng cách sử dụng Cocoa thư viện.

Tôi đã nghĩ ra một cách để làm điều này bằng cách sử dụng một NSURL . Cách tôi làm có vẻ hơi không đáng tin (vì ngay cả một ngày nào đó Google cũng có thể thất vọng và dựa vào bên thứ ba có vẻ tồi tệ), và trong khi tôi có thể kiểm tra xem phản hồi từ một số trang web khác nếu Google không phản hồi, thì nó không có vẻ lãng phí và một chi phí không cần thiết trên ứng dụng của tôi.

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

Là những gì tôi đã làm xấu, (không đề cập đến stringWithContentsOfURL là không dùng nữa trong iOS 3.0 và macOS 10.4) và nếu vậy, cách nào tốt hơn để thực hiện điều này?


11
Thay vào đó return (BOOL)URLString;, hoặc thậm chí tốt hơn, return !!URLStringhoặcreturn URLString != nil

3
Tôi không biết trường hợp sử dụng của bạn là gì, nhưng nếu bạn có thể nên thử yêu cầu và xử lý bất kỳ lỗi nào như thiếu kết nối phát sinh. Nếu bạn không thể làm điều này, thì có rất nhiều lời khuyên tốt ở đây trong trường hợp này.
SK9

2
Giải pháp của bạn là thông minh, và tôi thích nó. Bạn cũng có thể sử dụng NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];Để thoát khỏi cảnh báo gây phiền nhiễu.
Abdelrahman Eid

4
hãy thử sử dụng lớp Reachability từ liên kết bên dưới, nó sẽ hoạt động cho bạn github.com/tonymillion/Reachability
Dhaval H. Nena

4
Đối với những người gần đây tìm thấy câu trả lời này: stackoverflow.com/a/8813279
afollestad

Câu trả lời:


1285

Quan trọng : Kiểm tra này phải luôn được thực hiện không đồng bộ. Phần lớn các câu trả lời dưới đây là đồng bộ, vì vậy hãy cẩn thận nếu không bạn sẽ đóng băng ứng dụng của mình.


Nhanh

1) Cài đặt qua Cốc Cốc hoặc Carthage: https://github.com/ashleymills/Reachability.swift

2) Kiểm tra khả năng tiếp cận thông qua việc đóng cửa

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")
}

Mục tiêu-C

1) Thêm SystemConfigurationkhung cho dự án nhưng đừng lo lắng về việc đưa nó vào bất cứ đâu

2) Thêm phiên bản Reachability.hReachability.mdự án của Tony Million (tìm thấy tại đây: https://github.com/tonymillion/Reachability )

3) Cập nhật phần giao diện

#import "Reachability.h"

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

4) Sau đó, thực hiện phương thức này trong tệp .m của trình điều khiển xem của bạn mà bạn có thể gọi

// 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];
}

Lưu ý quan trọng: Các Reachabilitylớp là một trong những lớp học sử dụng nhiều nhất trong các dự án, do đó bạn có thể chạy vào đặt tên xung đột với các dự án khác. Nếu điều này xảy ra, bạn sẽ phải đổi tên một trong các cặp Reachability.hReachability.m tệp thành một thứ khác để giải quyết vấn đề.

Lưu ý: Tên miền bạn sử dụng không quan trọng. Nó chỉ đang thử nghiệm một cổng vào bất kỳ miền nào.


4
@gonzobrains: Tên miền bạn sử dụng không thành vấn đề. Nó chỉ đang thử nghiệm một cổng vào bất kỳ miền nào .
iwasrobbed

3
@KaanDedeoglu Đây chỉ là một ví dụ, sử dụng bất kỳ tên miền nào bạn muốn. Nó chỉ đơn giản là kiểm tra một cổng vào internet, không phải là tên miền thực sự có sẵn.
iwasrobbed

1
Ồ, btw bạn cũng cần thêm SystemConfiguration.frameworkvào dự án (đối với phương pháp 1).
khôn ngoan

2
Sử dụng www.appleiphonecell.com thay vì google.com - url này được tạo bởi apple vì lý do này chính xác.
Smikey

1
Sử dụng www.appleiphonecell.com bây giờ (2018) là một lựa chọn tồi. Bây giờ nó chuyển hướng đến Apple.com là tệp html> 40kB. Quay lại google.com - nó chỉ có 11kB. BTW google.com/m có cùng kích thước nhưng được báo cáo là chậm hơn 120 msec.
BlueskyMed

311

Tôi muốn giữ cho mọi thứ đơn giản. Cách tôi làm điều này là:

//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;
}

Sau đó, tôi sử dụng nó bất cứ khi nào tôi muốn xem tôi có kết nối không:

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

Phương pháp này không chờ trạng thái mạng thay đổi để thực hiện công cụ. Nó chỉ kiểm tra trạng thái khi bạn yêu cầu.


Xin chào @msec, bạn có thể dùng thử giải pháp Andrew Zimmer trong trang này, nó hoạt động tốt với adsl bị ngắt kết nối (và kết nối wifi)
Williew

1
Đối với những người chỉ sao chép và dán như tôi đã làm với đoạn mã trên. Đồng thời thêm SystemConfiguration.framework bằng tay nếu không bạn sẽ gặp lỗi liên kết.
Iftikhar Ali Ansari

Luôn luôn có thể truy cập nếu tôi kết nối với WiFi. WiFi không có nghĩa là nó có kết nối internet. Tôi muốn xác minh kết nối internet ngay cả khi nó có kết nối WiFi. bạn có thể vui lòng giúp tôi không?
wesley

@wesley Bạn đã giải quyết nó như thế nào?
Keselme

146

Sử dụng mã Khả năng hiển thị của Apple, tôi đã tạo một hàm sẽ kiểm tra chính xác điều này mà không cần bạn phải bao gồm bất kỳ lớp nào.

Bao gồm SystemConfiguration.framework trong dự án của bạn.

Thực hiện một số nhập khẩu:

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

Bây giờ chỉ cần gọi chức năng này:

/*
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;
}

Và đó là iOS 5 đã thử nghiệm cho bạn.


@JezenThomas Điều này không thực hiện kiểm tra internet không đồng bộ, đó là lý do tại sao nó "mỏng hơn nhiều" ... Bạn phải luôn luôn thực hiện việc này một cách không đồng bộ bằng cách đăng ký thông báo để bạn không treo ứng dụng trong quá trình này.
iwasrobbed

Cảm ơn, công việc này ngay cả khi bạn đang sử dụng wifi adsl và adsl không được kết nối, chính xác là những gì tôi cần.
Williew

5
Bộ nhớ bị rò rỉ này - cấu trúc 'khả năng đọc' (đối tượng, vật) cần được giải phóng với CFRelease ().
Russell Mull

@RussellMull ... có ý tưởng nào để khắc phục rò rỉ không?
i_raqz

Thật kỳ lạ khi câu trả lời này có trước tôi (về một câu hỏi được đánh dấu là trùng lặp) trong 2 năm, hoàn toàn giống với câu trả lời của tôi, nhưng tôi chưa bao giờ thấy nó cho đến ngày hôm nay.
ArtOfWarfare

122

Đây từng là câu trả lời chính xác, nhưng hiện tại nó đã lỗi thời vì bạn nên đăng ký thông báo để có thể tiếp cận thay thế. Phương pháp này kiểm tra đồng bộ:


Bạn có thể sử dụng lớp Khả năng tiếp cận của Apple. Nó cũng sẽ cho phép bạn kiểm tra xem Wi-Fi có được bật hay không:

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"];    // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];

if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }

Lớp Khả năng tiếp cận không được cung cấp cùng với SDK mà là một phần của ứng dụng mẫu này của Apple . Chỉ cần tải xuống và sao chép Reachability.h / m vào dự án của bạn. Ngoài ra, bạn phải thêm khung SystemConfiguration vào dự án của bạn.


6
Xem bình luận của tôi ở trên về việc không sử dụng Khả năng tiếp cận như thế. Sử dụng nó trong chế độ không đồng bộ và đăng ký thông báo mà nó gửi - không.
Kendall Helmstetter Gelner

Mã này là điểm khởi đầu tốt cho những thứ bạn cần đặt trước khi bạn có thể sử dụng các phương thức ủy nhiệm cho lớp khả năng tiếp cận.
Brock Woolf

82

Đây là một câu trả lời rất đơn giản:

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 phải trỏ đến một trang web cực kỳ nhỏ. Tôi sử dụng trang web di động của Google ở ​​đây, nhưng nếu tôi có một máy chủ web đáng tin cậy, tôi sẽ tải lên một tệp nhỏ chỉ có một ký tự trong đó để có tốc độ tối đa.

Nếu kiểm tra xem thiết bị có bằng cách nào đó không kết nối Internet phải là tất cả những gì bạn muốn làm hay không, tôi chắc chắn khuyên bạn nên sử dụng giải pháp đơn giản này. Nếu bạn cần biết cách người dùng được kết nối, sử dụng Khả năng tiếp cận là cách tốt nhất.

Cẩn thận: Điều này sẽ nhanh chóng chặn chủ đề của bạn trong khi nó tải trang web. Trong trường hợp của tôi, đây không phải là một vấn đề, nhưng bạn nên xem xét điều này (tín dụng cho Brad để chỉ ra điều này).


10
Tôi thực sự thích ý tưởng này, nhưng tôi sẽ nói về độ tin cậy 99,999% trong khi duy trì kích thước phản hồi nhỏ, hãy truy cập www.google.com/m, chế độ xem trên thiết bị di động cho google.
rwyland

1
Giải pháp tuyệt vời @Erik. Điều tôi cũng khuyên bạn là nên sử dụng www.google.com, thay vì www.google.com/m, như rwyland đã nói. Thật kỳ lạ, nhưng từ thử nghiệm của tôi, phiên bản di động luôn mất khoảng 120ms so với www.google.com
Sebyddd

4
Các tài liệu của Apple khuyên bạn không nên làm điều này vì nó có thể chặn luồng trên mạng chậm, có thể khiến ứng dụng bị chấm dứt trong iOS
Brad Thomas

Cảm ơn phản hồi tích cực, đồng ý rằng www.google.com.vn/m là giải pháp tốt nhất vì độ tin cậy!
Erik

3
LOL, tôi chắc chắn Google đánh giá cao bạn đề nghị mọi người sử dụng chúng làm tài nguyên kiểm tra Internet.
mxcl

73

Đây là cách tôi thực hiện trong các ứng dụng của mình: Mặc dù mã phản hồi trạng thái 200 không đảm bảo bất cứ điều gì, nhưng nó đủ ổn định với tôi. Điều này không yêu cầu tải nhiều như các câu trả lời của NSData được đăng ở đây, vì tôi chỉ kiểm tra phản hồi CHÍNH.

Mã Swift

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

    let url = NSURL(string: "http://www.google.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 Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

Mã mục tiêu-C

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.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 Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}

3
Có vẻ như đây là cách nhanh nhất
Pavel

3
Thận trọng: Theo kinh nghiệm của tôi, giải pháp này không hoạt động mọi lúc. Trong nhiều trường hợp, phản hồi trả về là 403, sau khi dành thời gian ngọt ngào. Giải pháp này có vẻ hoàn hảo, nhưng không đảm bảo kết quả 100%.
Mustafa

10
Kể từ tháng 6 năm 2014, điều này sẽ thất bại ở Trung Quốc đại lục, do chính phủ Trung Quốc hiện đã chặn hoàn toàn google.com. (tuy nhiên, google.cn hoạt động, nhưng ở Trung Quốc đại lục, không có b Nikol.com, không có internet) Có lẽ tốt hơn để ping bất kỳ máy chủ nào bạn cần liên lạc.
prewett

4
Thay vào đó, hãy sử dụng www.appleiphonecell.com - apple đã tạo url này vì lý do này chính xác.
Smikey

1
Tôi đã sử dụng appleiphonecell vì nó là của riêng Apple, cũng có thể được sử dụng ở Trung Quốc và đây là một trang web rất nhanh. Điều này, kết hợp với câu trả lời của bạn cung cấp cho tôi giải pháp gần nhất và nhanh nhất. Cảm ơn bạn
Septronic 9/11/2015

57

Apple cung cấp mã mẫu để kiểm tra các loại mạng khả dụng khác nhau. Ngoài ra, có một ví dụ trong sách dạy nấu ăn dành cho nhà phát triển iPhone.

Lưu ý: Vui lòng xem nhận xét của @ KHG về câu trả lời này liên quan đến việc sử dụng mã khả năng tiếp cận của Apple.


Cảm ơn. Tôi phát hiện ra rằng tài liệu Xcode trong 3.0 cũng chứa mã nguồn, được tìm thấy bằng cách tìm kiếm "khả năng tiếp cận" trong tài liệu.
Brock Woolf

7
Lưu ý rằng bản sửa đổi mới (09-08-09) của mã mẫu Khả năng tiếp cận từ Apple là không đồng bộ.
Daniel Hepper

46

Bạn có thể sử dụng Reachabilitybởi  ( có sẵn ở đây ).

#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.

@Supertecnoboff Không, nó không đồng bộ.
Aleksander Azizi

39

Apple cung cấp một ứng dụng mẫu thực hiện chính xác điều này:

Khả năng tiếp cận


7
Bạn nên lưu ý rằng mẫu Khả năng hiển thị chỉ phát hiện giao diện nào đang hoạt động, nhưng không có giao diện nào có kết nối hợp lệ với internet. Các ứng dụng nên xử lý một cách duyên dáng ngay cả khi Reachability báo cáo rằng mọi thứ đã sẵn sàng hoạt động.
rpetrich

Đáng mừng là tình hình đã tốt hơn rất nhiều trong 3.0, vì hệ thống sẽ hiển thị trang đăng nhập cho người dùng đằng sau WiFi bị khóa nơi bạn phải đăng nhập để sử dụng ... bạn sử dụng để kiểm tra chuyển hướng thủ công (và bạn vẫn làm nếu phát triển ứng dụng 2.2.1)
Kendall Helmstetter Gelner

Tôi sẽ không nói rằng ứng dụng Reachability thực hiện chính xác những gì được yêu cầu. Tuy nhiên, đó là một điểm khởi đầu tốt để thêm loại chức năng được yêu cầu,
Johan Karlsson

Liên kết bị hỏng!, Sẽ đánh giá cao nếu điều này có thể được kiểm tra / sửa chữa, cảm ơn rất nhiều
Heider Sati

33

Chỉ có lớp Khả năng tiếp cận đã được cập nhật. Bây giờ bạn có thể sử dụng:

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");}

1
Trừ khi có gì đó thay đổi kể từ 4.0 được phát hành, mã đó không đồng bộ và bạn được đảm bảo sẽ thấy nó xuất hiện trong Báo cáo sự cố - đã xảy ra với tôi trước đây.
bpapa

1
Tôi đồng ý với bpapa. Đó không phải là một ý tưởng tốt để sử dụng mã đồng bộ. Cảm ơn thông tin mặc dù
Brock Woolf



22

Nếu bạn đang sử dụng AFNetworking bạn có thể sử dụng triển khai riêng của mình cho trạng thái truy cập internet.

Cách tốt nhất để sử dụng AFNetworkinglà phân lớpAFHTTPClient lớp lớp và sử dụng lớp này để thực hiện các kết nối mạng của bạn.

Một trong những lợi thế của việc sử dụng phương pháp này là bạn có thể sử dụng blocksđể đặt hành vi mong muốn khi trạng thái khả năng tiếp cận thay đổi. Giả sử rằng tôi đã tạo một lớp con đơn lẻ AFHTTPClient(như đã nói trong "Ghi chú phân lớp" trên các tài liệu AFNetworking ) có tên BKHTTPClient, tôi sẽ làm một cái gì đó như:

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
    if (status == AFNetworkReachabilityStatusNotReachable) 
    {
    // Not reachable
    }
    else
    {
        // Reachable
    }
}];

Bạn cũng có thể kiểm tra các kết nối Wi-Fi hoặc WLAN cụ thể bằng cách sử dụng AFNetworkReachabilityStatusReachableViaWWANAFNetworkReachabilityStatusReachableViaWiFienums ( thêm tại đây ).


18

Tôi đã sử dụng mã trong cuộc thảo luận này và nó dường như hoạt động tốt (đọc toàn bộ chủ đề!).

Tôi chưa thử nghiệm nó một cách triệt để với mọi loại kết nối có thể hiểu được (như ad-Wi-Fi).


mã này không hoàn toàn tốt vì nó chỉ kiểm tra xem bạn có kết nối wifi với bộ định tuyến không chứ không thể truy cập web. Bạn có thể có wifi hoạt động và tiếp tục kích hoạt để truy cập web.
DuckDucking

15

Rất đơn giản .... Hãy thử các bước sau:

Bước 1: Thêm SystemConfigurationkhung vào dự án của bạn.


Bước 2: Nhập mã sau vào headertệp của bạn .

#import <SystemConfiguration/SystemConfiguration.h>

Bước 3: Sử dụng phương pháp sau

  • Loại 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;
    }

  • Loại 2:

    Nhập tiêu đề :#import "Reachability.h"

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

Bước 4: Cách sử dụng:

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

Là loại 1 không đồng bộ?
Supertecnoboff

Tôi muốn sửa lỗi loại 2 từ câu trả lời của bạn. Tôi đã thêm các lớp khả năng tiếp cận và tôi đã cố kiểm tra xác minh kết nối bằng cách sử dụng câu trả lời của bạn ở trên. nó luôn có thể truy cập ngay cả khi tôi kết nối với WiFi nhưng nó không có kết nối internet. WiFi không có nghĩa là nó có kết nối internet. Tôi muốn xác minh kết nối internet ngay cả khi nó có kết nối WiFi. bạn có thể vui lòng giúp tôi không?
wesley

12
-(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;
}
}

7
Ngay cả khi thiết bị được kết nối với Wifi hoặc một số loại mạng khác, kết nối internet vẫn có thể không khả dụng. Kiểm tra đơn giản: kết nối với wifi nhà bạn và sau đó rút modem cáp của bạn. Vẫn kết nối với wifi, nhưng không có internet.
iwasrobbed

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

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

Hoặc sử dụng lớp Khả năng tiếp cận .

Có hai cách để kiểm tra tính khả dụng của Internet bằng SDK iPhone:

1. Kiểm tra trang Google có được mở hay không.

2. Lớp tiếp cận

Để biết thêm thông tin, vui lòng tham khảo Khả năng tiếp cận (Nhà phát triển của Apple).


1
Có hai cách để kiểm tra tính khả dụng của internet trong SDK iPhone 1) Kiểm tra trang Google có được mở hay không.
IOS Rocks

1
-1: Đây là một phương thức đồng bộ sẽ chặn luồng chính (giao diện người dùng ứng dụng được thay đổi) trong khi nó cố gắng kết nối với google.com. Nếu người dùng của bạn đang kết nối dữ liệu rất chậm, điện thoại sẽ hoạt động như quá trình không phản hồi.
iwasrobbed


10

Đầu tiên : Thêm CFNetwork.frameworkvào khung

Mã số :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");
    }
}

8

Trước tiên, tải xuống lớp khả năng truy cập và đặt tệp Reachability.h và Reachabilty.m trong Xcode của bạn .

Cách tốt nhất là tạo một lớp Hàm chung (NSObject) để bạn có thể sử dụng nó bất kỳ lớp nào. Đây là hai phương pháp để kiểm tra khả năng tiếp cận kết nối mạng:

+(BOOL) reachabiltyCheck
{
    NSLog(@"reachabiltyCheck");
    BOOL status =YES;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(reachabilityChanged:)
                                          name:kReachabilityChangedNotification
                                          object:nil];
    Reachability * reach = [Reachability reachabilityForInternetConnection];
    NSLog(@"status : %d",[reach currentReachabilityStatus]);
    if([reach currentReachabilityStatus]==0)
    {
        status = NO;
        NSLog(@"network not connected");
    }
    reach.reachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    reach.unreachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    [reach startNotifier];
    return status;
}

+(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;
    NSLog(@"reachabilityChanged");
    Reachability * reach = [note object];
    NetworkStatus netStatus = [reach currentReachabilityStatus];
    switch (netStatus)
    {
        case NotReachable:
            {
                status = NO;
                NSLog(@"Not Reachable");
            }
            break;

        default:
            {
                if (!isSyncingReportPulseFlag)
                {
                    status = YES;
                    isSyncingReportPulseFlag = TRUE;
                    [DatabaseHandler checkForFailedReportStatusAndReSync];
                }
            }
            break;
    }
    return status;
}

+ (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)
    {
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
    NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

Bây giờ bạn có thể kiểm tra kết nối mạng trong bất kỳ lớp nào bằng cách gọi phương thức lớp này.


8

Ngoài ra còn có một phương pháp khác để kiểm tra kết nối Internet bằng SDK iPhone.

Cố gắng thực hiện mã sau đây cho kết nối mạng.

#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;
}


8
  1. Tải xuống tệp Khả năng hiển thị, https://gist.github.com/darkseed/1182373

  2. Và thêm CFNetwork.frameworkvà 'SystemConfiguration.framework' trong khung

  3. Làm #import "Khả năng tiếp cận.h"


Đầu tiên : Thêm CFNetwork.frameworkvào khung

Mã số :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");
    }
}

8

Swift 3 / Swift 4

Trước tiên bạn phải nhập

import SystemConfiguration

Bạn có thể kiểm tra kết nối internet bằng phương pháp sau

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)

}

7

Lớp Khả năng tiếp cận có thể tìm hiểu xem kết nối Internet có khả dụng với thiết bị hay không ...

Nhưng trong trường hợp truy cập tài nguyên mạng nội bộ :

Ping máy chủ mạng nội bộ với lớp khả năng tiếp cận luôn trả về đúng.

Vì vậy, một giải pháp nhanh chóng trong kịch bản này sẽ là tạo ra một phương thức web được gọi pingmecùng với các webmethod khác trên dịch vụ. Cácpingme nên trả lại một cái gì đó.

Vì vậy, tôi đã viết phương pháp sau đây về các chức năng phổ biến

-(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;
    }
}

Phương pháp trên rất hữu ích đối với tôi, vì vậy, bất cứ khi nào tôi cố gắng gửi một số dữ liệu đến máy chủ, tôi luôn kiểm tra khả năng tiếp cận của tài nguyên mạng nội bộ của mình bằng cách sử dụng URLRequest thời gian chờ thấp này.


7

Để làm điều này bản thân là vô cùng đơn giản. Phương pháp sau đây sẽ hoạt động. Chỉ cần đảm bảo không cho phép một giao thức tên máy chủ như HTTP, HTTPS, v.v. được truyền vào với tên đó.

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

Nó là nhanh chóng đơn giản và không đau.



7

Tôi nghĩ rằng đây là câu trả lời tốt nhất.

"Có" có nghĩa là kết nối. "Không" có nghĩa là ngắt kết nối.

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

6

Nhập Reachable.hlớp trong của bạn ViewControllervà sử dụng mã sau đây để kiểm tra kết nối :

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

Câu trả lời của bạn chính xác là những gì tôi đang tìm kiếm. Bạn xứng đáng được bình chọn lên xD
Nikel Arteta

Không hoạt động nếu bạn được kết nối với WiFi mà không có internet.
Keselme

6
  • Bước 1: Thêm lớp Khả năng tiếp cận trong Dự án của bạn.
  • Bước 2: Nhập lớp Khả năng hiển thị
  • Bước 3: Tạo chức năng dưới đây

    - (BOOL)checkNetConnection {
        self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
            {
                return NO;
            }
    
            case ReachableViaWWAN:
            {
                 return YES;
            }
    
            case ReachableViaWiFi:
            {
                 return YES;
            }
        }
    }
  • Bước 4: Gọi hàm như sau:

    if (![self checkNetConnection]) {
        [GlobalFunctions showAlert:@""
                         message:@"Please connect to the Internet!"
                         canBtntitle:nil
                         otherBtnTitle:@"Ok"];
        return;
    }
    else
    {
        Log.v("internet is connected","ok");
    }

Tài liệu của Apple nêu rõ Lưu ý
noobsmcgoobs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.