2012-03-08 29 views
7

Sau khi tôi đã đọc câu trả lời cho this question Tôi đã thấy rằng việc sử dụng reachabilityWithHostName không hoạt động với URL như URL này: mySite.com/service.asmx, vẫn có thể kiểm tra khả năng hiển thị đối với URL này bằng cách sử dụng reachabilityWithHostName hoặc bất kỳ phương thức nào của lớp học reachability?kiểm tra khả năng hiển thị đối với một trang cụ thể trong URL

cảm ơn rất nhiều trước.

+1

reachability là duy nhất ở đó để kiểm tra xem bạn có thể truy cập internet để bạn có thể xác định xem bạn nên cảnh báo người dùng và do đó sử dụng dữ liệu được lưu trữ. Đây là một phần của hướng dẫn của Apple về tương tác của người dùng. Nếu bạn muốn kiểm tra một URL cụ thể, sau đó thử truy cập URL đó, đặt thời gian chờ thành rất nhỏ và bắt lỗi. –

Trả lời

18

Lớp Khả năng hiển thị và -reachabilityWithHostname: được thiết kế để có cơ chế nhanh, không nhanh để xác định xem bạn có kết nối mạng cơ bản với máy chủ hay không. Nếu bạn cần xác minh rằng một URL cụ thể có thể được tải xuống, bạn cần phải xem xét sử dụng NSURLConnection để truy xuất nội dung của URL để xác minh rằng URL đó thực sự có sẵn.

Tùy thuộc vào việc bạn cần phải làm điều này trong foreground hoặc background, bạn có thể sử dụng đơn giản nhưng chặn:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 

hoặc bạn có thể sử dụng phương pháp phức tạp hơn của việc tạo ra một đối tượng NSURLConnection, thiết lập một đại biểu để nhận câu trả lời và chờ đợi với những phản hồi đến trong

đối với trường hợp đơn giản:.

NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
NSURLResponse *response; 
NSError *error; 
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 

Nếu bạn nhận lại một on-nil myData, bạn đã có một số loại kết nối. responseerror sẽ cho bạn biết những gì máy chủ trả lời cho bạn (trong trường hợp phản hồi và nếu bạn nhận được một myData không phải là nil) hoặc loại lỗi nào xảy ra, trong trường hợp của myData không phải.

Đối với trường hợp không tầm thường, bạn có thể nhận được hướng dẫn tốt từ số Using NSURLConnection của Apple.

Nếu bạn không muốn ngăn chặn quá trình tiền cảnh của mình, bạn có thể thực hiện hai cách khác nhau này. Tài liệu trên sẽ cung cấp thông tin về cách thực hiện ủy nhiệm, vv Tuy nhiên, việc triển khai đơn giản hơn là sử dụng GCD để gửi yêu cầu Đồng bộ trên một chuỗi nền, và sau đó tự tin nhắn lên luồng chính khi bạn hoàn tất.

Something như thế này:

NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{ 
     NSURLResponse *response; 
     NSError *error; 
     NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 
     BOOL reachable; 

     if (myData) { 
      // we are probably reachable, check the response 
      reachable=YES; 
     } else { 
      // we are probably not reachable, check the error: 
      reachable=NO; 
     } 

     // now call ourselves back on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setReachability: reachable]; 
     }); 
}); 
+0

bạn có thể cung cấp một ví dụ đơn giản về cách thực hiện nó trong nền để ngăn chặn việc treo ứng dụng? – JAHelia

+0

Tôi đã thêm một ví dụ về việc sử dụng GCD để thực hiện yêu cầu đồng bộ trên một cuộc gọi không đồng bộ đến chuỗi nền, trả lại phản hồi về luồng chính của bạn dưới dạng tin nhắn khi nó hoàn thành. Hy vọng rằng sẽ giúp. – gaige

+0

tuyệt vời! có một sai lầm nhỏ trong mã trên, bạn phải thiết lập reachable = YES trong câu lệnh if đầu tiên và NO trong câu lệnh if thứ hai. cảm ơn bạn rất nhiều gaige. – JAHelia

5

Nếu bạn muốn kiểm tra khả năng hiển thị đối với URL (URL thường được sử dụng chống lại tên máy chủ) chỉ cần thực hiện yêu cầu HEAD bằng cách sử dụng NSURLConnection.

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