3

現在、通信している特定のサーバーに基づいて webview を開こうとする ap があります。

ただし、iphone/ipad とサーバー (または他のデバイス) の両方が同じネットワーク上にない場合に備えて、ユーザーが独自のサーバー IP を入力できるようにします。ただし、NSURLConnection を使用して、指定された IP との接続を開くことができるかどうかを検出しようとしていますが、サーバー アドレス (またはランダムな Web アドレスでさえ) が完全に偽物であっても、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 に答える