Подтвердить что ты не робот

Проверка подключения к Интернету в Objective C

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

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

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

4b9b3361

Ответ 2

Вам нужно будет прочитать коды ошибок и ответить как можно лучше. У меня был некоторый опыт в этом, по сути, это может зависеть от того, с каким сервисом вы взаимодействуете, но с 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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

   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:
    {
    }
}

Ответ 6

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

Ответ 7

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

Ответ 8

-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}