Обработка интернет-аутентификации веб-сайта доступа на iOS
Я пишу приложение для колледжа, которое, вероятно, будет использоваться в кампусе. Wi-Fi колледжа требует учетных данных для доступа в Интернет через веб-страницу (например, точки доступа AT&T). Я хотел бы, чтобы мое приложение обнаружило, подключено ли оно к Интернету или нет. В прошлом я видел, как другие приложения перенаправляли в Safari, чтобы пользователь мог пройти аутентификацию и затем вернуться к приложению. Кто-нибудь знает, как обнаружить такого рода вещи, не пытаясь просто захватить NSData из соединения (например, google.com), а затем предположить, что если данные не получены, это проблема?
3 ответа
iOS автоматически открывает веб-представление, когда вы пытаетесь подключиться к сети, имеющей портал авторизации. Чтобы убедиться, что вы подключены и аутентифицированы в вашем приложении, вы должны установить UIRequiresPersistentWiFi
в вашем Info.plist
,
РЕДАКТИРОВАТЬ: Мой ответ выше только для приложений, которые требуют подключения к интернету. Если вы просто проверяете, подключены ли вы и прошли ли аутентификацию, я считаю, что вам просто нужно использовать Reachability
и проверьте, что вы ReachableViaWiFi
, (Я верю SystemConfiguration
не скажет, что вы доступны через Wi-Fi, если вы не прошли проверку подлинности.)
Если вы хотите обрабатывать аутентификацию в автономной сети в своем приложении, а не в веб-представлении iOS по умолчанию, вы можете использовать API-интерфейс CaptiveNetwork.
Так как вы не хотите использовать способ NSData (я не люблю захватывать NSData, а также использовать достижимость) Вот что я придумал, это более легкий способ, поскольку он просто проверяет ответ HEAD:):
- (BOOL)connectedToInternet
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString:@"http://www.google.com/"]];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request
returningResponse:&response error: NULL];
return ([response statusCode] == 200) ? YES : NO;
}
- (void)yourMethod
{
if([self connectedToInternet] == NO)
{
// Not connected to the internet
}
else
{
// Connected to the internet
}
}
Если вы не хотите использовать Reachability, вы можете инициировать NSURLConnection на случайный веб-сайт, находясь в кампусе Wi-Fi, и проверить наличие проблем с аутентификацией.
Настройте NSURLConnection
:
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData to hold the received data.
// receivedData is an instance variable declared elsewhere.
receivedData = [[NSMutableData data] retain];
} else {
// Inform the user that the connection failed.
}
Реализуйте метод делегата auth challange:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
NSLog(@"I'm being challenged.");
}
Тогда делай что хочешь после испытания.
Не обращая внимания на Reachability, если вы попытаетесь использовать его для доступа к хосту, и для него будет выдан вызов авторизации, он может вернуть отсутствие соединения, поскольку он не смог достичь указанного хоста. Опять же, не уверен на 100%, верно ли это утверждение.