Проверка на интернет Связь в Objective C

голоса
15

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

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

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

Задан 25/01/2009 в 16:53
источник пользователем
На других языках...                            


8 ответов

голоса
30

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

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

Ответил 25/01/2009 в 17:35
источник пользователем

голоса
9

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

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

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

Ответил 10/05/2009 в 05:45
источник пользователем

голоса
9

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

Ответил 25/01/2009 в 17:31
источник пользователем

голоса
8

это работает для меня, и берется из яблочной сейсмической 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;
}
Ответил 26/03/2009 в 16:18
источник пользователем

голоса
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:
    {
    }
}
Ответил 20/08/2013 в 06:40
источник пользователем

голоса
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Ответил 14/08/2012 в 07:40
источник пользователем

голоса
2

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

Ответил 18/05/2011 в 11:40
источник пользователем

голоса
2

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

Ответил 25/01/2009 в 16:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more