Инженеры Apple предложили полностью полагаться на Rechability.
Из сообщения SO (источник цитаты )
On a WWDC talk this year the Apple engineer on stage recommended users to never base
the application internet access on the Reachability example app status. Often
reachability doesn't provide a complete information (it is based on a complex mechanism)
and the suggestion provided by the engineer was this:
1. try to do your internet connection, whatever it is the Reachability status;
then set your UI hint based on success/fail result
2. if it fails due to networking issue, then register to Reachability and retry again
when Reachability gives the green light; this is needed when you want to recover
automatically from the fail condition
3. in any case give the user the possibility to "force a retry", whatever is the
Reachability status. If it succeeds, reset your UI hint immediately.
Что я сделал ?
Каждый раз, когда мне нужно установить соединение, например
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString
stringWithFormat:@"http://myadress.com"]]];
[self performSelectorOnMainThread:@selector(responseHandler:)
withObject:data waitUntilDone:TRUE];
- (void)responseHandler:(NSData *)responseData {
if(!responseData) {
ReachabilityController *reachability = [[ReachabilityController alloc] init];
[reachability checkReachability];
return;
}
// you handle your data
}
То, что там происходит, достижимость будет проверена только в том случае, если соединение не удалось. Я сделал общий ReachabilityController, который имеет дело только с достижимостью. Я сделал это так, чтобы я мог звонить со всех других контроллеров каждый раз, когда я делаю запрос.
Мой ReachabilityController.m выглядит так
-(void) checkReachability {
Reachability* internetAvailable = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [internetAvailable currentReachabilityStatus];
NSString *messageText;
if (netStatus == NotReachable)
{
messageText = [NSString stringWithFormat:@"Internet access not available"];
}
else
{
Reachability *netReach = [Reachability reachabilityWithHostName:host];
NetworkStatus hostStatus = [netReach currentReachabilityStatus];
if (hostStatus == NotReachable)
{
messageText = [NSString stringWithFormat:@"Host Unreachable"];
}
else
{
messageText = [NSString stringWithFormat:@"Problem with remote service"];
}
}
NSLog(@"%@", messageText);
}
Это не приведет к сбою вашего приложения, поскольку вы сами обрабатываете параметр данных «nil» и, наконец, определяете причину.
надеюсь это поможет!
ОБНОВИТЬ:
Apple может отклонить ваше приложение, если вы покажете ложное сообщение о подключении к Интернету. Они очень серьезно относятся к своей репутации с iphone. Если подключение к Интернету доступно, но ваше приложение сообщает, что подключение к Интернету недоступно, это будет считаться очень серьезным.
person
Kishor Kundan
schedule
02.10.2012