2012-11-16 32 views
10

Tôi đang sử dụng mã khả năng truy cập của Apple và đang thiết lập cả thông báo ban đầu khi thay đổi khả năng truy cập mạng và trước khi bắt đầu kết nối máy chủ. Mã hoạt động khi tôi bật wi-fi và tôi tắt điểm truy cập wi-fi. Tuy nhiên, khi tôi khởi động ứng dụng bằng wi-fi và kết nối băng thông rộng cơ bản hoạt động, sau đó một khi ứng dụng đang chạy và sau đó ngắt kết nối bộ định tuyến wi-fi khỏi bộ định tuyến băng thông rộng (tức là Wi-Fi đang bật nhưng không có internet kết nối) và tôi thực hiện kiểm tra khả năng kết nối, trạng thái mạng tôi nhận được là ReachableViaWiFi. Tôi đã thử cả reachabilityForInternetConnection và reachabilityWithHostName.Khả năng hiển thị không hoạt động khi kết nối wi-fi nhưng không có internet

Bất kỳ ý tưởng nào về mã khả năng truy cập của Apple có thể được sử dụng để phát hiện tình huống kết nối wifi nhưng không có kết nối mạng cơ bản?

Cảm ơn!

Trả lời

5

ok, tôi đã tìm ra câu trả lời cho điều này - Khả năng hiển thị của Apple không kiểm tra kết nối thực sự với máy chủ. Xem câu trả lời bằng cách @Zhami trong liên kết SO dưới đây:

How to write a simple Ping method in Cocoa/Objective-C

Về cơ bản, khi bạn lần đầu tiên khởi động ứng dụng và thực hiện kiểm tra reachability, iOS dường như để làm một tra cứu DNS, và nếu không có internet, kiểm tra thất bại. Vì vậy, lần đầu tiên bạn kiểm tra khả năng hiển thị, nó thực sự trả về một giá trị có ý nghĩa. Tuy nhiên, nếu bạn bị tấn công khi khởi chạy ứng dụng và mất kết nối internet sau một thời gian (trong khi vẫn kết nối với WiFi/3G/4G nhưng không có kết nối Internet cơ bản), kiểm tra khả năng truy cập tiếp cận có thể truy cập được ngay cả khi internet hoặc máy chủ được chỉ định của bạn không thể truy cập được nữa không.

Vì vậy, nếu bạn muốn thực sự kiểm tra các kết nối trong thời gian thực, xem xét sử dụng như sau:

-(BOOL) isConnected 
{ 

    NSString* url = [NSURL URLWithString:@"http://www.google.com/m"]; 
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; 
    [request setTimeOutSeconds:10]; 
//customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long 
    [request setNumberOfTimesToRetryOnTimeout:0]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (error) 
    { 
     DLog(@"connectivity error"); 
     return NO; 
    } 
    else 
    { 
     DLog(@"connectivity OK"); 
     return YES; 
    } 

} 
+0

tính năng này không hoạt động ... – user3079872

+0

nó sẽ hoạt động, khi tôi kiểm tra xem internet có khả dụng hay không. Làm cách nào để nghe và tự động hiển thị trạng thái không có internet ngay lập tức, trong khi internet bị ngắt kết nối? – NandhaKumar

1

Đây là một bài rất cũ, nhưng có thể ở lại đây để tham khảo. Trong lớp ví dụ về khả năng hiển thị, bạn có thể tìm thấy mã bên dưới:

- (BOOL)startNotifier 
{ 
    BOOL returnValue = NO; 
    SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; 

    if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) 
    { 
     if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) 
     { 
      returnValue = YES; 
     } 
    } 

    return returnValue; 
} 

Điều này sẽ giúp cho _reachability của bạn được cập nhật để thay đổi mạng.