Cách dễ nhất để phát hiện kết nối Internet trên iOS?


147

Tôi biết câu hỏi này sẽ xuất hiện là một bản sao của nhiều người khác, tuy nhiên, tôi không cảm thấy trường hợp đơn giản được giải thích rõ ở đây. Đến từ nền tảng Android và BlackBerry, khiến các yêu cầu thông qua HTTPUrlConnectionthất bại ngay lập tức nếu không có kết nối. Điều này có vẻ giống như hành vi hoàn toàn lành mạnh và tôi đã ngạc nhiên khi thấy NSURLConnectiontrong iOS không mô phỏng nó.

Tôi hiểu rằng Apple (và những người khác đã mở rộng nó) cung cấp một Reachabilitylớp để hỗ trợ xác định trạng thái mạng. Tôi rất vui khi lần đầu tiên nhìn thấy điều này và hoàn toàn mong đợi sẽ thấy một cái gì đó giống như vậy bool isNetworkAvailable(), nhưng thay vào đó tôi ngạc nhiên khi thấy một hệ thống phức tạp đòi hỏi phải đăng ký thông báo và gọi lại, và một loạt các chi tiết dường như không cần thiết. Phải có cách tốt hơn.

Ứng dụng của tôi đã duyên dáng xử lý các lỗi kết nối, bao gồm cả không có kết nối. Người dùng được thông báo về sự cố và ứng dụng sẽ tiếp tục.

Do đó, yêu cầu của tôi rất đơn giản: Hàm đơn, đồng bộ Tôi có thể gọi trước tất cả các yêu cầu HTTP để xác định xem tôi có nên thực sự gửi yêu cầu hay không. Lý tưởng nhất là nó không yêu cầu thiết lập và chỉ trả về một boolean.

Điều này thực sự không thể có trên iOS?



Bạn không bao giờ nên gọi một phương thức tiếp cận mạng đồng bộ trước mỗi yêu cầu HTTP; Thật là điên rồ khi thực hiện công việc đó trừ khi khả năng tiếp cận không đồng bộ cho bạn biết có sự thay đổi trong điều kiện mạng và sau đó bạn có thể chọn không gửi yêu cầu HTTP. Đây cũng là toàn bộ lý do thời gian chờ tồn tại (và sau đó bạn nên xử lý tình huống đó một cách duyên dáng). Xem liên kết ở trên để biết cách không đồng bộ
iwasrobbed

Câu trả lời:


251

Tôi đã nghiên cứu thêm một chút và tôi đang cập nhật câu trả lời của mình với một giải pháp mới hơn. Tôi không chắc nếu bạn đã xem nó nhưng có một mã mẫu đẹp do Apple cung cấp.

Tải mã mẫu tại đây

Bao gồm các tệp Reachability.h và Reachability.m trong dự án của bạn. Hãy xem ReachabilityAppDelegate.m để xem một ví dụ về cách xác định khả năng tiếp cận của máy chủ, khả năng truy cập bằng WiFi, bằng WWAN, v.v. Để kiểm tra khả năng tiếp cận mạng rất đơn giản, bạn có thể làm điều gì đó như thế này

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: Đừng quên thêm SystemConfiguration.framework vào dự án của bạn.


46
Đừng quên thêm SystemConfiguration.framework vào dự án của bạn.
Benjamin Piette

1
@ Vendru Nó hoạt động. Đây là cách dễ nhất và hiệu quả nhất mà tôi thấy để phát hiện kết nối mạng. Đơn giản và dễ dàng!
S1U

3
Cẩn thận với điều này. Tôi thấy nó không hoạt động đáng tin cậy khi mạng được khôi phục, ít nhất là trong trình giả lập. Tôi khởi chạy với tắt wifi và nó báo cáo chính xác không có mạng; nhưng sau đó tôi bật lại wifi và SCNetworkReachabilityGetFlags tiếp tục trả về 0, mặc dù các truy vấn mạng thực tế chỉ hoạt động tốt.
Joe Strout

2
Tôi tin rằng câu trả lời của tôi dưới đây ( stackoverflow.com/a/26593728/557362 ) yêu cầu ít công việc hơn (không tải xuống các tệp khác), nhưng đó chỉ là ý kiến ​​của tôi.
GilesDMiddleton

3
Lưu ý rằng điều này chỉ cho bạn biết liệu kết nối đến máy chủ cụ thể có thể định tuyến được hay không . Điều đó không có nghĩa là bạn thực sự có thể kết nối. Ví dụ: bạn kết nối wifi của iPhone với wifi của máy ảnh. Wifi được kết nối với một cổng mặc định: tất cả các máy chủ sẽ báo cáo có thể truy cập. Nhưng họ thực sự không phải - máy ảnh là một kết nối cuối cùng.
xaphod

45

Xem chủ đề này là kết quả hàng đầu của google cho loại câu hỏi này, tôi đoán rằng tôi sẽ cung cấp giải pháp hiệu quả cho tôi. Tôi đã sử dụng AFNetworking , nhưng việc tìm kiếm không tiết lộ cách hoàn thành nhiệm vụ này với AFNetworking cho đến giữa dự án của tôi.

Những gì bạn muốn là 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;
    }

}];

Bạn cũng có thể sử dụng cách sau để kiểm tra khả năng tiếp cận một cách đồng bộ (khi việc giám sát đã bắt đầu):

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

3
Tôi ủng hộ việc đưa AFNetworkReachabilityManageránh sáng vào!
Selvin

Đối với những người mà điều này không rõ ràng ngay lập tức: AFNetworking là một thư viện của bên thứ ba.
arlomedia

1
Khả năng tiếp cận mạng là một công cụ chẩn đoán có thể được sử dụng để hiểu lý do tại sao yêu cầu có thể thất bại. Nó không nên được sử dụng để xác định xem có nên đưa ra yêu cầu hay không. - Đó là những gì tài liệu nói.
Nosov Pavel

AFNetworkReachabilityManager.reachableKHÔNG thực hiện bất kỳ loại kiểm tra đồng bộ. Nó trả về một logic hoặc của reachableViaWWANreachableViaWifi.
jdolan

40

Xin lỗi vì trả lời quá muộn nhưng tôi hy vọng câu trả lời này có thể giúp ai đó trong tương lai.

Sau đây là một đoạn mã C nhỏ bản địa có thể kiểm tra kết nối internet mà không cần thêm lớp.

Thêm các tiêu đề sau:

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

Mã số:

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

Swift 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
hoạt động tốt hơn nhiều so với Khả năng tiếp cận của Apple. Nhưng theo tài liệu gethostbyname đã lỗi thời và bạn nên sử dụng getaddrinfo: struct addrinfo * res = NULL; int s = getaddrinfo ("apple.com", NULL, NULL, & res); bool network_ok = (s == 0 && res! = NULL); freeaddrinfo (độ phân giải);
Tertium

1
Mặc dù thông thường sử dụng google.com để kiểm tra tính khả dụng của Internet, nhưng đáng chú ý là nó bị chặn ở một số quốc gia. Một lựa chọn tốt hơn sẽ là các tên miền từ các công ty "thân thiện với chính phủ" hơn như yahoo.com hoặc microsoft.com.
nguyệt quế

8
@Laurent: Tùy chọn tốt nhất là sử dụng địa chỉ máy chủ mà bạn sẽ yêu cầu dữ liệu từ đó. google.com ở đây chỉ là một ví dụ.
văn vào

7
Đây có phải chỉ là một tra cứu DNS? Nếu vậy, một kết quả DNS được lưu trong bộ nhớ cache có thể dẫn đến chức năng sai lệch khi tin rằng mạng có sẵn không?
Stephen Moore

2
@amar Chạy cái này trong một vòng lặp sẽ tiêu thụ dữ liệu không dây, bạn không muốn làm điều đó.
ý nghĩa-vấn đề

31

Tôi hiện đang sử dụng phương pháp đồng bộ đơn giản này không yêu cầu thêm tệp trong dự án hoặc đại biểu của bạn.

Nhập khẩu:

#import <SystemConfiguration/SCNetworkReachability.h>

Tạo phương thức này:

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

Sau đó, nếu bạn đặt cái này vào MyNetworkClass:

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

Nếu bạn đang kiểm tra trình giả lập, hãy bật và tắt wifi của máy Mac, vì nó xuất hiện trình giả lập sẽ bỏ qua cài đặt điện thoại.

Cập nhật:

  1. Cuối cùng, tôi đã sử dụng một cuộc gọi lại chủ đề / không đồng bộ để tránh chặn luồng chính; và thường xuyên kiểm tra lại để tôi có thể sử dụng kết quả được lưu trong bộ nhớ cache - mặc dù bạn nên tránh giữ kết nối dữ liệu mở một cách không cần thiết.

  2. Như @thunk mô tả, có những URL tốt hơn để sử dụng, mà chính Apple sử dụng. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network


1
Cảm ơn, và giống như hầu hết những người khác trong chủ đề này: Đừng quên thêm SystemConfiguration.framework vào dự án của bạn.
eselk 13/03/2015

1
Điều lạ là, trong dự án Xcode của tôi, tôi đã không phải thêm SystemConfiguration.framework. Tôi đã có SpriteKit, UIKit, StoreKit, Foundation và CoreGraphics, nhưng không có SystemConfiguration .... Có một số sự bao gồm ngầm đang diễn ra?
GilesDMiddleton 13/03/2015

3
Điều này làm việc cho tôi, nhưng khi tôi chạy nó khi được kết nối với mạng wi-fi không có kết nối Internet, nó đã khóa giao diện người dùng của tôi trong khoảng 30 giây. Một cách tiếp cận không đồng bộ là cần thiết trong tình huống đó.
arlomedia

2
www.apple.comlà trang web lớn ... tùy chọn tốt hơn sẽ làwww.google.com
Fahim Parkar

2
câu trả lời tuyệt vời! Một đề xuất: URL thử nghiệm www.appleiphonecell.com, được cho là có sẵn cho mục đích này và dường như không bị chặn ở Trung Quốc.
Thunk

11

Có thể và nó thực sự đơn giản nếu bạn nhìn vào nó khi hoàn thành việc thực hiện, một lần nữa - rất đơn giản, vì các mục duy nhất bạn cần là hai biến boolean: khả năng truy cập internet và khả năng tiếp cận máy chủ (bạn thường cần nhiều hơn một trong số này ). Khi bạn tập hợp lớp người trợ giúp có thể xác định trạng thái kết nối, bạn thực sự không quan tâm đến việc triển khai cần thiết để biết các quy trình này.

Thí dụ:

#import <Foundation/Foundation.h>

@class Reachability;

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

@property BOOL internetActive;
@property BOOL hostActive;

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

@end

Và tệp .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

Tôi trích xuất mã và đưa vào một phương thức duy nhất, hy vọng nó sẽ giúp người khác.

#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ạn đã trích xuất mã này từ đâu? Bạn có thể gửi một liên kết đến nguồn? [B] Cảm ơn bạn rất nhiều vì công việc khai thác của bạn! Đúng thứ tôi cần. Tôi đã tự mình thực hiện việc vặt này.
Basil Bourque

Vì vậy, có vẻ như đây là câu trả lời duy nhất không kiểm tra bất kỳ máy chủ từ xa nào?
Jasper

Đối với những người khác đang thử nghiệm điều này trên MacOS, lưu ý rằng kSCNetworkReachabilityFlagsIsWWAN dành cho OS_IPHONE chứ không phải macOS.
GeoffCoope

4

Tôi đang viết phiên bản nhanh chóng của câu trả lời được chấp nhận ở đây , trong trường hợp nếu ai đó thấy nó hữu ích, mã được viết nhanh 2,

Bạn có thể tải xuống các tệp yêu cầu từ SampleCode

Thêm Reachability.hReachability.mtập tin vào dự án của bạn,

Bây giờ người ta sẽ cần tạo Bridging-Header.htệp nếu không có tệp nào cho dự án của bạn,

Trong Bridging-Header.htập tin của bạn thêm dòng này:

#import "Reachability.h"

Bây giờ để kiểm tra kết nối Internet

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

Tôi nghĩ rằng điều này có thể giúp ..

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

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

Điều này không hoạt động nếu giao diện mạng không thay đổi và mất kết nối internet.
Pratik Somaiya

2

Bạn cũng có thể thử cái này nếu bạn đã cấu hình AFNetworking trong dự án của bạn.

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

Đây là một giải pháp tốt để kiểm tra kết nối bằng Swift mà không cần sử dụng Reachability. Tôi tìm thấy nó trên blog này .

Tạo một tệp Swift mới trong dự án của bạn được gọi là Network.swift(ví dụ). Dán mã này vào trong tệp đó:

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

Sau đó, bạn có thể kiểm tra kết nối ở bất cứ đâu trong dự án của mình bằng cách sử dụng:

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

0

EDIT: Điều này sẽ không hoạt động đối với các URL mạng (xem bình luận)

Kể từ iOS 5, có một phương thức NSURL mới:

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

Trỏ nó đến trang web mà bạn quan tâm hoặc trỏ nó đến apple.com; Tôi nghĩ rằng đó là cuộc gọi một đường dây mới để xem liệu internet có hoạt động trên thiết bị của bạn không.


Trên thực tế trong các thử nghiệm của riêng tôi, điều này luôn trả về sai. Các tài liệu nêu rõ đây là trường hợp của 4.x nhưng trong 5+ nó sẽ hoạt động. YMMV
SG1

Điều này dường như không hoạt động cho tình huống bạn đang tìm kiếm. Xem stackoverflow.com/questions/9266154/
Mạnh

7
Điều đó được sử dụng cho URL tệp, không phải URL Internet.
Victor Bogdan

0

Tôi cũng không hài lòng với các tùy chọn kiểm tra Internet có sẵn (Tại sao đây không phải là API gốc?!?!)

Vấn đề của riêng tôi là mất gói 100% - khi một thiết bị được kết nối với bộ định tuyến, nhưng bộ định tuyến không được kết nối với Internet. Khả năng tiếp cận và những người khác sẽ treo lâu dài. Tôi đã tạo ra một lớp singleton tiện ích để đối phó với điều đó bằng cách thêm thời gian chờ. Nó hoạt động tốt trong ứng dụng của tôi. Hy vọng nó giúp. Đây là liên kết trên github:

https://github.com/fareast555/TFINETChecker


0

Kiểm tra tính khả dụng của kết nối Internet trong (iOS) Xcode 8.2, Swift 3.0

Đây là phương pháp đơn giản để kiểm tra tính khả dụng của mạng. Tôi đã quản lý để dịch nó sang Swift 2.0 và đây là mã cuối cùng. Lớp Apple Reachability hiện tại và các thư viện bên thứ ba khác dường như quá phức tạp để dịch sang Swift.

Điều này hoạt động cho cả kết nối 3G và WiFi.

Đừng quên thêm System SystemConfiguration.framework 'vào trình xây dựng dự án của bạn.

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

Với Xcode phiên bản 7.2 (7C68), mã này có lỗi trình biên dịch
Daniel

@Daniel, cảm ơn vì đã chỉ ra vấn đề, điều này vì các con trỏ không an toàn, vì Swift 2 / Xcode đang cập nhật các cú pháp, chúng ta nên theo dõi chúng. tôi đã cập nhật mã cho cùng. ty;)
ViJay Avhad

Nếu bạn được kết nối với wi-fi nhưng không thể kết nối với internet (mở một trang google) thì nó vẫn trả về đúng cho bạn có thể truy cập. Nó sai.
Arasy Junior

0

Thay thế cho Khả năng hiển thị của Apple được viết lại bằng Swift với các bao đóng , lấy cảm hứng từ tonymillion: https://github.com/ashleymills/Reachability.swift

  1. Thả tập tin Reachability.swiftvào dự án của bạn. Ngoài ra, hãy sử dụng Cốc Cốc hoặc Carthage - Xem phần Cài đặt của README của dự án.

  2. Nhận thông báo về kết nối mạng:

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

    và để dừng thông báo

    reachability.stopNotifier()

0

Alamofire

Nếu bạn đang sử dụng Alamofire cho tất cả Api RESTful, đây là những gì bạn có thể làm được từ đó.

Bạn có thể thêm lớp sau vào ứng dụng của mình và gọi MNNetworkUtils.main.isConnected()để nhận boolean về việc nó có được kết nối hay không.

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

Đây là một lớp học đơn. Mỗi lần, khi người dùng kết nối hoặc ngắt kết nối mạng, nó sẽ ghi đè self.reachablethành đúng / sai một cách chính xác, bởi vì chúng tôi bắt đầu lắng nghe NetworkReachabilityManagerkhởi tạo đơn lẻ.

Ngoài ra, để giám sát khả năng tiếp cận, bạn cần cung cấp một máy chủ lưu trữ, hiện tại tôi đang sử dụng google.comthoải mái để thay đổi sang bất kỳ máy chủ nào khác hoặc một trong các máy chủ của bạn nếu cần.

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.