3

我目前有一个应用程序,它试图根据我正在与之通信的某些服务器打开一个 web 视图。

但是,我允许用户输入他们自己的服务器 IP,以防 iphone/ipad 和服务器(或其他设备)不在同一个网络上。但是,我正在尝试使用 NSURLConnection 来检测是否可以打开与给定 IP 的连接,但是 NSURLConnection 永远不会返回错误,即使服务器地址(甚至是随机网址)完全是伪造的。

.h

        @interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate, UITableViewDataSource, UITableViewDelegate,UIWebViewDelegate, NSURLConnectionDataDelegate> {

.m 中的相关代码

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
         (NSIndexPath *)indexPath
       {
        dev_ip = @"http://www.asdfasfdfa.com/";
        //dev_ip = (random ip)
        NSMutableURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:dev_ip]];

        NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        if (conn) {
            NSLog(@"Connection established");    

        }
        else{
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"No Device at designated IP"]

                                                           delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];
        }
      }

此 if/else 始终输出“已建立连接”。这是不应该使用 NSURLConnection 的东西吗?如果是这样,我可以使用什么来检测给定 IP 上的设备以进行连接。我需要阻止用户尝试连接到错误的 IP,那么这样做的最佳方法是什么?

4

2 回答 2

3

NSURLConnection 与委托一起使用时,会在连接时调用委托方法,连接失败并接收数据。您应该查看 NSURLConnectionDelegate。

这是一个简单的例子:

    // In your .h

    @interface MyClass : NSObject <NSURLConnectionDelegate, NSURLConnectionDataDelegate>

    @end

编辑您实际上需要两个代表。


    // In your .m

    @implementation MyClass

    - (void)myMethodToConnect {

         NSString *dev_ip = @"http://74.125.137.101"; // Google.com

         NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:dev_ip]];

         NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    }

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

        switch ([(NSHTTPURLResponse *)response statusCode]) { // Edited this!
            case 200: {
                NSLog(@"Received connection response!");
                break;
            }
            default: {
                NSLog(@"Something bad happened!");
                break;
            }
        }

    }

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
        NSLog(@"Error connecting. Error: %@", error);
    }
    @end

此外,只需将其也扔在那里,您不一定必须使用异步调用。您可以发送不需要您实现委托的同步调用。就是这样:

    NSString *dev_ip = @"http://www.asdfasdfasdf.com/";
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:dev_ip]];
    NSURLResponse *response = nil;
    NSError *error = nil;

    NSData *connectionData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

您可以检查响应值和错误。

于 2012-09-26T19:24:49.407 回答
2

有更好的方法来测试服务器是否有效。Reachability类为此提供了良好的 API 。

于 2012-09-26T21:07:21.077 回答