2009-04-24 48 views
12

Tôi đang tìm cách xác định liệu kết nối internet có khả dụng trên iPhone hay không. Nó không quan trọng cho các ứng dụng cho dù đó là wifi hoặc EDGE hoặc bất cứ điều gì.Cách dễ nhất để xác định xem kết nối internet iPhone có khả dụng không?

Sử dụng mã từ ví dụ SeismicXML dường như không làm việc và reachability mã ví dụ từ Apple có vẻ như quá mức cần thiết cho các ứng dụng ...

Có một cách nhanh chóng và dễ dàng để xác định khả dụng của mạng trên iPhone?

Cảm ơn, Bến

+0

Bạn đã tìm thấy câu trả lời chưa? – JoePasq

+0

** Giải pháp từng bước ** Xem câu trả lời: http://stackoverflow.com/a/25498693/2459296 – Salim

Trả lời

0

ý tưởng đầu tiên của tôi sẽ là để xem nếu tôi có thể kết nối với google.

7

I figured it out sau một pha tạt XCode một lần cố gắng để sao chép các SystemConfiguration.framework trong ... Dưới đây là giải pháp cho bất cứ ai có thể quan tâm đến ...

Thêm SystemConfiguration.framework để dự án của bạn, làm một #import <SystemConfigura/SystemConfiguration.h>, sau đó thêm đoạn mã sau:

SCNetworkReachabilityFlags flags; 
BOOL receivedFlags; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(CFAllocatorGetDefault(), [@"google.com" UTF8String]); 
receivedFlags = SCNetworkReachabilityGetFlags(reachability, &flags); 
CFRelease(reachability); 

if (!receivedFlags || (flags == 0)) 
{ 
    // internet not available 
} else { 
    // internet available 
} 

Vâng, hy vọng điều này sẽ giúp người dù sao ... có vẻ như một cách phổ biến để có một ứng dụng bị từ chối ...

+0

Bạn cần cẩn thận với giả định cờ == 0 có nghĩa là kết nối mà ứng dụng của bạn có thể sử dụng . Nếu bạn nhìn vào các giá trị có thể cho SCNetworkConnectionFlags, không phải tất cả chúng đều có nghĩa là "truy cập internet ngay lập tức có sẵn." (Http://developer.apple.com/documentation/Networking/Reference/SysConfig/SCNetwork/CompositePage.html#//apple_ref/c/tag/SCNetworkConnectionFlags) Mẫu Khả năng hiển thị của Apple chính xác hơn nhiều. – lfalin

9

Tôi bao gồm Reachability.h & của Apple .m từ ví dụ Reachability của chúng, cộng với khung SystemConfiguration được đề cập ở trên, sau đó thêm mã sau vào ứng dụng của tôi, có hai lợi thế so với câu trả lời ở trên - nó cung cấp cho bạn nhiều thông tin hơn thông báo không đồng bộ về thay đổi trạng thái mạng.

Trong đại biểu ứng dụng của bạn, hoặc tương tự, thêm này khi bạn khởi động:

[self startReachability]; 

Sau đó thêm phương pháp này, mà được gọi khi thay đổi mạng:

#pragma mark Reachability changed 
- (void)reachabilityChanged:(NSNotification*)aNote 
{ 
self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; 

switch (self.remoteHostStatus) 
{ 
case NotReachable: 
    debugForComponent(kDebugMaskApp,@"Status changed - host not reachable"); 
    break; 

case ReachableViaCarrierDataNetwork: 
    debugForComponent(kDebugMaskApp,@"Status changed - host reachable via carrier"); 
    break; 

case ReachableViaWiFiNetwork: 
    debugForComponent(kDebugMaskApp,@"Status changed - host reachable via wifi");  
    break; 

default: 
    debugForComponent(kDebugMaskApp,@"Status changed - some new network status"); 
    break; 
} 
} 
+5

'[self startReachability]' - Phương pháp này được định nghĩa ở đâu? –

1

Đây là giải pháp nhanh nhất và đơn giản nhất cho vấn đề của bạn:

([NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]]!=NULL)?YES:NO; 

Nó sẽ trở lại YES nếu nó được kết nối hoặc NO nếu nó không. Nó chỉ cố gắng tải google và nếu nó thành công hơn nó trả về YES.

Sau đó, bạn có thể có tuyên bố if với giá trị trả lại, để bạn có thể ném thông báo hoặc bất cứ điều gì bạn muốn.

+0

Một cách bẩn thỉu. –

+0

stringWithContentsOfURL bị khấu hao. Vì vậy, điều đó không hoạt động ngay bây giờ. – badweasel

24

Thực hiện theo 3 bước đơn giản sau đây -

Bước 1: Bao gồm "SystemConfiguration.framework" khuôn khổ dự án của bạn

Bước 2: Bao gồm Reachability.h của Apple và reachability.m từ Ví dụ về khả năng hiển thị

Bước 3: Bây giờ hãy thêm mã này vào bất cứ đâu trong .m.

Reachability* wifiReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 
NetworkStatus netStatus = [wifiReach currentReachabilityStatus]; 

switch (netStatus) 
{ 
    case NotReachable: 
    { 
     NSLog(@"Access Not Available"); 
     break; 
    } 

    case ReachableViaWWAN: 
    { 
     NSLog(@"Reachable WWAN"); 
     break; 
    } 
    case ReachableViaWiFi: 
    { 
     NSLog(@"Reachable WiFi"); 
     break; 
    } 
} 
+5

^Điều đó, ngoại trừ khả năng hiển thị cung cấp các phương pháp khác nhau cho các mục đích khác nhau: Sử dụng reachabilityWithHostName: @ "your.hostname" để kiểm tra xem bạn có thể liên hệ với máy chủ của riêng mình hay không. Sử dụng reachabilityForInternetConnection để kiểm tra xem có kết nối internet hay không; cái thứ hai dường như gần hơn với câu hỏi ban đầu ở đây. Tôi sẽ không kiểm tra máy chủ của bên thứ ba, ví dụ: Apple.com - đó là một hack. – n13

+0

Cảm ơn bạn rất nhiều – SampathKumar

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