2009-08-15 28 views
8

Tôi đã tìm kiếm nhưng không thể thấy câu hỏi tương tự.Khả năng hiển thị đôi khi không thành công, ngay cả khi chúng tôi có kết nối Internet

Tôi đã thêm phương pháp để kiểm tra kết nối internet theo ví dụ Khả năng hiển thị. Nó hoạt động hầu hết thời gian, nhưng khi cài đặt trên iPhone, nó thường xuyên thất bại ngay cả khi tôi có kết nối internet (chỉ khi trên 3G/EDGE - WiFi là OK).

Về cơ bản, mã dưới đây trả về NO.

Nếu tôi chuyển sang ứng dụng khác, hãy nói Thư hoặc Safari và kết nối, sau đó chuyển về ứng dụng, sau đó mã cho biết internet có thể truy cập được. Kinda có vẻ như nó cần một 'nudge'.

Bất cứ ai đã thấy điều này trước đây? Bất kỳ ý tưởng?

Rất cám ơn James

+ (BOOL) doWeHaveInternetConnection{ 

BOOL success; 
// google should always be up right?! 
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, 
                      host_name); 
SCNetworkReachabilityFlags flags; 
success = SCNetworkReachabilityGetFlags(reachability, &flags); 
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 

if (isAvailable) { 
    NSLog(@"Google is reachable: %d", flags); 
}else{ 
    NSLog(@"Google is unreachable"); 
} 

return isAvailable; 

}

Trả lời

7

Hình như bạn đã tước ra một số mã reachability cơ bản từ mã ví dụ Apple. Điều gì xảy ra khi bạn để nguyên vẹn và làm điều này?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

if (netStatus == NotReachable) 
{ 
    NSLog(@"NotReachable"); 
} 

if (netStatus == ReachableViaWiFi) 
{ 
    NSLog(@"ReachableViaWiFi"); 
} 

if (netStatus == ReachableViaWWAN) 
{ 
    NSLog(@"ReachableViaWWAN"); 
} 
+0

Xin lỗi, tôi hơi ngớ ngẩn. Tôi đã thêm ví dụ về các lớp Khả năng hiển thị vào dự án của tôi, nhưng không thể biên dịch. \t Khả năng hiển thị * hostReach = [[Khả năng hiển thị khả năng hiển thịWithHostName: @ "www.apple.com"] giữ lại]; Không hoạt động. Không thể tìm thấy phương thức reachabilityWithHostName. tôi sẽ tiếp tục tinh chỉnh ... – stoutyhk

+0

công trình này: + (BOOL) doWeHaveInternetConnection2 { \t \t if ([[reachability sharedReachability] internetConnectionStatus] == NotReachable) { \t \t trở NO; \t} \t else \t { \t \t return YES; \t} \t } – stoutyhk

+1

mã đó luôn cung cấp cho bạn "Không được kết nối" mặc dù được kết nối. nhưng một khi nó đi đến phương pháp "reachabilityChanged" nó cung cấp cho bạn tình trạng chính xác.Vậy làm thế nào để có được trạng thái chính xác ngay từ đầu? – Nnp

1
+ (BOOL) doWeHaveInternetConnection2{ 
     if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable) { 
        return NO; 
      } 
      else 
      { 
        return YES; 
      } 

} 

(xin lỗi, định dạng mã đã không làm việc trong bình luận)

+0

Cuộc gọi đến '+ sharedReachability' cho tôi biết bạn đang sử dụng phiên bản Khả năng hiển thị trước 2.0. Phiên bản mới nhất đã được đăng một tuần hoặc lâu hơn, và nó hoạt động tốt hơn rất nhiều so với phiên bản sử dụng một singleton. Câu trả lời của Matt dưới đây dựa trên phiên bản mới nhất, đó là lý do tại sao bạn gặp khó khăn khi biên dịch nó. Lấy phiên bản mới nhất và xem nó có phù hợp với nhu cầu của bạn tốt hơn không. – Tim

+0

Cảm ơn - không biết có phiên bản mới. Cảm ơn nhiều. – stoutyhk

1

Với phiên bản 2, mã nên là:

+ (BOOL) doWeHaveInternetConnection2{ 

if([Reachability reachabilityForInternetConnection] == NotReachable) { 
    return NO; 
} 
else 
{ 
    return YES; 
} 

}

+0

// reachabilityForInternetConnection- kiểm tra xem tuyến đường mặc định có sẵn hay không. // Nên được sử dụng bởi các ứng dụng không kết nối với một máy chủ cụ thể – stoutyhk

+0

Kiểm tra đêm qua, trên thiết bị iphone, ở chế độ trên máy bay, mã này trả về CÓ, nhưng sau đó khi truy xuất URL, nó không thành công. Vì vậy, tôi sẽ không sử dụng điều này. Quay lại kiểm tra kết nối với một máy chủ cụ thể. – stoutyhk

+0

Thử nghiệm kết nối với một máy chủ cụ thể bằng cách sử dụng reachabilityWithHostName sẽ trả về kết quả dương tính giả, dường như bất cứ khi nào điện thoại của bạn được gán địa chỉ IP. Hãy thử: Rút phích cắm cáp khỏi bộ định tuyến không dây trong khi điện thoại của bạn được kết nối với nó và kiểm tra kết quả của [reachability reachabilityWithHostName:] Nó sẽ là YES mọi lúc, mặc dù bạn rõ ràng không thể liên lạc với máy chủ. – Oscar

1

Những gì tôi đã tìm thấy là bạn phải biết về những gì thread (runloop) mà từ đó bạn lần đầu tiên gọi startNotifier. Nếu bạn gọi nó từ chuỗi nền hoặc NSOperation, bạn sẽ bắt đầu vòng lặp trình thông báo trên vòng lặp chạy của chuỗi đó.

Nếu bạn chia sẻ các trường hợp, có thể lấy một singleton như trong [Reachability reachabilityForInternetConnection], nó xuất hiện từ mã hiện tại (2.0) mà người invoker cuối cùng thắng và nhận được bộ thông báo cho vòng lặp chạy của nó.

Các vấn đề liên quan