15

私はスタンフォード大学の iPhone コーディング コースに取り組んでおり、現在は Twitter API に接続しています。私がやりたいのは、2 つのエラー状態を正確に処理することです。1 つはユーザー名が無効な場合、もう 1 つはデバイスが現在インターネットに接続されていない場合です。残念ながら、現状では、私が推測できる最善のことは、API からの戻り値が nil であるかどうかです。これは両方の条件に当てはまります。

私が探しているのは、リモート データの取得を試みる前に接続を確認できる 1 ~ 2 行のコードです。Apple のドキュメントをふるいにかけることはできましたが、次のように考えました。

追加情報: XCode での Objective-C と iPhone SDK の使用。

4

8 に答える 8

30

Appleのサンプルコードを見てください。Reachability プロジェクトは、接続を検出する方法を示しています。

http://developer.apple.com/iphone/library/samplecode/Reachability/index.html

于 2009-01-25T16:35:34.887 に答える
9

エラー コードを読み込んで、できる限り対応する必要があります。私はこれについていくつかの経験をしましたが、それは基本的に、あなたがやり取りしているサービスに依存するかもしれませんが、おいしい.comでは、悪いユーザー/パスワードに対してエラー-1012が発生します。

NSURLErrorUserCancelledAuthentication =     -1012,

明らかにその言い回しは誤解を招くものですが、悪いユーザー/パスワードを入力してそのエラーコードを取得することを一貫して再現できます. 技術的には、データ接続に問題がある奇妙な地域にいる場合を除き、iPhone がインターネットに接続されていないことはありません。エラーコードも表示されます

NSURLErrorNotConnectedToInternet =      -1009,

私はNSURLError.hを通過します(そして、そのようなものは他にもあります)

NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,

等...

あなたがする必要があるのは、渡した NSError オブジェクトへの参照を取得し、そのようなエラーコードであることを確認することだけです

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

定数は、基本的に-1012である独自のソースコードで定義したものです

于 2009-01-25T16:31:53.940 に答える
9

そのコードは機能しますが、必ずしも望ましい結果が得られるとは限りません。

iPhone での TCP スタックの動作は、予想されるものとは大きく異なります。「到達可能性」コードを使用すると、ネットワーク接続が存在する場合がありますが、確実に検出されません。ただし、MobileSafari を起動してから「Reachability」コードを使用して接続の確認を再試行すると、正しい結果が得られます。

ネットワーク接続を判断するのに最も効果的な方法は、アプリケーションのロード時に別のスレッドで NSURLConnection チェックを実行することです。「はい」などの応答が返されることがわかっている URL (つまり、サーバー上の HTML ファイルなど) を呼び出します。次に、返された結果が静的テキストと等しいことを確認します。そうすれば、一貫して機能しない「到達可能性」コードとは対照的に、NSURLConnection スタックが適切に到達していることがわかります。

于 2009-05-10T04:45:50.337 に答える
8

これは私にとってはうまくいき、Apple Seismic xmlプロジェクトから取られています:

- (BOOL)isDataSourceAvailable
{
    static BOOL checkNetwork = YES;
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
        checkNetwork = NO;

        Boolean success;    
        const char *host_name = "twitter.com"; // your data source host name

        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
    }
    return _isDataSourceAvailable;
}
于 2009-03-26T15:18:22.390 に答える
3

到達可能性は、コードにアクセスできる別のクラスです

   Reachability *curReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus)
{
    case NotReachable:
    {
        UIAlertView *connectionAlert = [[UIAlertView alloc] init];
        [connectionAlert setTitle:@"Error"];
        [connectionAlert setMessage:@"Please check your network connection."];
        [connectionAlert setDelegate:self];
        [connectionAlert setTag:1];
        [connectionAlert addButtonWithTitle:@"Back"];
        [connectionAlert show];

        break;
    }
    case ReachableViaWWAN:
    {


    }
    case ReachableViaWiFi:
    {
    }
}
于 2013-08-20T05:40:47.710 に答える
2

Apple の Reachability を使用する場合、google.com や apple.com などのホストにアクセスしようとしても (おそらくキャッシュ問題)。私は自分のサーバーに電話して数字を返すことになりました-少なくとも私の場合は最良の解決策です。

于 2011-05-18T10:40:56.467 に答える
2

現在の接続コードはどのようになっていますか? を使用している場合NSURLConnection +sendSynchronousRequest:returningResponse:error:は、NSError 変数のアドレスを渡し、その後それを確認するだけです。では、デリゲートconnectionWithRequest:delegate:で実装する必要があります。-connection:didFailWithError:

于 2009-01-25T15:59:05.957 に答える
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
于 2012-08-14T06:40:38.223 に答える