Ответ 1
Взгляните на образец кода Apple. Проект Reachability показывает, как обнаружить соединение.
http://developer.apple.com/iphone/library/samplecode/Reachability/index.html
Я работаю через курс программирования iPhone в Стэнфорде и в настоящее время подключаюсь к API Twitter. То, что я хотел бы сделать, - это точно обрабатывать два условия ошибки: один, когда имя пользователя неверно, а другое - когда устройство в настоящее время не подключено к Интернету. К сожалению, насколько это возможно, лучшее, что я могу догадаться, заключается в том, является ли возврат из API ничтожным или нет - что имеет место для обоих условий.
Я ищу строку или два кода, которые могут проверять соединение, прежде чем пытаться извлечь удаленные данные. Я мог просеять документацию Apple, но я подумал: "Почему бы не задать вопрос вам, ребята, ради моей выгоды и, возможно, других?"
Дополнительная информация: Использование Objective-C и iPhone SDK в XCode.
Взгляните на образец кода Apple. Проект Reachability показывает, как обнаружить соединение.
http://developer.apple.com/iphone/library/samplecode/Reachability/index.html
Вам нужно будет прочитать коды ошибок и ответить как можно лучше. У меня был некоторый опыт в этом, по сути, это может зависеть от того, с каким сервисом вы взаимодействуете, но с 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
Этот код работает, но не всегда создает желаемый результат.
То, как стек TCP на iPhone работает, сильно отличается от того, что следует ожидать. С кодом "Доступность" иногда присутствует сетевое соединение, но не будет надежно обнаружено. Однако запуск MobileSafari, а затем повторная попытка проверки соединения с кодом "Reachability" приведет к правильному результату.
То, что я нашел наиболее эффективным в определении сетевого подключения, - это запустить проверку NSURLConnection, когда приложение загружается в отдельном потоке. Вызовите URL-адрес, который, как вы знаете, вернет что-то вроде "Да" (т.е. Файл HTML на вашем сервере или что-то еще). Затем убедитесь, что возвращаемый результат равен статическому тексту. Таким образом, вы знаете, что стек NSURLConnection работает правильно, в отличие от кода "Reachability", который работает не совсем последовательно.
это работает для меня и взят из проекта сейсмического яблока 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;
}
достижимость - это отдельный класс, через который вы можете получить доступ к коду
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:
{
}
}
Как выглядит ваш текущий код подключения? Если вы используете NSURLConnection +sendSynchronousRequest:returningResponse:error:
, вам просто нужно передать адрес переменной NSError и проверить, что после этого; с connectionWithRequest:delegate:
, вы должны реализовать -connection:didFailWithError:
в делегате.
При использовании возможности Apple Reachability помните, что вы можете подключиться через WWAN (ReachableViaWWAN) или Wi-Fi (ReachableViaWiFi), не подключаясь к Интернету, даже когда вы пытаетесь добраться до какого-либо хоста, например google.com или apple.com( возможно, проблема кэширования). Я в конечном итоге назвал свой собственный сервер и вернул цифру - лучшее решение в моем случае по крайней мере.
-(BOOL)returnInternetConnectionStatus{
ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
NetworkStatus internetStatus = [reach currentReachabilityStatus];
if ((internetStatus != NotReachable)) {
return TRUE;
} else {
return FALSE;
}
}