Проверка подключения к Интернету в Задаче C - PullRequest
15 голосов
/ 25 января 2009

Я работал над курсом по кодированию iPhone в Стэнфорде и в настоящее время подключаюсь к Twitter API. То, что я хотел бы сделать, это точно обработать два состояния ошибки: одно для случая, когда имя пользователя неверно, и другое для случая, когда устройство в настоящее время не подключено к Интернету. К сожалению, в настоящее время лучшее, что я могу догадаться, - это равенство нуля или нет возврата API, что имеет место в обоих случаях.

Я ищу строку или две строки кода, которые могут проверить соединение перед попыткой любой выборки удаленных данных. Я мог бы просмотреть документацию Apple, но я решил: почему бы вам не задать вопрос, ребята, в мою пользу и, возможно, в пользу других?

Дополнительная информация: Использование Objective-C и iPhone SDK в XCode.

Ответы [ 8 ]

30 голосов
/ 25 января 2009

Взгляните на пример кода Apple. Проект Reachability показывает, как обнаружить соединение.

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

9 голосов
/ 10 мая 2009

Этот код работает, но не всегда создает желаемый результат.

Способ работы стека TCP на iPhone сильно отличается от того, что следовало ожидать. С кодом «Reachability» иногда может быть установлено сетевое соединение, но оно не будет надежно обнаружено. Однако запуск MobileSafari и повторная попытка проверить подключение с помощью кода «Reachability» приведет к правильному результату.

Способ, который я нашел наиболее эффективным при определении сетевого подключения, - это запуск проверки NSURLConnection при загрузке приложения в отдельном потоке. Сделайте вызов на URL, который, как вы знаете, вернет что-то вроде «Да» (т.е. файл HTML на вашем сервере или что-то в этом роде). Затем убедитесь, что возвращаемый результат равен статическому тексту. Таким образом, вы знаете, что стек NSURLConnection работает правильно, в отличие от кода «Reachability», который работает не совсем согласованно.

9 голосов
/ 25 января 2009

Вам нужно будет прочитать коды ошибок и ответить как можно лучше. У меня был некоторый опыт в этом, по сути, это может зависеть от того, с каким сервисом вы взаимодействуете, но на сайте Delicious.com я получаю ошибку -1012 для плохого пользователя / passwd, которая, если вы посмотрите на нее, равна

NSURLErrorUserCancelledAuthentication =     -1012,

хотя ясно, что формулировка вводит в заблуждение, хотя я могу последовательно повторить, введя неверного пользователя / passwd и получив этот код ошибки. Технически 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

8 голосов
/ 26 марта 2009

это работает для меня и взято из проекта 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;
}
3 голосов
/ 20 августа 2013

достижимость - это отдельный класс, через который вы можете получить доступ к коду

   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:
    {
    }
}
2 голосов
/ 14 августа 2012
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
2 голосов
/ 18 мая 2011

При использовании Reachability от Apple имейте в виду, что вы можете подключиться через WWAN (ReachableViaWWAN) или WiFi (ReachableViaWiFi) без подключения к Интернету, даже если вы пытаетесь подключиться к какому-либо хосту, например google.com или apple.com ( возможно проблема с кешированием). В итоге я позвонил на свой сервер и получил цифру - по крайней мере, лучшее решение в моем случае.

2 голосов
/ 25 января 2009

Как выглядит ваш текущий код подключения? Если вы используете NSURLConnection +sendSynchronousRequest:returningResponse:error:, вам просто нужно передать адрес переменной NSError и проверить это после этого; с connectionWithRequest:delegate: вы должны реализовать -connection:didFailWithError: в делегате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...